Die quell­of­fe­ne Software Docker hat sich als Standard für die Vir­tua­li­sie­rung von An­wen­dungs­con­tai­nern durch­ge­setzt. Die Container-Vir­tua­li­sie­rung führte die Ent­wick­lung der vir­tu­el­len Maschinen mit einem wichtigen Un­ter­schied fort: anstatt ein kom­plet­tes Be­triebs­sys­tem zu si­mu­lie­ren, wird eine einzelne Anwendung in einem Container vir­tua­li­siert.

Docker wird auf dem lokalen System über eine Kom­man­do­zei­len-Schnitt­stel­le gesteuert. Die dabei zum Einsatz kommenden Befehle sind es­sen­zi­ell für die Arbeit mit Docker. Wir erklären, wie Docker-Befehle funk­tio­nie­ren und stellen die wich­tigs­ten Befehle vor.

Was sind Docker-Befehle?

Um besser nach­zu­voll­zie­hen, was Docker-Befehle sind und wie sie funk­tio­nie­ren, erläutern wir kurz den Aufbau von Docker. Die Docker-In­stal­la­ti­on auf einem lokalen Host enthält als Kernstück die Docker-Engine. Die Docker-Engine besteht aus drei haupt­säch­li­chen Kom­po­nen­ten:

  1. Der Docker-Daemon, welcher als dockerd auf dem Host läuft.
  2. Die Docker-API, welche vom Docker-Daemon be­reit­ge­stellt wird. Der Docker-Daemon wird über die API an­ge­spro­chen und gesteuert.
  3. Die Kom­man­do­zei­len-Schnitt­stel­le („Command line interface“, CLI), welche als docker-Befehl ein­ge­setzt wird, um mit der Docker-API zu kom­mu­ni­zie­ren.

Um Docker zu steuern, gibt man als Nutzer Docker-Befehle auf der Kom­man­do­zei­le ein. Die Befehle werden von der Docker-CLI ent­ge­gen­ge­nom­men und ver­ar­bei­tet. Aus den Befehlen werden ent­spre­chen­de API-Calls an den Docker-Daemon erzeugt, welcher die ei­gent­li­che Arbeit leistet.

Tipp

Zum Verstehen der Docker-Befehle ist es am besten, selbst mit der Software zu spielen. Nutzen Sie unser Docker-Tutorial, um dich wich­tigs­ten Konzepte zu erlernen.

Wie sind Docker-Befehle aufgebaut?

Bedingt durch die his­to­ri­sche Ent­wick­lung von Docker haben sich zwei Arten von Docker-Befehlen etabliert.

Zum einen gibt es eine Handvoll von Stan­da­lo­ne-Befehlen. Diese sind für ge­wöhn­lich Verben und führen beim Aufruf eine bestimmte Aktion aus. Bekannte Beispiele sind 'docker pull' oder 'docker build'. Mit dem Wachstum der Plattform und dem Er­schei­nen immer neuer Funk­tio­na­li­tä­ten, wurde es zunehmend schwierig, passende Verben zu finden.

Zum anderen wurden die so­ge­nann­ten „Docker Ma­nage­ment-Befehle“ zur Grup­pie­rung von Befehlen ein­ge­führt, um wieder Ordnung in die aus­ufern­de Befehls-Vielfalt zu bringen. Bei den Docker Ma­nage­ment-Befehlen handelt es sich für ge­wöhn­lich um Sub­stan­ti­ve. Bekannte Beispiele sind 'docker image' und 'docker con­tai­ner'. Die Docker Ma­nage­ment-Befehle grup­pie­ren Un­ter­be­feh­le, welche wiederum Verben sind.

Auf diese Weise lassen sich dieselben Verben in un­ter­schied­li­chen Kontexten nutzen, ohne dass es zu Kol­li­sio­nen der Namen käme. Bei­spiels­wei­se gibt es den Befehl 'docker image rm' zum Entfernen eines Images, sowie 'docker container rm', zum Entfernen eines Con­tai­ners.

Un­ab­hän­gig davon, ob Docker Stan­da­lo­ne-Befehle oder Docker Ma­nage­ment-Befehle zum Einsatz kommen, erfolgt der Aufruf der Docker-Befehle auf der Kom­man­do­zei­le. Wie üblich wird der Name des Befehls gefolgt von op­tio­na­len Pa­ra­me­tern ein­ge­ge­ben. Ggf. folgt dann noch der Name eines oder mehrerer Objekte. Dabei kann es sich um einen Container, ein Image, ein Volumen oder ähnliches handeln.

Schauen wir uns die all­ge­mei­ne Struktur eines Docker-Befehls auf der Kom­man­do­zei­le an. Im ein­fachs­ten Fall wird nur das Docker-CLI mit einer an­ge­häng­ten Option auf­ge­ru­fen:

docker [--options]

Bekannte Beispiele sind die Ausgabe der Docker-Version bzw. der Docker-Hilfs­in­for­ma­ti­on:

# Docker-Version ausgeben
docker --version
# Docker-Hilfe anzeigen
docker --help
Tipp

Hängen Sie die '--help'-Option an einen Docker-Un­ter­be­fehl an, um die Hilfs­in­for­ma­ti­on des Befehls aus­zu­ge­ben.

In den meisten Fällen rufen wir nicht bloß das Docker-CLI auf, sondern übergeben zu­sätz­li­chen den Namen eines spe­zi­fi­schen Befehls. Dabei kann es sich um einen Stan­da­lo­ne-Befehl oder einen Ma­nage­ment-Befehl gefolgt von einem Un­ter­be­fehl handeln. Schauen wir uns zunächst das generelle Muster eines Docker Stan­da­lo­ne-Befehls an. Auf den Namen 'docker' folgt der Name des Befehls, optionale Parameter, sowie ggf. der Name eines Docker-Objekts:

docker <command> [--options] <object>

Zwei bekannte Docker Stan­da­lo­ne-Befehle aus dem Pro­duk­tiv­ein­satz dienen dem Anzeigen ver­schie­de­ner Sta­tus­in­for­ma­tio­nen:

# Docker-Information anzeigen
docker info
# Docker-Images auf dem Host anzeigen
docker images

Machen wir uns als nächstes mit den Docker Ma­nage­ment-Befehlen vertraut. Wie bereits erwähnt, dienen diese dazu, Ordnung in das organisch ge­wach­se­ne Befehls-Chaos zu bringen. So gab es ur­sprüng­lich den Befehl 'docker ls' zum Auflisten der Container auf einem Host und analog dazu den Befehl 'docker images' zum Auflisten der Images. Nicht gerade intuitiv. Auch wenn sich beide Befehle weiterhin nutzen lassen, gibt es heut­zu­ta­ge mit 'docker container ls' und 'docker image ls' kon­sis­ten­te Al­ter­na­ti­ven.

Das generelle Schema für Docker Ma­nage­ment-Befehle beruht auf der bekannten Struktur der Docker Stan­da­lo­ne-Befehle. Auf den Namen ‚docker‘ folgt der Name des Ma­nage­ment-Befehls samt Un­ter­be­fehl. Wir schließen wiederum mit op­tio­na­len Pa­ra­me­tern, sowie ggf. dem Namen eines Docker-Objekts ab:

docker <management-command> <subcommand> [--options] <object>

Ver­an­schau­li­chen wir uns das Muster an einem konkreten Beispiel. Hier der Docker-Befehl zum Starten eines neuen Con­tai­ners aus dem ‚httpd‘-Image im in­ter­ak­ti­ven Modus:

docker container run -it httpd

Ver­glei­chen wir die generelle Struktur für Docker Ma­nage­ment-Befehle mit den einzelnen Be­stand­tei­len des vor­an­ge­gan­ge­nen Beispiels:

  Docker-CLI Docker-Befehl Optionen Objekt
Struktur docker <command> <sub­com­mand> [--options] <object>
Beispiel docker container run -it httpd
Details Ruft Docker auf und übergibt weitere Befehle und Optionen. Be­fehls­na­men müssen exakt so ge­schrie­ben werden, wie in der Do­ku­men­ta­ti­on vermerkt. Optionen werden an den Befehl übergeben und steuern, wie dieser sich verhält. Für Optionen gibt es zwei Schreib­wei­sen, siehe unten. Platz­hal­ter für ein Objekt als Ziel der Operation. Handelt es sich um Docker-Objekte, wie Container und Images, kommt als ID der Name bzw. der Hash des Objekts zum Einsatz.

Welche Optionen nehmen Docker-Befehle entgegen?

Wie die meisten Kom­man­do­zei­len-Befehle werden Docker-Befehle beim Aufruf über optionale Parameter, sog. „Optionen“ gesteuert. Die Optionen folgen dem Namen des Befehls. Dabei wird zwischen Groß- und Klein­schrei­bung un­ter­schie­den. Für ge­wöhn­lich gibt es für die meisten Optionen zwei Schreib­wei­sen:

  1. Kurzform: -<Options-Kürzel>, z.B. 'docker -v'

Die Kurzform ist wenig aus­sa­ge­kräf­tig. Dafür lassen sich mehrere Optionen zu einer kom­bi­nie­ren, z.B. 'docker run -it' anstatt 'docker -i -t'. Die Rei­hen­fol­ge ist beim Zu­sam­men­fas­sen beliebig; man kann also ohne Probleme auch 'docker run -ti' schreiben. Gut geeignet ist die Kurzform für das schnelle Arbeiten mit bekannten Befehlen auf der Kom­man­do­zei­le.

  1. Langform: --<Options-Name>, z.B. 'docker --version'

Die Langform ist leicht ver­ständ­lich, benötigt jedoch mehr Zeit zu tippen und nimmt mehr Platz ein. Gut geeignet ist die Langform für das Erstellen von Scripten; die aus­sa­ge­kräf­ti­gen Options-Namen dienen der Do­ku­men­ta­ti­on.

Wie hängen Do­cker­file, Docker-Image und Docker-Container zusammen?

Ein Großteil der exis­tie­ren­den Docker-Befehle dient dem Verwalten von Docker Con­tai­nern, Docker Images und Docker Volumes. Bevor wir uns im Detail mit den spe­zi­fi­schen Docker-Befehlen befassen, geben wir einen kurzen Überblick, wie die wichtigen Docker-Konzepte Container und Image zu­sam­men­hän­gen.

Ein Docker-Container wird aus einer un­ver­än­der­li­chen Vorlage, dem sog. Image, erzeugt. Ein Docker-Image enthält die zur Erzeugung eines Con­tai­ners not­wen­di­gen Ab­hän­gig­kei­ten und Kon­fi­gu­ra­ti­ons­ein­stel­lun­gen. Wir können nicht nur einen Container aus einem Image erzeugen, sondern auch einen exis­tie­ren­den Container in einem neuen Image ab­spei­chern. Container und Image stehen in etwa so zu­ein­an­der, wie Henne und Ei:

Docker-Befehl Bedeutung Henne-Ei-Analogie
docker build Docker-Image aus Do­cker­file erzeugen Ei mit Erb­infor­ma­ti­on versehen
docker run <image> Docker-Container aus Image starten Küken schlüpft aus Ei
docker commit <container> Docker-Image aus Container erzeugen Henne legt neues Ei

Die wich­tigs­ten Docker-Befehle in der Übersicht

Docker hat über die ver­gan­ge­nen zehn Jahre eine rasante Ent­wick­lung durch­ge­macht. Neben der ur­sprüng­li­chen Container-Vir­tua­li­sie­rung umfasst Docker heut­zu­ta­ge weit darüber hin­aus­ge­hen­de Funk­tio­nen. So lassen sich mit Docker-Compose und Docker-Swarm Container-Verbünden or­ches­trie­ren, was tra­di­tio­nell Docker-Al­ter­na­ti­ven vor­be­hal­ten war. Wir gehen im Folgenden auf eine Un­ter­men­ge der ori­gi­na­len Befehle ein, da eine voll­stän­di­ge Auf­lis­tung den Rahmen dieses Artikel sprengen würde.

Ein Docker-Container umfasst die folgenden Kom­po­nen­ten. Zur Steuerung stehen ent­spre­chen­de Befehle zur Verfügung:

  1. Container-Be­triebs­sys­tem und Union-Da­tei­sys­tem
  2. Software-Kom­po­nen­ten und Kon­fi­gu­ra­ti­on
  3. Um­ge­bungs­va­ria­blen und Laufzeit-Kon­fi­gu­ra­ti­on
  4. Ports und Volumen
  5. Prozesse und Logs

Welche Docker Stan­da­lo­ne-Befehle gibt es?

Vorweg: die meisten Docker-Funk­tio­na­li­tä­ten lassen sich heut­zu­ta­ge mit Docker Ma­nage­ment-Befehlen steuern. Auch wenn die ur­sprüng­li­chen Befehle weiterhin funk­tio­nie­ren, gibt es aus­sa­ge­kräf­ti­ge­re Äqui­va­len­te:

Docker Stan­da­lo­ne-Befehl Äqui­va­len­ter Docker Ma­nage­ment-Befehl Erklärung
docker ps docker container ls Die auf dem Host laufenden Container anzeigen
docker images docker image ls Die auf dem Host ver­füg­ba­ren Images anzeigen
docker inspect <object> docker <object-type> inspect <object>, z.B. docker image inspect <image> In­for­ma­tio­nen zu Docker-Objekten wie Images, Con­tai­ners, Volumes, etc. anzeigen

Es gibt jedoch immer noch eine Handvoll von Docker Stan­da­lo­ne-Befehlen. Diese lassen sich nicht durch Docker Ma­nage­ment-Befehle ersetzen, da sie sich auf die Docker-In­stal­la­ti­on als Ganzes beziehen:

Docker Stan­da­lo­ne-Befehl Erklärung
docker --help Hilfe für die Docker-CLI anzeigen
docker --version Die Version der Docker-In­stal­la­ti­on anzeigen
docker info Sys­tem­wei­te In­for­ma­tio­nen über die Docker-In­stal­la­ti­on anzeigen
docker login Bei einer Container-Registry oder einem Cloud-Backend anmelden
docker logout Von Container-Registry oder Cloud-Backend abmelden

Welche Docker Container-Befehle gibt es?

Anders als bei der Vir­tua­li­sie­rung mit vir­tu­el­len Maschinen, enthält ein Docker-Container kein eigenes Be­triebs­sys­tem. Statt­des­sen greifen alle auf einem Docker-Host laufenden Container auf denselben Be­triebs­sys­tem-Kernel zu. Jedem Container wird bei der Aus­füh­rung per Befehl eine gewisse Menge an System-Res­sour­cen zu­ge­wie­sen. Dazu gehören Ar­beits­spei­cher, CPU-Kerne, Mas­sen­spei­cher und (virtuelle) Netzwerk-Geräte. Hier zwei Beispiele:

Docker-Container beim Start einen CPU-Kern und 10 Megabyte Speicher zuweisen:

docker container run --cpus="1" --memory="10m" <image>

TCP-Port 80 des Docker-Hosts auf Port 80 des Docker-Con­tai­ners mappen:

docker container run -p 80:80/tcp <image>

Auf einem Host lassen sich Container starten, stoppen und entfernen. Ferner lassen sich die innerhalb eines Con­tai­ners laufenden Prozesse steuern. Dem­entspre­chend befassen sich viele der Docker Container-Befehle mit diesen Aufgaben:

Docker Container-Befehl Erklärung
docker container ls Die auf dem Host laufenden Container anzeigen
docker container stats Sta­tus­in­for­ma­tio­nen der laufenden Container anzeigen
docker container run <image> Einen neuen Container aus dem an­ge­ge­be­nen Image starten, bzw. einen Befehl in einem neuen Container ausführen
docker container commit <container> Ein neues Image aus den Än­de­run­gen eines laufenden Con­tai­ners erzeugen
docker container attach <container> Einen laufenden Container mit lokalen Standard-Eingabe, -Ausgabe, und -Fehler Strömen versehen
docker container logs <container> Log-In­for­ma­tio­nen eines Con­tai­ners anzeigen
docker container inspect <container> De­tail­lier­te In­for­ma­tio­nen eines Con­tai­ners anzeigen
docker container update <container> Die Kon­fi­gu­ra­ti­on eines Con­tai­ners erneuern
docker container rename <container> <new-name> Einem Container einen neuen Namen geben
docker container port <container> Port-Zu­wei­sun­gen eines Con­tai­ners anzeigen
docker container pause <container> Die in einem Container laufenden Prozesse pausieren
docker container unpause <container> Die Aus­füh­rung der pau­sier­ten Prozesse in einem Container wieder aufnehmen
docker container exec <container> <command> Einen Befehl innerhalb eines laufenden Con­tai­ners ausführen
docker container stop <container> Die Aus­füh­rung eines Con­tai­ners stoppen
docker container start <container> Die Aus­füh­rung eines ge­stopp­ten Con­tai­ners wieder aufnehmen
docker container restart <container> Einen Container neu starten; verhält sich wie docker container stop <container>; docker container start <container>
docker container top <container> Die innerhalb eines Con­tai­ners laufenden Prozesse auflisten
docker container kill <container> Einen laufenden Container ab­schie­ßen
docker container rm <container> Einen Container aus dem System entfernen
docker container prune Alle ge­stopp­ten Container vom System entfernen
docker container cp <container>:<source-path> <dest-path> Dateien und Ordner zwischen einem Container und dem lokalen Da­tei­sys­tem kopieren.
docker container diff <container> Die Än­de­run­gen am Da­tei­sys­tem eines Con­tai­ners anzeigen
docker container export <container> Das Da­tei­sys­tem eines Con­tai­ners als Tarball-Archiv ausgeben; sämtliche Layer werden dabei auf einen reduziert

Welche Docker Image-Befehle gibt es?

Anders als bei Images vir­tu­el­ler Maschinen der Fall, ist ein Docker-Image im Nor­mal­zu­stand keine einzelne Datei. Statt­des­sen handelt es sich um einen Verbund mehrerer Kom­po­nen­ten:

  • Image-Layers: enthalten durch Operation auf dem Da­tei­sys­tem hin­zu­ge­füg­te Daten. Layers werden über­la­gert und durch ein Union-Da­tei­sys­tem auf eine kon­sis­ten­te Ebene reduziert.
  • Parent-Image: stellt Grund­funk­tio­nen des Images bereit und verankert das Image im Stammbaum des Docker-Öko­sys­tems.
  • Image-Manifest: be­schreibt den Verbund und iden­ti­fi­ziert die darin ent­hal­te­nen Image-Layers.

Ein Docker-Image enthält schreib­ge­schütz­te Schichten, auf Englisch „Layers“ genannt. Jeder Layer be­schreibt suk­zes­si­ve Än­de­run­gen am Da­tei­sys­tem des Images. Für jede Operation, welche zu einer Änderung am Da­tei­sys­tem des Images führen würde, wird ein neuer Layer angelegt. Die folgenden Befehle dienen zum In­ter­agie­ren mit Images auf dem Host:

Docker Image-Befehl Erklärung
docker image build Ein Docker-Image aus einem Do­cker­file erzeugen
docker image history <image> Die zur Erzeugung eines Docker-Image durch­lau­fe­nen Schritte anzeigen
docker image import <tarball> Ein Docker-Image aus einem „Tarball“-Archiv erzeugen
docker image inspect <image> De­tail­lier­te In­for­ma­tio­nen für ein Docker-Image anzeigen
docker image load Mit 'docker image save' erzeugtes Image-Archiv laden
docker image ls Auf dem Docker-Host ver­füg­ba­re Images auflisten
docker image prune Un­ge­nutz­te Docker-Images vom Docker-Host entfernen
docker image pull <image> Docker-Image von Registry beziehen
docker image push <image> Ein Image an eine Registry senden
docker image rm <image> Ein Image vom lokalen Host entfernen
docker image save <image> Image-Archiv mit allen Layers aus einem Image erzeugen
docker image tag <source-image> <target-image> Ein Image mit Tags versehen

Welche Docker Volume-Befehle gibt es?

Ein Docker-Container enthält eine von der Außenwelt isolierte Anwendung. In vielen Fällen ist es jedoch sinnvoll, Dateien zwischen dem Container und dem Host-System zu teilen. Zu diesem Zweck kennt Docker ver­schie­de­ne Typen von Volumes. Die Un­ter­schie­de zwischen den Volume-Typen sind subtil; die Wahl des passenden Typs hängt stark vom je­wei­li­gen Ein­satz­sze­na­rio ab:

  • Benannte Volumes — empfohlen
  • Anonyme Volumes — gehen beim Entfernen des Con­tai­ners verloren
  • Bind Mounts — his­to­risch bedingt und nicht empfohlen; per­for­mant
  • Tmpfs Mounts — liegen im Ar­beits­spei­cher; nur unter Linux

Zur In­ter­ak­ti­on mit Volumes steht eine Handvoll an Docker-Befehlen zur Verfügung:

Docker Volume-Befehl Erklärung
docker volume ls Die auf dem Host be­find­li­chen Volumes anzeigen
docker volume prune Alle nicht genutzten Volumes vom Host entfernen
docker volume create Ein neues Volume auf dem Host erzeugen
docker inspect <volume> De­tail­lier­te In­for­ma­tio­nen eines Volumes anzeigen
docker volume rm <volume> Das an­ge­ge­be­ne Volume vom Host entfernen
Zum Hauptmenü