Anders als ein physischer Container existiert ein Docker-Container im virtuellen Umfeld. Ein physischer Container wird einer standardisierten Spezifikation folgend zusammengebaut. Bei virtuellen Containern finden wir ein ähnliches Muster vor: ein Docker-Container wird aus einer unveränderlichen Vorlage, dem sogenannten Image, erzeugt. Ein Docker-Image enthält die zur Erzeugung eines Containers notwendigen Abhängigkeiten und Konfigurationseinstellungen.
So wie viele physische Container auf eine einzige Spezifikation zurückzuführen sind, lassen sich beliebig viele Docker-Container aus einem Image erzeugen. Damit bilden Docker-Container die Basis für skalierbare Dienste und reproduzierbare Anwendungsumgebungen. Wir können einen Container aus einem Image erzeugen sowie einen existierenden Container in einem neuen Image speichern. Innerhalb des Containers lassen sich Prozesse ausführen, pausieren und beenden.
Anders als bei der Virtualisierung mit virtuellen Maschinen (VM) enthält ein Docker-Container kein eigenes Betriebssystem („Operating System“, OS). Stattdessen greifen alle auf einem Docker-Host laufenden Container auf denselben OS-Kernel zu. Beim Einsatz von Docker auf einem Linux-Host wird der vorhandene Linux-Kernel genutzt. Läuft die Docker-Software auf einem Nicht-Linux-System, kommt ein minimales Linux-Systemabbild via Hypervisor oder virtueller Maschine zum Einsatz.
Jedem Container wird bei der Ausführung eine gewisse Menge an Systemressourcen zugewiesen. Dazu gehören Arbeitsspeicher, CPU-Kerne, Massenspeicher und (virtuelle) Netzwerkgeräte. Technisch wird der Zugriff eines Docker-Container auf Systemressourcen über die sogenannten cgroups („Control Groups“) limitiert. Zum Partitionieren der Kernel-Ressourcen und zur Abgrenzung der Prozesse untereinander kommen sogenannte Kernel-Namespaces zum Einsatz.
Nach außen hin kommunizieren Docker-Container über das Netzwerk. Dafür werden Ports freigeschaltet, auf denen spezifische Dienste lauschen. Oft handelt es sich dabei um Web- oder Datenbankserver. Die Container selbst werden auf dem jeweiligen Docker-Host über die Docker-API gesteuert. Dabei lassen sich Container u. a. starten, stoppen und entfernen. Der Docker-Client stellt ein Kommandozeilen-Interface („Command Line Interface“, CLI) mit den entsprechenden Befehlen bereit.