Al igual que muchos contenedores físicos pueden remontarse a una única especificación, es posible crear el número de contenedores Docker que se quiera a partir de una sola imagen. De esta manera, los contenedores Docker sientan las bases para servicios escalables y los entornos de aplicación reproducibles. Podemos crear un Container desde una Image así como guardar Containers existentes en una nueva Image. Dentro del contenedor se inician, pausan y concluyen los procesos.
Un Docker Container, a diferencia de lo que ocurre con la virtualización mediante máquinas virtuales (VM), no contiene un sistema operativo propio (OS, por sus siglas en inglés). En cambio, todos los contenedores que se ejecutan en un mismo host de Docker se remiten al mismo núcleo del sistema operativo. Al utilizar Docker en un host de Linux, se utilizará el núcleo de Linux correspondiente, pero si el software de Docker no funciona con un sistema Linux, se utiliza una reproducción mínima del sistema Linux mediante hipervisor o máquina virtual.
En la ejecución, se asigna a cada contenedor una cierta cantidad de recursos del sistema, entre los que se encuentran la memoria de trabajo, los núcleos de la CPU, la memoria de gran capacidad y los dispositivos de red (virtuales). Técnicamente, se limita el acceso de un Docker Container a los recursos del sistema mediante los llamados cgroups (Control Groups). Para crear particiones de los recursos del núcleo y para limitar los procesos entre sí se utilizan los llamados namespaces del núcleo.
Los contenedores de Docker se comunican con el exterior a través de la red. Para ello, se habilitan los puertos en los que escuchan determinados servicios, que suelen ser servidores web o de bases de datos. Los propios contenedores se controlan en el respectivo host de Docker a través de la API de Docker. Los contenedores, entre otras cosas, pueden iniciarse, detenerse y eliminarse. El cliente de Docker proporciona una interfaz de línea de comandos (Command Line Interface, CLI) con los comandos correspondientes.