Docker-Tutorial: Einführung zur beliebten Container-Plattform

In unserem Docker-Tutorial erklären wir die Virtualisierungsplattform Docker und zeigen Ihnen anhand von leicht nachvollziehbaren Anleitungen, wie Sie Docker auf Ihrem Ubuntu 22.04 System nutzen können.

Free VPS Trial von IONOS

Jetzt vServer kostenlos testen - Probieren Sie Ihren Virtual Server 30 Tage lang aus!

Dedizierte Ressourcen
Unlimited Traffic
Persönlicher Berater

Docker: Aufbau und Funktionen

„Build, Ship and Run Any App, Anywhere“ – unter diesem Motto bewirbt die quelloffene Container-Plattform Docker eine flexible, ressourcensparende Alternative zur Emulation von Hardware-Komponenten auf Basis virtueller Maschinen (VMs). Während die klassische Hardware-Virtualisierung darauf beruht, mehrere Gastsysteme auf einem gemeinsamen Host-System zu starten, werden Anwendungen bei Docker mithilfe von Containern als isolierte Prozesse auf ein und demselben System ausgeführt. Man spricht bei der containerbasierten Server-Virtualisierung daher auch von einer Operating-System-Level-Virtualisierung.

Virtuelle Maschinen und Docker-Container im Vergleich
Während jede virtuelle Maschine ein eigenes Betriebssystem startet, teilen sich Docker-Container den Kernel des Host-Systems

Der große Vorteil containerbasierter Virtualisierung liegt somit darin, dass sich Anwendungen mit unterschiedlichen Anforderungen isoliert voneinander ausführen lassen, ohne dass dafür der Overhead eines separaten Gastsystems in Kauf genommen werden muss. Zusätzlich können Anwendungen mit Container plattformübergreifend und in unterschiedlichen Infrastrukturen eingesetzt werden, ohne dass diese an die Hard- oder Software-Konfigurationen des Hostsystems angepasst werden müssen.

Docker ist das bekannteste Software-Projekt, das Anwendern und Anwenderinnen eine auf Containern basierende Virtualisierungstechnologie zur Verfügung stellt. Die quelloffene Plattform setzt dabei auf drei grundlegende Komponenten: Um Container auszuführen, brauchen Anwender lediglich die Docker-Engine sowie spezielle Docker-Images, die sich über das Docker-Hub beziehen oder selbst erstellen lassen.

Tipp

Docker-Container und -Images sind meistens generisch, aber können nach Bedarf auch sehr individuell gestaltet werden. In unserem Artikel zu Docker-Containern können Sie sich weiter informieren.

Docker Images

Ähnlich wie virtuelle Maschinen basieren Docker-Container auf Docker-Images. Bei einem Image handelt es sich um eine schreibgeschützte Vorlage, die sämtliche Instruktionen beinhaltet, die die Docker-Engine benötigt, um einen Container zu erzeugen. Als portables Abbild eines Containers wird ein Docker-Image in Form einer Textdatei beschrieben – man spricht von einem Dockerfile. Soll ein Container auf einem System gestartet werden, wird zunächst ein Paket mit dem jeweiligen Image geladen – sofern dieses nicht lokal vorliegt. Das geladene Image stellt das für die Laufzeit benötigte Dateisystem inklusive aller Parameter bereit. Ein Container kann als laufender Prozess eines Images betrachtet werden.

Das Docker-Hub

Das Docker-Hub ist eine cloudbasierte Registry für Software-Repositorys, eine Art Bibliothek für Docker-Images. Der Onlinedienst teilt sich in einen öffentlichen und einen privaten Bereich auf. Der öffentliche Bereich bietet Nutzern die Möglichkeit, selbst entwickelte Images hochzuladen und mit der Community zu teilen. Hier stehen eine Reihe offizieller Images vom Docker-Entwicklerteam und etablierten Open-Source-Projekten zur Verfügung. Images, die in einen privaten Bereich der Registry hochgeladen werden, sind nicht öffentlich zugänglich und können so beispielsweise firmenintern oder im Freundes- und Bekanntenkreis geteilt werden. Das Docker-Hub erreichen Sie unter hub.docker.com.

Die Docker-Engine

Das Herzstück des Docker-Projekts ist die Docker-Engine. Dabei handelt es sich um eine quelloffene Client-Server-Anwendung, die Nutzern und Nutzerinnen in der aktuellen Version auf allen etablierten Plattformen zur Verfügung steht.

Die Grundarchitektur der Docker-Engine lässt sich in drei Komponenten aufteilen: Einen Daemon mit Server-Funktionen, eine Programmierschnittstelle (API) auf Basis des Programmierparadigmas REST (Representational State Transfer) und das Terminal des Betriebssystems (Command-Line Interface, CLI) als Benutzerschnittstelle (Client).

  • Der Docker-Daemon: Als Server kommt bei der Docker-Engine ein Daemon-Prozess zum Einsatz. Der Docker-Daemon läuft im Hintergrund auf dem Hostsystem und dient der zentralen Steuerung der Docker-Engine. In dieser Funktion erstellt und verwaltet er sämtliche Images, Container oder Netzwerke.
  • **Die REST-API:**Die REST-API spezifiziert eine Reihe von Schnittstellen, die es anderen Programmen ermöglichen, mit dem Docker-Daemon zu kommunizieren und diesem Anweisungen zu geben. Eines dieser Programme ist das Terminal des Betriebssystems.
  • **Das Terminal:**Als Clientprogramm nutzt Docker das Terminal des Betriebssystems. Dieses interagiert mit dem Docker-Daemon über die REST-API und ermöglicht es Anwendern, diesen durch Skripte oder Benutzereingaben zu steuern.
Tipp

2017 wurde die Docker-Engine in Docker Community Edition (abgekürzt Docker CE) umbenannt, jedoch wird in der offiziellen Dokumentation und in den Docker-Repositorys meistens noch der alte Name verwendet. Neben der Docker-CE gibt es auch die Docker Enterprise Edition (Docker EE), die einige Premium-Features hat. Diese ist allerdings nicht kostenfrei und eignet sich eher für Unternehmen.

Mit Docker-Befehlen können Anwenderinnen und Anwender Software-Container direkt aus dem Terminal starten, stoppen und verwalten. Die Ansprache des Daemon erfolgt über das Kommando dockerund Anweisungen wie build (erstelle), pull (lade herunter) oder run (starte). Client und Server können sich dabei auf dem gleichen System befinden. Alternativ steht Anwendern die Möglichkeit offen, einen Docker-Daemon auf einem anderen System anzusprechen. Je nachdem, welche Art von Verbindung aufgebaut werden soll, erfolgt die Kommunikation zwischen Client und Server über die REST-API, über UNIX-Sockets oder eine Netzwerkschnittstelle.

Folgende Grafik veranschaulicht das Zusammenspiel der einzelnen Docker-Komponenten am Beispiel der Kommandos docker build, docker pull und docker run:

Schematische Darstellung der Docker-Architektur, Server (Docker-Daemon) und Registry (Docker-Hub)“)

Das Kommando docker build weist den Docker-Daemon an, ein Image zu erstellen (gepunktete Linie). Dazu muss ein entsprechendes Dockerfile vorliegen. Soll das Image nicht selbst erstellt, sondern aus einem Repository im Docker-Hub geladen werden, kommt das Kommando docker pull zum Einsatz (gestrichelte Linie). Wird der Docker-Daemon via docker run angewiesen, einen Container zu starten, prüft das Hintergrundprogramm zunächst, ob das entsprechende Container-Image lokal vorliegt. Ist dies der Fall, wird der Container ausgeführt (durchgezogene Linie). Kann der Daemon das Image nicht finden, leitet dieser automatisch ein Pulling aus dem Repository ein.

Dedicated Server von IONOS

Hardware trifft Cloud: Dedicated Server mit Cloud-Integration und mit minutengenauer Abrechnung, inklusive persönlichem Berater!

24/7 Support
Unbegrenzter Traffic
SSL Zertifikat

Arbeiten mit Docker

Nun ist es Zeit, sich mit den Anwendungsmöglichkeiten der Container-Plattform vertraut zu machen. Falls Sie die Docker-Engine noch nicht installiert haben, können Sie dies über den Linux-Terminal tun. Eine Anleitung dazu finden Sie in unserem Artikel „Docker auf Ubuntu 22.04 installieren“. Lernen sie im Folgenden, wie Sie die Docker-Engine über das Terminal steuern, welche Möglichkeiten Ihnen das Docker-Hub bietet und warum Docker-Container den Umgang mit Anwendungen revolutionieren könnten.

Tipp

Wenn Sie Docker auf einer anderen Linux-Distribution oder Windows installieren möchten, stehen Ihnen folgende Anleitungen zur Verfügung:

So steuern Sie die Docker-Engine

Seit der Version 16.04 nutzt Ubuntu das Hintergrundprogramm systemd(kurz für „System-Daemon“), um Prozesse zu managen. Beisystemdhandelt es sich um einen init-Prozess, der auch bei anderen Linux-Distributionen wie RHEL, CentOS oder Fedora zum Einsatz kommt. In der Regel erhältsystemddie Prozess-ID 1. Als erster Prozess des Systems ist der Daemon dafür verantwortlich, alle folgenden Prozesse zu starten, zu überwachen und zu beenden. Bei früheren Ubuntu-Versionen (14.10 und älter) übernimmt das Hintergrundprogrammupstart diese Funktion.

Auch der Docker-Daemon lässt sich via systemd steuern. In der Standardinstallation ist die Container-Plattform so konfiguriert, dass der Daemon automatisch mit dem System-Boot startet. Diese Voreinstellung lässt sich über das Kommandozeilenwerkzeug systemctl individuell anpassen.

Mit systemctl senden Sie Befehle an systemd, um einen Prozess zu steuern oder dessen Status abzufragen. Die Syntax eines solchen Befehls entspricht folgendem Schema:

systemctl [OPTION] [BEFEHL]
bash

Einige Befehle beziehen sich auf bestimmte Ressourcen (beispielsweise Docker). In der Terminologie von systemd werden diese als Units (Einheiten) bezeichnet. In diesem Fall ergibt sich der Befehl aus der jeweiligen Anweisung und dem Namen der Unit, die angesprochen werden soll.

Möchten Sie den Autostart des Docker-Daemons aktivieren (enable) bzw. deaktivieren (disable), nutzen Sie das Kommandozeilenwerkzeug systemctl mit folgenden Befehlen:

sudo systemctl enable docker
sudo systemctl disable docker
bash

Das Kommandozeilenwerkzeug systemctl erlaubt Ihnen zudem, den Status einer Unit abzufragen:

sudo systemctl status docker
bash

Ist die Docker-Engine auf Ihrem Ubuntu-System aktiv, sollte die Ausgabe im Terminal der auf folgendem Screenshot entsprechen:

Die Statusabfrage via systemctl zeigt: Die Docker-Engine ist aktiv (running)
Statusabfrage via *systemctl*: Die Docker-Engine ist aktiv (running)

Ist Ihre Docker-Engine zum aktuellen Zeitpunkt deaktiviert, erhalten Sie die Statusangabe inactive (dead). Starten Sie den Docker-Daemon in diesem Fall manuell, um Container auszuführen.

Die Statusabfrage via systemctl zeigt: Die Docker-Engine ist inaktiv (dead)
Statusabfrage via *systemctl* Die Docker-Engine ist inaktiv (dead)

Möchten Sie Ihre Docker-Engine manuell starten, stoppen oder neustarten, sprechen Sie systemd mit einem der folgenden Befehle an.

Um den deaktivierten Daemon zu starten, verwenden Sie systemctl in Kombination mit dem Befehl start:

sudo systemctl start docker
bash

Soll der Docker-Daemon beendet werden, kommt stattdessen der Befehl stop zum Einsatz:

sudo systemctl stop docker
bash

Einen Neustart der Engine veranlassen Sie mit dem Befehl restart:

sudo systemctl restart docker
bash

So nutzen Sie das Docker-Hub

Wenn die Docker-Engine das Herzstück der Container-Plattform darstellt, dann ist das Docker-Hub die Seele des Open-Source-Projekts. Hier trifft sich die Community. Anwender und Anwenderinnen finden in der cloudbasierten Registry alles, was sie benötigen, um ihrer Docker-Installation Leben einzuhauchen.

Der Onlinedienst bietet diverse offizielle Repositorys mit mehr als 100.000 kostenlosen Apps. Anwender haben die Möglichkeit, eigene Image-Archive zu erstellen und diese gemeinsam mit Arbeitsgruppen zu nutzen. Neben dem professionellen Support durch das Entwicklerteam finden Einsteiger hier Anschluss an die Nutzergemeinde. Ein Forum für den Community-Support steht über GitHub zur Verfügung.

Das Docker-Hub: Anmeldebereich
Ihre persönliche Docker-ID erstellen Sie kostenlos im Rahmen einer Registrierung / Quelle: hub.docker.com

Anmeldung im Docker-Hub

Die Anmeldung im Docker-Hub ist kostenlos. Nutzer benötigen lediglich eine E-Mail-Adresse sowie die selbst gewählte Docker-ID. Diese fungiert später als persönlicher Repository-Namespace und gewährt Nutzern Zugang zu allen Docker-Diensten. Derzeit umfasst das Angebot neben dem Docker-Hub die Docker-Cloud, den Docker-Store und ausgewählte Beta-Programme. Darüber hinaus ermöglicht die Docker-ID einen Log-in in das Docker-Support-Center sowie in das Docker-Success-Portal und die Docker-Foren.

Der Anmeldeprozess erfolgt in fünf Schritten:

  1. Docker-ID wählen: Im Rahmen der Anmeldung wählen Sie einen Benutzernamen, der später als Ihre persönliche Docker-ID fungiert.
  2. E-Mail-Adresse angeben: Geben Sie Ihre aktuelle E-Mail-Adresse an. Beachten Sie, dass Sie die Anmeldungen für das Docker-Hub via E-Mail bestätigen müssen.
  3. Passwort wählen: Wahlen Sie ein geheimes Passwort.
  4. Anmeldung absenden: Klicken Sie auf „Sign up“, um Ihre Registrierung einzureichen. Wurden die Daten vollständig übermittelt, sendet Docker einen Link zur Verifizierung Ihrer E-Mail-Adresse an das von Ihnen angegebene Postfach.
  5. E-Mail-Adresse bestätigen: Bestätigen Sie Ihre E-Mail-Adresse durch einen Klick auf den Verifizierungslink.

Die Onlinedienste des Docker-Projekts stehen Ihnen unmittelbar nach der Registrierung über den Browser zur Verfügung. Hier erstellen Sie Repositorys und Arbeitsgruppen oder durchsuchen das Docker-Hub via „Explore“ nach öffentlichen Ressourcen.

Das Dashboard des Docker-Hubs
Über das Docker-Hub-Dashboard verwalten Sie Repositorys und Arbeitsgruppen / Quelle: hub.docker.com

Alternativ können Sie sich via docker login direkt über das Terminal Ihres Betriebssystems anmelden. Eine detaillierte Beschreibung des Befehls finden Sie in der Docker-Dokumentation.

Prinzipiell steht das Docker-Hub Ihnen auch ohne Account und Docker-ID zur Verfügung. In diesem Fall lassen sich jedoch ausschließlich Images aus öffentlichen Repositorys laden. Ein Upload (push) eigener Images ist ohne Docker-ID nicht möglich.

Repositorys im Docker-Hub erstellen

Der kostenlose Docker-Hub-Account umfasst ein privates Repository und bietet Ihnen die Möglichkeit, beliebig viele öffentliche Repositorys zu erstellen. Sollten Sie weitere private Repositorys benötigen, können Sie diese mit einem kostenpflichtigen Upgrade freischalten.

Um ein Repository anzulegen, gehen Sie folgendermaßen vor:

  1. Namespace wählen: Neu erstellte Repositorys werden automatisch dem Namespace Ihrer Docker-ID zugeordnet. Alternativ haben Sie die Möglichkeit, die ID einer Organisation anzugeben, der Sie angehören.
  2. Repository benennen: Geben Sie einen Namen für das neu erstellte Repository an.
  3. Beschreibung hinzufügen: Fügen Sie eine Beschreibung für Ihre Repository hinzu.
  4. Sichtbarkeit einstellen: Entscheiden Sie, ob das Repository öffentlich sichtbar (public) oder nur Ihnen oder Ihrer Organisation zugänglich (private) sein soll.

Bestätigen Sie Ihre Angaben mit einem Klick auf „Create“.

Das Docker-Hub: Eingabemaske zur Erstellung eines Repositorys
Ihre Repositorys werden automatisch im Namespace ihrer Docker-ID erstellt / Quelle: hub.docker.com

Teams & Organisationen erstellen

Mit dem Hub bietet Docker Ihnen eine cloudbasierte Plattform, auf der Sie selbsterstellte Images zentral verwalten und bequem mit Arbeitsgruppen teilen. In der Docker-Terminologie werden diese Organisationen genannt. Genau wie Nutzer-Accounts erhalten Organisationen individuelle IDs, über die sich Images bereitstellen und herunterladen lassen. Rechte und Rollen innerhalb einer Organisation lassen sich über Teams zuordnen. So haben beispielsweise nur Nutzer, die dem Team „Owners“ zugeordnet wurden, die Berechtigung, private oder öffentliche Repositorys anzulegen und Zugriffsrechte zu vergeben.

Auch Arbeitsgruppen erstellen und verwalten Sie direkt über das Dashboard. Weitere Informationen zum Umgang mit Organisationen und Teams finden Sie in der Docker-Dokumentation.

So arbeiten Sie mit Images und Containern

Als erste Anlaufstelle für offizielle Docker-Ressourcen stellt das Docker-Hub den Ausgangspunkt unserer Einführung in den Umgang mit Images und Containern dar. Das Entwicklungsteam stellt hier u. a. das Demo-Image whalesay zur Verfügung, das als Grundlage für das nachfolgende Docker-Tutorial dienen soll.

Docker-Images herunterladen

Das whalesay-Image finden Sie, indem Sie die Startseite des Docker-Hubs aufrufen und den Begriff whalesay in die Suchleiste rechts neben dem Docker-Logo eingeben.

Die Suchfunktion im Docker-Hub
Durchsuchen Sie das Docker-Hub über die Suchleiste oder die Schaltfläche „Explore“ / hub.docker.com

Klicken Sie in den Suchergebnissen auf die Ressource mit der Bezeichnung docker/whalesay, um das öffentliche Repository für dieses Image aufzurufen.

Docker-Repositorys sind immer nach demselben Muster aufgebaut: Im Kopfbereich der Seite finden Nutzer die Bezeichnung des Images, die Kategorie des Repositorys sowie den Zeitpunkt des letzten Uploads (last pushed).

Webansicht eines Docker-Repositorys
Im Repository finden Nutzer in der Regel alle Informationen, die für den Einsatz des Images benötigt werden / Quelle: hub.docker.com

Darüber hinaus bietet jedes Docker-Repository folgende Info-Boxen:

  • Description: ausführliche Beschreibung, in der Regel inklusive Gebrauchsanweisung
  • Docker Pull Command: Kommandozeilenbefehl, um das Image aus dem Repository herunterzuladen (pull)
  • Owner: Information über den Ersteller des Repositorys
  • Comments: Kommentarbereich am Seitenende

Den Informationsboxen des Repositorys lässt sich entnehmen, dass es sich bei whalesay um eine Modifikation des quelloffenen Perl-Skripts cowsay handelt. Das von Tony Monroe im Jahr 1999 entwickelte Programm generiert in seiner Ursprungsform eine ASCII-Grafik in Form einer Kuh, die zusammen mit einer Nachricht im Terminal des Benutzers erscheint.

Um docker/whalesay herunterzuladen, benutzen Sie den Befehl docker pull nach folgendem Grundschema:

docker pull [OPTIONS] NAME [:TAG|@DIGEST]
bash

Der Befehl docker pull weist den Daemon an, ein Image aus dem Repository zu laden. Um welches Image es sich handelt, bestimmen Sie durch die Angabe der Image-Bezeichnung (NAME). Darüber hinaus können Sie Docker anweisen, wie der gewünschte Befehl ausgeführt werden soll (OPTIONS). Ebenfalls optional ist die Angabe von Tags (:TAG) und eindeutigen Identifikationsnummern (@DIGEST), die es ermöglichen, eine bestimmte Version eines Images herunterzuladen.

Eine lokale Kopie des docker/whalesay-Images erhalten Sie somit durch folgenden Befehl:

docker pull docker/whalesay
bash

In der Regel können Sie diesen Schritt jedoch überspringen. Möchten Sie einen Container starten, lädt der Docker-Daemon Images, die er auf dem lokalen System nicht finden kann, automatisch aus dem Repository herunter.

Docker-Images als Container starten

Um ein Docker-Image zu starten, nutzen Sie den Befehl docker run nach folgendem Grundschema:

docker run [OPTIONS] IMAGE [:TAG|@DIGEST] [CMD] [ARG…] 
bash

Einziger obligatorischer Bestandteil des Befehls docker run ist die Bezeichnung des gewünschten Docker-Images. Auch wenn Sie Container starten, haben Sie die Möglichkeit, fakultative Optionen, TAGs und DIGESTs zu definieren. Darüber hinaus lässt sich der Befehl docker run mit weiteren Befehlen kombinieren, die ausgeführt werden, sobald der Container startet. In diesem Fall wird der vom Image-Ersteller definierte CMD (COMMAND, ein Befehl, der beim Starten des Containers automatisch ausgeführt wird) überschrieben. Weitere optionale Konfigurationen lassen sich durch zusätzliche Argumente (ARG…) definieren. Diese ermöglichen es beispielweise, Benutzer hinzuzufügen oder Umgebungsvariablen (Environment-Variables) zu übergeben.

Nutzen Sie den Kommandozeilenbefehl

docker run docker/whalesay cowsay boo 
bash

um das als Image vorliegende Perl-Skript herunterzuladen und in einem Container auszuführen. Sie werden sehen, dass sich whalesay in einem wesentlichen Punkt vom Ursprungsskript unterscheidet.

Terminalausgabe des Containers docker/whalesay: Der Wal sagt boo
Wird *docker/whalesay* mit dem Standardbefehl ausgeführt, beschränkt sich der Docker-Wal auf ein kurzes *boo*

Wird das Image docker/whalesay ausgeführt, gibt das Skript eine ASCII-Grafik in Form eines Wals sowie die mit dem cowsay-Befehl übergebene Textnachricht „boo“ im Terminal aus.

Wie beim Testlauf sucht der Daemon das gewünschte Image zunächst im lokalen Dateiverzeichnis. Da sich hier kein gleichnamiges Paket findet, wird ein Pulling aus dem Docker-Repository eingeleitet. Anschließend startet der Daemon das modifizierte Cowsay-Programm. Ist dieses durchgelaufen, wird der Container automatisch beendet.

Wie cowsay bietet Ihnen auch Dockers whalesay die Möglichkeit, in den Programmablauf einzugreifen, um die Textausgabe im Terminal zu beeinflussen. Testen Sie diese Funktion, indem Sie das „boo“ im Ausgangsbefehl durch eine beliebige Zeichenfolge ersetzen – z. B. durch einen lahmen Wal-Witz.

sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
bash
Terminalausgabe des Containers docker/whalesay: ein Wal mit individueller Textnachricht
Legen Sie Ihrem Docker-Wal die Worte in den Mund, die Sie hören möchten

Alle Docker-Images auf dem lokalen System anzeigen

Sind Sie sich nicht sicher, ob Sie ein bestimmtes Image bereits heruntergeladen haben, können Sie eine Übersicht aller Images auf Ihrem lokalen System aufrufen. Nutzen sie dazu folgenden Kommandozeilenbefehl:

sudo docker images 
bash

Der Befehl docker images (alternativ docker image ls) gibt Ihnen alle lokalen Images inklusive Dateigröße, Tag und Image-ID aus.

Übersicht aller Images auf dem lokalen System
Die Übersicht zeigt die Images *hello-world* und *docker/whalesay*

Starten Sie einen Container, wird das zugrundeliegende Image als Kopie aus dem Repository heruntergeladen und dauerhaft auf Ihrem Computer gespeichert. So sparen Sie Zeit, falls Sie zu einem späteren Zeitpunkt erneut auf das betreffende Image zugreifen möchten. Ein erneuter Download wird nur dann eingeleitet, wenn sich die Image-Quelle verändert – beispielsweise, wenn im Repository eine aktuellere Version zur Verfügung steht.

Alle Container auf dem lokalen System anzeigen

Möchten Sie sich eine Übersicht aller Container ausgeben lassen, die auf Ihrem System ausgeführt werden oder in der Vergangenheit ausgeführt wurden, nutzen Sie den Kommandozeilenbefehl docker ps in Kombination mit der Option --all (kurz: -a):

sudo docker ps -a
bash
Übersicht aller Container auf dem lokalen System
Die Übersicht zeigt alle Container, die auf der Docker-Engine gestartet wurden

Die Terminalausgabe umfasst Informationen wie die jeweilige Container-ID, das zugrundeliegende Image, den Befehl, der beim Starten des Containers ausgeführt wurde, den Zeitpunkt, an dem der jeweilige Container gestartet wurde, sowie den aktuellen Status.

Möchten Sie lediglich die Container anzeigen, die aktuell auf Ihrem System ausgeführt werden, nutzen Sie den Kommandozeilenbefehl docker ps ohne weitere Option:

sudo docker ps
bash

Derzeit sollten sich auf Ihrem System jedoch keine laufenden Container befinden.

Docker-Images erstellen

Sie wissen nun, wie man Images im Docker-Hub findet, diese herunterlädt und auf jedem beliebigen System ausführt, auf dem die Docker-Engine installiert wurde. Mit Docker steht Ihnen jedoch nicht nur das umfangreiche App-Angebot der Registry zur Verfügung. Die Plattform bietet Ihnen darüber hinaus weitreichende Möglichkeiten, eigene Images zu erstellen und diese mit anderen Entwicklern zu teilen.

Bereits in den einleitenden Kapiteln dieses Tutorials haben Sie erfahren, dass jedes Docker-Image auf einem Dockerfile basiert. Dockerfiles können Sie sich als eine Art Bauanleitung für Images vorstellen. Es handelt sich um einfache Textdateien, die alle Anweisungen enthalten, die Docker benötigt, um ein Image zu erstellen. Lernen Sie in den folgenden Schritten, wie Sie ein solches Dockerfile schreiben und Docker anweisen, dieses als Grundlage für ein eigenes Image zu verwenden.

  1. Neues Verzeichnis anlegen: Das Docker-Entwicklerteam empfiehlt, für jedes Dockerfile ein eigenes Verzeichnis anzulegen. Verzeichnisse erstellen Sie unter Linux bequem über das Terminal. Verwenden Sie folgenden Kommandozeilenbefehl, um ein Verzeichnis mit dem Namen mydockerbuild zu erstellen:
mkdir mydockerbuild
bash
Ubuntu-Terminal: Der Befehl mkdir
Neue Verzeichnisse erstellen Sie mit dem Befehl *mkdir*
  1. In das neue Verzeichnis navigieren: Nutzen Sie den Befehl cd, um in das neu erstellte Arbeitsverzeichnis zu navigieren.
cd mydockerbuild
bash
Ubuntu-Terminal: der Befehl cd
Mithilfe des Befehls *cd* wechseln Sie in ein anderes Arbeitsverzeichnis
  1. Neue Textdatei erstellen: Auch Textdateien erstellen Sie unter Ubuntu bequem über das Terminal. Verwenden Sie dazu einen Editor wie Nano oder Vim. Erstellen Sie im Verzeichnis mydockerbuild eine Textdatei mit dem Namen Dockerfile.
nano Dockerfile
bash
Ubuntu-Terminal: Textdateien mit Nano erstellen
Der Texteditor Nano ist bei allen Ubuntu-Versionen vorinstalliert
  1. Dockerfile schreiben: Die neu erstellte Textdatei dient als Bauplan für Ihr selbst entwickeltes Image. Statt das Image von Grund auf neu zu programmieren, nutzen wir in diesem Docker-Tutorial das Demo-Image docker/whalesay als Vorlage. Dieses binden Sie über den Befehl FROM in Ihr Dockerfile ein. Verwenden Sie das Tag :latest, um auf die neueste Version des Images zu verweisen.
FROM docker/whalesay:latest

Bisher arbeitet docker/whalesay so, dass Sie dem Wal die Worte in den Mund legen müssen. Im Terminal erscheint genau der Text, den Sie zuvor in Kombination mit dem Befehl zum Starten des Containers eingegeben haben. Interessanter wäre es jedoch, wenn das Skript automatisch immer wieder neue Textausgaben generieren würde. Umsetzen lässt sich dies beispielsweise mithilfe des Programms fortunes, das auf jedem Linux-System zur Verfügung steht. Die Grundfunktion von Fortunes besteht darin, Glückskeks-Sprüche und humorvolle Aphorismen zu generieren. Nutzen Sie folgenden Befehl, um Ihren lokalen Paket-Index zu aktualisieren und fortunes zu installieren:

RUN apt-get -y update && apt-get install -y fortunes

Anschließend definieren Sie ein CMD-Statement. Dieses wird nach dem Befehl RUN ausgeführt, sofern es beim Aufruf (docker run image CMD) nicht überschrieben wurde. Verwenden Sie folgenden Befehl, um das Programm fortunes mit der Option -a („Wähle aus allen Datenbanken“) auszuführen und die Ausgabe über das Programm cowsay im Terminal anzeigen zu lassen:

CMD /usr/games/fortune -a | cowsay

Ihr Dockerfile sollte nun folgendermaßen aussehen:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

Beachten Sie: Befehle innerhalb eines Dockerfiles sind immer einzeilig und beginnen stets mit einem Schlüsselwort. Die zugrundeliegende Syntax ist case-insensitive – es ist also egal, ob Sie groß- oder kleinschreiben. Es hat sich jedoch eine konsequente Großschreibung von Schlüsselwörtern etabliert.

Der Texteditor Nano im Ubuntu-Terminal
Den Texteditor Nano steuern Sie über die in der Fußzeile angegebenen Tastenkombinationen
  1. Textdatei speichern: Speichern Sie Ihre Eingabe. Sollten Sie den Editor Nano verwenden, nutzen Sie dazu die Tastenkombination [STRG] + [O] und bestätigen Sie mit [ENTER]. Nano gibt Ihnen die Meldung aus, dass drei Zeilen in die ausgewählte Datei geschrieben wurden. Beenden Sie den Texteditor mit der Tastenkombination [STRG] + [X].
  2. Image aus Dockerfile erstellen: Um ein Image aus einem Dockerfile zu erstellen, navigieren Sie zunächst in das Verzeichnis, in dem Sie die Textdatei abgelegt haben. Die Image-Erstellung starten Sie mit dem Kommandozeilenbefehl docker build. Möchten Sie das Image individuell benennen oder mit einem Tag versehen, verwenden Sie die Option -t sowie nachfolgend die gewünschte Kombination aus Bezeichnung und Tag. Es gilt das Standardformat name:tag.

Im aktuellen Beispiel soll ein Image mit dem Namen docker-whale erzeugt werden:

docker build -t docker-whale .
bash

Der abschließende Punkt gibt an, dass sich das zugrundeliegende Dockerfile im ausgewählten Verzeichnis befindet. Alternativ haben Sie die Möglichkeit, einen Dateipfad oder eine URL zu den Quelldateien anzugeben.

Der build-Prozess startet, sobald Sie den Befehl mit [ENTER] bestätigt haben. Zunächst überprüft der Docker-Daemon, ob ihm alle Dateien vorliegen, die für die Erstellung des Images benötigt werden. In der Docker-Terminologie werden diese unter dem Begriff „Context“ zusammengefasst. Im Anschluss wird das Image docker/whalesay mit dem Tag :latest lokalisiert. Liegt der für die Image-Erstellung benötigte Context vollständig vor, startet der Docker-Daemon die via FROM eingebundene Image-Vorlage in einem temporären Container und geht zum nächsten Befehl im Dockerfile über. Im aktuellen Beispiel handelt es sich dabei um den RUN-Befehl, der die Installation des fortunes-Programms zur Folge hat.

Am Ende jedes Schritts im Rahmen der Image-Erstellung gibt Docker Ihnen eine ID für den entsprechenden Layer (Schicht) aus, der in diesem Schritt erstellt wurde. Dabei gilt: Jede Zeile im zugrundeliegenden Dockerfile entspricht einem Layer des darauf aufbauenden Images.

Wurde der RUN-Befehl beendet, stoppt der Docker-Daemon den dafür erstellten Container, entfernt diesen und startet einen neuen temporären Container für das Layer des CMD-Statements. Am Ende des Erstellungsprozesses wird auch dieser temporäre Container beendet und entfernt. Docker gibt Ihnen die ID des neuen Images aus:

Successfully built a8f2048c9ab8

Ubuntu-Terminal: Statusmeldungen während der Image-Erstellung erstellt“)

Ihr neu erstelltes Image finden Sie unter dem Namen docker-whale in der Übersicht ihrer lokal gespeicherten Images.

sudo docker images
bash
Ubuntu-Termal: Übersicht aller Images
Das neu erstellte Image in der Image-Übersicht

Um einen Container aus Ihrem neu erstellten Image zu starten, verwenden Sie den Kommandozeilenbefehl sudo docker run in Kombination mit dem Namen des Images:

sudo docker run docker-whale 
bash

Wurde das Image fehlerfrei aus dem Dockerfile erstellt, sollte Ihr Wal Sie nun mit mehr oder weniger weisen Sprüchen begeistern. Beachten Sie: Jedes Mal, wenn Sie den Container neu starten, wird ein anderer Spruch generiert.

Container auf Basis von docker-whale: Textausgabe im Terminal
Dank *fortunes* gibt der ASCII-Wal nun Aphorismen zum Besten
Tipp

Wie Sie Docker-Images erstellen erfahren Sie noch detaillierter in unserem separaten Artikel.

Docker-Images taggen und ins Docker-Hub hochladen

Möchten Sie Ihr selbsterstelltes Image docker-whale ins Hub laden, um es dort der Community oder einer Arbeitsgruppe zur Verfügung zu stellen, müssen Sie es zunächst mit einem gleichnamigen Repository in Ihrem persönlichen Namespace verknüpfen. In der Docker-Terminologie wird dieser Schritt Tagging genannt.

Um ein Image über das Docker-Hub zu veröffentlichen, gehen Sie folgendermaßen vor:

  1. Repository erstellen: Loggen Sie sich mit Ihrer Docker-ID und dem persönlichen Passwort im Docker-Hub ein und erstellen Sie ein öffentliches Repository mit dem Namen docker-whale.
Das Docker-Hub: Eingabemaske zur Erstellung eines Repositorys
Legen Sie ein Repository für Ihr selbsterstelltes Image an / Quelle: hub.docker.com
  1. Image-ID ermitteln: Ermitteln Sie die ID Ihres selbsterstellten Images docker-whale mithilfe des Kommandozeilenbefehls docker images.
Übersicht aller lokalen Images im Ubuntu-Terminal
Der Befehl *docker images* listet alle Images auf, die auf Ihrem System gespeichert sind

In unserem Fall lautet die Image-ID a8f2048c9ab8. Diese benötigen wir für das Tagging im nächsten Schritt.

  1. Image taggen: Taggen Sie das Image docker-whale mithilfe des Kommandozeilenbefehls docker tag nach folgendem Schema:
sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
bash

Auf das aktuelle Beispiel bezogen lautet der Kommandozeilenbefehl für das Tagging somit:

sudo docker tag a8f2048c9ab8 [Namespace]/docker-whale:latest
bash

Ob Ihr Image korrekt getaggt wurde, überprüfen Sie in der Übersicht via docker images. Der Name des Repositorys sollte nun Ihre Docker-ID beinhalten.

Ubuntu-Terminal: Image-Übersicht vor und nach dem Tagging
Mit dem Befehl *docker tag* verknüpfen Sie Images mit Ihrer Docker-ID
  1. Image hochladen: Um das Image hochzuladen, müssen Sie sich zunächst im Docker-Hub anmelden. Dies erfolgt über den Kommandozeilenbefehl docker login.
sudo docker login
bash

Das Terminal fordert Sie auf, Ihren Benutzernahmen (die Docker-ID) sowie ihr Passwort einzugeben.

Anmeldung am Docker-Hub über das Ubuntu-Terminal
Bevor Sie ein Image ins Docker-Hub hochladen können, müssen Sie sich anmelden

War die Anmeldung erfolgreich, verwenden Sie den Kommandozeilenbefehl docker push, um Ihr Image in das neu erstellte Repository hochzuladen.

sudo docker push [Namespace]/docker-whale
bash

Der Upload-Prozess sollte lediglich einige Sekunden in Anspruch nehmen. Der aktuelle Status wird Ihnen über das Terminal ausgegeben.

Ubuntu-Terminal: Statusmeldung nach dem Image-Upload
Das Image steht nach dem Upload unter dem gesetzten Tag *latest* im Docker-Hub zur Verfügung.

Melden Sie sich über den Browser im Docker-Hub an, um sich das hochgeladene Image anzeigen zu lassen.

Docker-Hub: Das Repository [Namespace]/docker-whale in der Detailansicht
Die letzte Aktualisierung Ihres Repositorys wird Ihnen in der Detailansicht angezeigt / Quelle: hub.docker.com

Möchten Sie mehr als ein Image pro Repository hochladen, verwenden Sie verschiedene Tags, um Ihre Images in unterschiedlichen Versionen anzubieten. Beispielsweise:

[Namespace]/docker-whale:latest
[Namespace]/docker-whale:version1
[Namespace]/docker-whale:version2

Eine Übersicht verschiedener Image-Versionen lässt sich in Docker-Hub-Repositorys über den Reiter „Tags“ abrufen.

Docker-Hub: Der Reiter „Tags“
Im Reiter „Tags“ finden Sie alle Versionen eines Images / Quelle: hub.docker.com

Images verschiedener Projekte hingegen sollten in separaten Repositorys angeboten werden.

War der Upload erfolgreich, steht Ihr selbsterstelltes Image nun jedem Docker-Nutzer weltweit über das öffentliche Repository zur Verfügung.

  1. Testlauf: Testen Sie den Erfolg des Uploads, indem Sie das soeben hochgeladene Image herunterladen.

Beachten Sie, dass Sie die lokale Version des Images zunächst löschen müssen, um eine neue Kopie mit demselben Tag herunterzuladen. Andernfalls meldet Docker, dass das gewünschte Image bereits in der aktuellen Version vorliegt.

Statusmeldung: „Image is up to date“ („Die lokale Kopie ist aktuell“)
Liegt ein Image lokal vor, wird der Pull-Befehl abgebrochen

Um lokale Docker-Images zu löschen, nutzen Sie den Kommandozeilenbefehl docker rmi in Kombination mit der entsprechenden Image-ID. Diese ermitteln Sie wie gehabt via docker images. Meldet Docker Konflikte – z. B. weil eine Image-ID in mehreren Repositorys oder von einem Container verwendet wird –, bekräftigen Sie Ihren Befehl mit der Option --force (Kurz: -f), um den Löschvorgang zu erzwingen.

sudo docker rmi -f a8f2048c9ab8
bash
Befehl docker rmi in Kombination mit der Option -f (force)
Nutzen Sie den Befehl *docker rmi* in Kombination mit der Option *-f*, um einen Löschvorgang zu erzwingen

Lassen Sie sich erneut eine Übersicht aller lokalen Images anzeigen:

sudo docker Images
bash

Die gelöschten Elemente sollten in der Terminal-Ausgabe nicht mehr auftauchen. Nutzen Sie nun den im Repository angegebenen Pull-Befehl, um eine neue Kopie des Images aus dem Docker-Hub herunterzuladen:

sudo docker pull [Namespace]/docker-whale
bash
Ubuntu-Terminal: Download aus dem Docker-Hub
Das zuvor veröffentlichte Image wurde erfolgreich heruntergeladen

Weitere Docker-Themen und Tutorials

Das Docker-Universum ist groß. Im Laufe der Zeit hat sich ein lebendiges Ökosystem aus Docker-Tools entwickelt. Interessant wird Docker für Administratoren vor allem dann, wenn komplexe Anwendungen mit mehreren Containern parallel auf verschiedenen Systemen betrieben werden. Docker bietet dazu diverse Funktionen zur Orchestrierung eines solches Clusters. Näheres dazu finden Sie in unserm weiterführenden Artikel über Docker-Orchestration mit Swarm und Compose.

Für die Arbeit mit Docker finden Sie im Digital Guide weitere Tutorials:

Docker eignet sich für die verschiedensten Anwendungsszenarios. Im Digital Guide finden Sie folgende Tutorials:

Nicht immer ist Docker für jede Anwendung die beste Wahl. Wir zeigen die wichtigsten Docker-Alternativen im Überblick. Zudem haben wir einige Alternativen im Detail mit Docker verglichen: