Create docker container with non-shareable memory and non-shareable cpus

I am using Docker 17.03 -ee version

I have to create a docker container with a variable amount of memory and variable number of cpus dynamically and this hardware should not be shared between the containers.

As an example, let us consider i have

  1. Host with 8GB memory and 4 cores.
  2. Create a docker container (d1) with 3GB memory and 1 cpus
  3. Create a docker container (d2) with 5GB memory and 3 cpus
  4. Create a docker contianer (d3) with 2GB memory and 2 cpus

I have noticed that docker run takes -m flag using which i can set the memory limit and it also has --cpuset-cpus using which i can assign specific cpu cores to my container.

I was able to create d1 and d2 by using the above flags. While creating i observed that i have to take core of core management i.e i have to maintain the assignment of a cores with containers.
Can i just give number of cores and core assignment is taken care automatically ?
After creating d1 and d2, as i have used up all the available memory and cpuset, i should not be allowed to create further containers. But if i try to create a container d4 with memory 3GB i am able to successfully create it.
How can i allocate the memory to that specific container without sharing that memory with other containers ?

Is there any already built solution which takes care of managing memory assigned with a container and cpu-cores assigned with a container ? Or Do i have to maintain this information myself and ensure that i should not create new containers when all the memory or cores are used up ?