Docker-Befehle

Die quelloffene Software Docker hat sich als Standard für die Virtualisierung von Anwendungscontainern durchgesetzt. Die Container-Virtualisierung führte die Entwicklung der virtuellen Maschinen mit einem wichtigen Unterschied fort: anstatt ein komplettes Betriebssystem zu simulieren, wird eine einzelne Anwendung in einem Container virtualisiert.

Docker wird auf dem lokalen System über eine Kommandozeilen-Schnittstelle gesteuert. Die dabei zum Einsatz kommenden Befehle sind essenziell für die Arbeit mit Docker. Wir erklären, wie Docker-Befehle funktionieren und stellen die wichtigsten Befehle vor.

Was sind Docker-Befehle?

Um besser nachzuvollziehen, was Docker-Befehle sind und wie sie funktionieren, erläutern wir kurz den Aufbau von Docker. Die Docker-Installation auf einem lokalen Host enthält als Kernstück die Docker-Engine. Die Docker-Engine besteht aus drei hauptsächlichen Komponenten:

  1. Der Docker-Daemon, welcher als dockerd auf dem Host läuft.
  2. Die Docker-API, welche vom Docker-Daemon bereitgestellt wird. Der Docker-Daemon wird über die API angesprochen und gesteuert.
  3. Die Kommandozeilen-Schnittstelle („Command line interface“, CLI), welche als docker-Befehl eingesetzt wird, um mit der Docker-API zu kommunizieren.

Um Docker zu steuern, gibt man als Nutzer Docker-Befehle auf der Kommandozeile ein. Die Befehle werden von der Docker-CLI entgegengenommen und verarbeitet. Aus den Befehlen werden entsprechende API-Calls an den Docker-Daemon erzeugt, welcher die eigentliche 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 wichtigsten Konzepte zu erlernen.

Wie sind Docker-Befehle aufgebaut?

Bedingt durch die historische Entwicklung von Docker haben sich zwei Arten von Docker-Befehlen etabliert.

Zum einen gibt es eine Handvoll von Standalone-Befehlen. Diese sind für gewöhnlich 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 Erscheinen immer neuer Funktionalitäten, wurde es zunehmend schwierig, passende Verben zu finden.

Zum anderen wurden die sogenannten „Docker Management-Befehle“ zur Gruppierung von Befehlen eingeführt, um wieder Ordnung in die ausufernde Befehls-Vielfalt zu bringen. Bei den Docker Management-Befehlen handelt es sich für gewöhnlich um Substantive. Bekannte Beispiele sind 'docker image' und 'docker container'. Die Docker Management-Befehle gruppieren Unterbefehle, welche wiederum Verben sind.

Auf diese Weise lassen sich dieselben Verben in unterschiedlichen Kontexten nutzen, ohne dass es zu Kollisionen der Namen käme. Beispielsweise gibt es den Befehl 'docker image rm' zum Entfernen eines Images, sowie 'docker container rm', zum Entfernen eines Containers.

Unabhängig davon, ob Docker Standalone-Befehle oder Docker Management-Befehle zum Einsatz kommen, erfolgt der Aufruf der Docker-Befehle auf der Kommandozeile. Wie üblich wird der Name des Befehls gefolgt von optionalen Parametern eingegeben. 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 allgemeine Struktur eines Docker-Befehls auf der Kommandozeile an. Im einfachsten Fall wird nur das Docker-CLI mit einer angehängten Option aufgerufen:

docker [--options]

Bekannte Beispiele sind die Ausgabe der Docker-Version bzw. der Docker-Hilfsinformation:

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

Hängen Sie die '--help'-Option an einen Docker-Unterbefehl an, um die Hilfsinformation des Befehls auszugeben.

In den meisten Fällen rufen wir nicht bloß das Docker-CLI auf, sondern übergeben zusätzlichen den Namen eines spezifischen Befehls. Dabei kann es sich um einen Standalone-Befehl oder einen Management-Befehl gefolgt von einem Unterbefehl handeln. Schauen wir uns zunächst das generelle Muster eines Docker Standalone-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 Standalone-Befehle aus dem Produktiveinsatz dienen dem Anzeigen verschiedener Statusinformationen:

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

Machen wir uns als nächstes mit den Docker Management-Befehlen vertraut. Wie bereits erwähnt, dienen diese dazu, Ordnung in das organisch gewachsene Befehls-Chaos zu bringen. So gab es ursprünglich 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 heutzutage mit 'docker container ls' und 'docker image ls' konsistente Alternativen.

Das generelle Schema für Docker Management-Befehle beruht auf der bekannten Struktur der Docker Standalone-Befehle. Auf den Namen ‚docker‘ folgt der Name des Management-Befehls samt Unterbefehl. Wir schließen wiederum mit optionalen Parametern, sowie ggf. dem Namen eines Docker-Objekts ab:

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

Veranschaulichen wir uns das Muster an einem konkreten Beispiel. Hier der Docker-Befehl zum Starten eines neuen Containers aus dem ‚httpd‘-Image im interaktiven Modus:

docker container run -it httpd

Vergleichen wir die generelle Struktur für Docker Management-Befehle mit den einzelnen Bestandteilen des vorangegangenen Beispiels:

Docker-CLI

Docker-Befehl

Optionen

Objekt

Struktur

docker

<command> <subcommand>

[--options]

<object>

Beispiel

docker

container run

-it

httpd

Details

Ruft Docker auf und übergibt weitere Befehle und Optionen.

Befehlsnamen müssen exakt so geschrieben werden, wie in der Dokumentation vermerkt.

Optionen werden an den Befehl übergeben und steuern, wie dieser sich verhält. Für Optionen gibt es zwei Schreibweisen, siehe unten.

Platzhalter 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 Kommandozeilen-Befehle werden Docker-Befehle beim Aufruf über optionale Parameter, sog. „Optionen“ gesteuert. Die Optionen folgen dem Namen des Befehls. Dabei wird zwischen Groß- und Kleinschreibung unterschieden. Für gewöhnlich gibt es für die meisten Optionen zwei Schreibweisen:

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

Die Kurzform ist wenig aussagekräftig. Dafür lassen sich mehrere Optionen zu einer kombinieren, z.B. 'docker run -it' anstatt 'docker -i -t'. Die Reihenfolge ist beim Zusammenfassen 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 Kommandozeile.

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

Die Langform ist leicht verständlich, benötigt jedoch mehr Zeit zu tippen und nimmt mehr Platz ein. Gut geeignet ist die Langform für das Erstellen von Scripten; die aussagekräftigen Options-Namen dienen der Dokumentation.

Wie hängen Dockerfile, Docker-Image und Docker-Container zusammen?

Ein Großteil der existierenden Docker-Befehle dient dem Verwalten von Docker Containern, Docker Images und Docker Volumes. Bevor wir uns im Detail mit den spezifischen Docker-Befehlen befassen, geben wir einen kurzen Überblick, wie die wichtigen Docker-Konzepte Container und Image zusammenhängen.

Ein Docker-Container wird aus einer unveränderlichen Vorlage, dem sog. Image, erzeugt. Ein Docker-Image enthält die zur Erzeugung eines Containers notwendigen Abhängigkeiten und Konfigurationseinstellungen. Wir können nicht nur einen Container aus einem Image erzeugen, sondern auch einen existierenden Container in einem neuen Image abspeichern. Container und Image stehen in etwa so zueinander, wie Henne und Ei:

Docker-Befehl

Bedeutung

Henne-Ei-Analogie

docker build

Docker-Image aus Dockerfile erzeugen

Ei mit Erbinformation 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 wichtigsten Docker-Befehle in der Übersicht

Docker hat über die vergangenen zehn Jahre eine rasante Entwicklung durchgemacht. Neben der ursprünglichen Container-Virtualisierung umfasst Docker heutzutage weit darüber hinausgehende Funktionen. So lassen sich mit Docker-Compose und Docker-Swarm Container-Verbünden orchestrieren, was traditionell Docker-Alternativen vorbehalten war. Wir gehen im Folgenden auf eine Untermenge der originalen Befehle ein, da eine vollständige Auflistung den Rahmen dieses Artikel sprengen würde.

Ein Docker-Container umfasst die folgenden Komponenten. Zur Steuerung stehen entsprechende Befehle zur Verfügung:

  1. Container-Betriebssystem und Union-Dateisystem
  2. Software-Komponenten und Konfiguration
  3. Umgebungsvariablen und Laufzeit-Konfiguration
  4. Ports und Volumen
  5. Prozesse und Logs

Welche Docker Standalone-Befehle gibt es?

Vorweg: die meisten Docker-Funktionalitäten lassen sich heutzutage mit Docker Management-Befehlen steuern. Auch wenn die ursprünglichen Befehle weiterhin funktionieren, gibt es aussagekräftigere Äquivalente:

Docker Standalone-Befehl

Äquivalenter Docker Management-Befehl

Erklärung

docker ps

docker container ls

Die auf dem Host laufenden Container anzeigen

docker images

docker image ls

Die auf dem Host verfügbaren Images anzeigen

docker inspect <object>

docker <object-type> inspect <object>, z.B. docker image inspect <image>

Informationen zu Docker-Objekten wie Images, Containers, Volumes, etc. anzeigen

Es gibt jedoch immer noch eine Handvoll von Docker Standalone-Befehlen. Diese lassen sich nicht durch Docker Management-Befehle ersetzen, da sie sich auf die Docker-Installation als Ganzes beziehen:

Docker Standalone-Befehl

Erklärung

docker --help

Hilfe für die Docker-CLI anzeigen

docker --version

Die Version der Docker-Installation anzeigen

docker info

Systemweite Informationen über die Docker-Installation 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 Virtualisierung mit virtuellen Maschinen, enthält ein Docker-Container kein eigenes Betriebssystem. Stattdessen greifen alle auf einem Docker-Host laufenden Container auf denselben Betriebssystem-Kernel zu. Jedem Container wird bei der Ausführung per Befehl eine gewisse Menge an System-Ressourcen zugewiesen. Dazu gehören Arbeitsspeicher, CPU-Kerne, Massenspeicher 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-Containers 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 Containers laufenden Prozesse steuern. Dementsprechend 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

Statusinformationen der laufenden Container anzeigen

docker container run <image>

Einen neuen Container aus dem angegebenen Image starten, bzw. einen Befehl in einem neuen Container ausführen

docker container commit <container>

Ein neues Image aus den Änderungen eines laufenden Containers erzeugen

docker container attach <container>

Einen laufenden Container mit lokalen Standard-Eingabe, -Ausgabe, und -Fehler Strömen versehen

docker container logs <container>

Log-Informationen eines Containers anzeigen

docker container inspect <container>

Detaillierte Informationen eines Containers anzeigen

docker container update <container>

Die Konfiguration eines Containers erneuern

docker container rename <container> <new-name>

Einem Container einen neuen Namen geben

docker container port <container>

Port-Zuweisungen eines Containers anzeigen

docker container pause <container>

Die in einem Container laufenden Prozesse pausieren

docker container unpause <container>

Die Ausführung der pausierten Prozesse in einem Container wieder aufnehmen

docker container exec <container> <command>

Einen Befehl innerhalb eines laufenden Containers ausführen

docker container stop <container>

Die Ausführung eines Containers stoppen

docker container start <container>

Die Ausführung eines gestoppten Containers 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 Containers laufenden Prozesse auflisten

docker container kill <container>

Einen laufenden Container abschießen

docker container rm <container>

Einen Container aus dem System entfernen

docker container prune

Alle gestoppten Container vom System entfernen

docker container cp <container>:<source-path> <dest-path>

Dateien und Ordner zwischen einem Container und dem lokalen Dateisystem kopieren.

docker container diff <container>

Die Änderungen am Dateisystem eines Containers anzeigen

docker container export <container>

Das Dateisystem eines Containers als Tarball-Archiv ausgeben; sämtliche Layer werden dabei auf einen reduziert

Welche Docker Image-Befehle gibt es?

Anders als bei Images virtueller Maschinen der Fall, ist ein Docker-Image im Normalzustand keine einzelne Datei. Stattdessen handelt es sich um einen Verbund mehrerer Komponenten:

  • Image-Layers: enthalten durch Operation auf dem Dateisystem hinzugefügte Daten. Layers werden überlagert und durch ein Union-Dateisystem auf eine konsistente Ebene reduziert.
  • Parent-Image: stellt Grundfunktionen des Images bereit und verankert das Image im Stammbaum des Docker-Ökosystems.
  • Image-Manifest: beschreibt den Verbund und identifiziert die darin enthaltenen Image-Layers.

Ein Docker-Image enthält schreibgeschützte Schichten, auf Englisch „Layers“ genannt. Jeder Layer beschreibt sukzessive Änderungen am Dateisystem des Images. Für jede Operation, welche zu einer Änderung am Dateisystem des Images führen würde, wird ein neuer Layer angelegt. Die folgenden Befehle dienen zum Interagieren mit Images auf dem Host:

Docker Image-Befehl

Erklärung

docker image build

Ein Docker-Image aus einem Dockerfile erzeugen

docker image history <image>

Die zur Erzeugung eines Docker-Image durchlaufenen Schritte anzeigen

docker image import <tarball>

Ein Docker-Image aus einem „Tarball“-Archiv erzeugen

docker image inspect <image>

Detaillierte Informationen für ein Docker-Image anzeigen

docker image load

Mit 'docker image save' erzeugtes Image-Archiv laden

docker image ls

Auf dem Docker-Host verfügbare Images auflisten

docker image prune

Ungenutzte 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 verschiedene Typen von Volumes. Die Unterschiede zwischen den Volume-Typen sind subtil; die Wahl des passenden Typs hängt stark vom jeweiligen Einsatzszenario ab:

  • Benannte Volumes — empfohlen
  • Anonyme Volumes — gehen beim Entfernen des Containers verloren
  • Bind Mounts — historisch bedingt und nicht empfohlen; performant
  • Tmpfs Mounts — liegen im Arbeitsspeicher; nur unter Linux

Zur Interaktion mit Volumes steht eine Handvoll an Docker-Befehlen zur Verfügung:

Docker Volume-Befehl

Erklärung

docker volume ls

Die auf dem Host befindlichen 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>

Detaillierte Informationen eines Volumes anzeigen

docker volume rm <volume>

Das angegebene Volume vom Host entfernen