In unserem Docker-Tutorial erklären wir die Vir­tua­li­sie­rungs­platt­form Docker und zeigen Ihnen anhand von leicht nach­voll­zieh­ba­ren An­lei­tun­gen, wie Sie Docker auf Ihrem Ubuntu 22.04 System nutzen können.

Free VPS Trial
vServer kostenlos testen für 30 Tage

Lassen Sie sich von den Vorteilen über­zeu­gen. Probieren Sie Ihren Virtual Server ganz in Ruhe 30 Tage lang aus!

Docker: Aufbau und Funk­tio­nen

„Build, Ship and Run Any App, Anywhere“ – unter diesem Motto bewirbt die quell­of­fe­ne Container-Plattform Docker eine flexible, res­sour­cen­spa­ren­de Al­ter­na­ti­ve zur Emulation von Hardware-Kom­po­nen­ten auf Basis vir­tu­el­ler Maschinen (VMs). Während die klas­si­sche Hardware-Vir­tua­li­sie­rung darauf beruht, mehrere Gast­sys­te­me auf einem ge­mein­sa­men Host-System zu starten, werden An­wen­dun­gen bei Docker mithilfe von Con­tai­nern als isolierte Prozesse auf ein und demselben System aus­ge­führt. Man spricht bei der con­tai­ner­ba­sier­ten Server-Vir­tua­li­sie­rung daher auch von einer Operating-System-Level-Vir­tua­li­sie­rung.

Bild: Virtuelle Maschinen und Docker-Container im Vergleich
Während jede virtuelle Maschine ein eigenes Be­triebs­sys­tem startet, teilen sich Docker-Container den Kernel des Host-Systems

Der große Vorteil con­tai­ner­ba­sier­ter Vir­tua­li­sie­rung liegt somit darin, dass sich An­wen­dun­gen mit un­ter­schied­li­chen An­for­de­run­gen isoliert von­ein­an­der ausführen lassen, ohne dass dafür der Overhead eines separaten Gast­sys­tems in Kauf genommen werden muss. Zu­sätz­lich können An­wen­dun­gen mit Container platt­form­über­grei­fend und in un­ter­schied­li­chen In­fra­struk­tu­ren ein­ge­setzt werden, ohne dass diese an die Hard- oder Software-Kon­fi­gu­ra­tio­nen des Host­sys­tems angepasst werden müssen.

Docker ist das be­kann­tes­te Software-Projekt, das Anwendern und An­wen­de­rin­nen eine auf Con­tai­nern ba­sie­ren­de Vir­tua­li­sie­rungs­tech­no­lo­gie zur Verfügung stellt. Die quell­of­fe­ne Plattform setzt dabei auf drei grund­le­gen­de Kom­po­nen­ten: Um Container aus­zu­füh­ren, 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 in­di­vi­du­ell gestaltet werden. In unserem Artikel zu Docker-Con­tai­nern können Sie sich weiter in­for­mie­ren.

Docker Images

Ähnlich wie virtuelle Maschinen basieren Docker-Container auf Docker-Images. Bei einem Image handelt es sich um eine schreib­ge­schütz­te Vorlage, die sämtliche In­struk­tio­nen be­inhal­tet, die die Docker-Engine benötigt, um einen Container zu erzeugen. Als portables Abbild eines Con­tai­ners wird ein Docker-Image in Form einer Textdatei be­schrie­ben – man spricht von einem Do­cker­file. Soll ein Container auf einem System gestartet werden, wird zunächst ein Paket mit dem je­wei­li­gen Image geladen – sofern dieses nicht lokal vorliegt. Das geladene Image stellt das für die Laufzeit benötigte Da­tei­sys­tem inklusive aller Parameter bereit. Ein Container kann als laufender Prozess eines Images be­trach­tet werden.

Das Docker-Hub

Das Docker-Hub ist eine cloud­ba­sier­te Registry für Software-Re­po­si­to­rys, eine Art Bi­blio­thek für Docker-Images. Der On­line­dienst teilt sich in einen öf­fent­li­chen und einen privaten Bereich auf. Der öf­fent­li­che Bereich bietet Nutzern die Mög­lich­keit, selbst ent­wi­ckel­te Images hoch­zu­la­den und mit der Community zu teilen. Hier stehen eine Reihe of­fi­zi­el­ler Images vom Docker-Ent­wick­ler­team und eta­blier­ten Open-Source-Projekten zur Verfügung. Images, die in einen privaten Bereich der Registry hoch­ge­la­den werden, sind nicht öf­fent­lich zu­gäng­lich und können so bei­spiels­wei­se fir­men­in­tern oder im Freundes- und Be­kann­ten­kreis 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 quell­of­fe­ne Client-Server-Anwendung, die Nutzern und Nut­ze­rin­nen in der aktuellen Version auf allen eta­blier­ten Platt­for­men zur Verfügung steht.

Die Grund­ar­chi­tek­tur der Docker-Engine lässt sich in drei Kom­po­nen­ten aufteilen: Einen Daemon mit Server-Funk­tio­nen, eine Pro­gram­mier­schnitt­stel­le (API) auf Basis des Pro­gram­mier­pa­ra­dig­mas REST (Re­pre­sen­ta­tio­nal State Transfer) und das Terminal des Be­triebs­sys­tems (Command-Line Interface, CLI) als Be­nut­zer­schnitt­stel­le (Client).

  • Der Docker-Daemon: Als Server kommt bei der Docker-Engine ein Daemon-Prozess zum Einsatz. Der Docker-Daemon läuft im Hin­ter­grund auf dem Host­sys­tem 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 spe­zi­fi­ziert eine Reihe von Schnitt­stel­len, die es anderen Pro­gram­men er­mög­li­chen, mit dem Docker-Daemon zu kom­mu­ni­zie­ren und diesem An­wei­sun­gen zu geben. Eines dieser Programme ist das Terminal des Be­triebs­sys­tems.
  • Das Terminal: Als Cli­ent­pro­gramm nutzt Docker das Terminal des Be­triebs­sys­tems. Dieses in­ter­agiert mit dem Docker-Daemon über die REST-API und er­mög­licht es Anwendern, diesen durch Skripte oder Be­nut­zer­ein­ga­ben zu steuern.
Tipp

2017 wurde die Docker-Engine in Docker Community Edition (abgekürzt Docker CE) umbenannt, jedoch wird in der of­fi­zi­el­len Do­ku­men­ta­ti­on und in den Docker-Re­po­si­to­rys meistens noch der alte Name verwendet. Neben der Docker-CE gibt es auch die Docker En­ter­pri­se Edition (Docker EE), die einige Premium-Features hat. Diese ist al­ler­dings nicht kos­ten­frei und eignet sich eher für Un­ter­neh­men.

Mit Docker-Befehlen können An­wen­de­rin­nen und Anwender Software-Container direkt aus dem Terminal starten, stoppen und verwalten. Die Ansprache des Daemon erfolgt über das Kommando dockerund An­wei­sun­gen wie build (erstelle), pull (lade herunter) oder run (starte). Client und Server können sich dabei auf dem gleichen System befinden. Al­ter­na­tiv steht Anwendern die Mög­lich­keit offen, einen Docker-Daemon auf einem anderen System an­zu­spre­chen. Je nachdem, welche Art von Ver­bin­dung aufgebaut werden soll, erfolgt die Kom­mu­ni­ka­ti­on zwischen Client und Server über die REST-API, über UNIX-Sockets oder eine Netz­werk­schnitt­stel­le.

Folgende Grafik ver­an­schau­licht das Zu­sam­men­spiel der einzelnen Docker-Kom­po­nen­ten am Beispiel der Kommandos docker build, docker pull und docker run:

![Sche­ma­ti­sche Dar­stel­lung der Docker-Ar­chi­tek­tur](https://www.ionos.de/di­gi­tal­gui­de/fileadmin/Di­gi­tal­Gui­de/Schau­bil­der/sche­ma­ti­sche-dar­stel­lung-docker-ar­chi­tek­tur.png “Die Docker-Ar­chi­tek­tur basiert auf einem Zu­sam­men­spiel aus Client (Terminal), Server (Docker-Daemon) und Registry (Docker-Hub))

Das Kommando docker build weist den Docker-Daemon an, ein Image zu erstellen (ge­punk­te­te Linie). Dazu muss ein ent­spre­chen­des Do­cker­file vorliegen. Soll das Image nicht selbst erstellt, sondern aus einem Re­po­si­to­ry im Docker-Hub geladen werden, kommt das Kommando docker pull zum Einsatz (ge­stri­chel­te Linie). Wird der Docker-Daemon via docker run an­ge­wie­sen, einen Container zu starten, prüft das Hin­ter­grund­pro­gramm zunächst, ob das ent­spre­chen­de Container-Image lokal vorliegt. Ist dies der Fall, wird der Container aus­ge­führt (durch­ge­zo­ge­ne Linie). Kann der Daemon das Image nicht finden, leitet dieser au­to­ma­tisch ein Pulling aus dem Re­po­si­to­ry ein.

Dedicated Server
De­di­zier­te Server mit mo­derns­ten Pro­zes­so­ren
  • 100 % En­ter­pri­se-Hardware
  • Kon­fi­gu­rier­ba­re Hardware-Aus­stat­tung
  • ISO-zer­ti­fi­zier­te Re­chen­zen­tren

Arbeiten mit Docker

Nun ist es Zeit, sich mit den An­wen­dungs­mög­lich­kei­ten der Container-Plattform vertraut zu machen. Falls Sie die Docker-Engine noch nicht in­stal­liert haben, können Sie dies über den Linux-Terminal tun. Eine Anleitung dazu finden Sie in unserem Artikel „Docker auf Ubuntu 22.04 in­stal­lie­ren. Lernen sie im Folgenden, wie Sie die Docker-Engine über das Terminal steuern, welche Mög­lich­kei­ten Ihnen das Docker-Hub bietet und warum Docker-Container den Umgang mit An­wen­dun­gen re­vo­lu­tio­nie­ren könnten.

Tipp

Wenn Sie Docker auf einer anderen Linux-Dis­tri­bu­ti­on oder Windows in­stal­lie­ren möchten, stehen Ihnen folgende An­lei­tun­gen zur Verfügung:

So steuern Sie die Docker-Engine

Seit der Version 16.04 nutzt Ubuntu das Hin­ter­grund­pro­gramm systemd(kurz für „System-Daemon), um Prozesse zu managen. Beisystemdhandelt es sich um einen init-Prozess, der auch bei anderen Linux-Dis­tri­bu­tio­nen 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 ver­ant­wort­lich, alle folgenden Prozesse zu starten, zu über­wa­chen und zu beenden. Bei früheren Ubuntu-Versionen (14.10 und älter) übernimmt das Hin­ter­grund­pro­grammupstart diese Funktion.

Auch der Docker-Daemon lässt sich via systemd steuern. In der Stan­dard­in­stal­la­ti­on ist die Container-Plattform so kon­fi­gu­riert, dass der Daemon au­to­ma­tisch mit dem System-Boot startet. Diese Vor­ein­stel­lung lässt sich über das Kom­man­do­zei­len­werk­zeug systemctl in­di­vi­du­ell anpassen.

Mit systemctl senden Sie Befehle an systemd, um einen Prozess zu steuern oder dessen Status ab­zu­fra­gen. Die Syntax eines solchen Befehls ent­spricht folgendem Schema:

systemctl [OPTION] [BEFEHL]
bash

Einige Befehle beziehen sich auf bestimmte Res­sour­cen (bei­spiels­wei­se Docker). In der Ter­mi­no­lo­gie von systemd werden diese als Units (Einheiten) be­zeich­net. In diesem Fall ergibt sich der Befehl aus der je­wei­li­gen Anweisung und dem Namen der Unit, die an­ge­spro­chen werden soll.

Möchten Sie den Autostart des Docker-Daemons ak­ti­vie­ren (enable) bzw. de­ak­ti­vie­ren (disable), nutzen Sie das Kom­man­do­zei­len­werk­zeug systemctl mit folgenden Befehlen:

sudo systemctl enable docker
sudo systemctl disable docker
bash

Das Kom­man­do­zei­len­werk­zeug systemctl erlaubt Ihnen zudem, den Status einer Unit ab­zu­fra­gen:

sudo systemctl status docker
bash

Ist die Docker-Engine auf Ihrem Ubuntu-System aktiv, sollte die Ausgabe im Terminal der auf folgendem Screen­shot ent­spre­chen:

![Die Sta­tus­ab­fra­ge via systemctl zeigt: Die Docker-Engine ist aktiv (running)](https://www.ionos.de/di­gi­tal­gui­de/fileadmin/Di­gi­tal­Gui­de/Screen­shots_2023/docker-status-aktiv-running.png “Sta­tus­ab­fra­ge via systemctl: Die Docker-Engine ist aktiv (running))

Ist Ihre Docker-Engine zum aktuellen Zeitpunkt de­ak­ti­viert, erhalten Sie die Sta­tus­an­ga­be inactive (dead). Starten Sie den Docker-Daemon in diesem Fall manuell, um Container aus­zu­füh­ren.

![Die Sta­tus­ab­fra­ge via systemctl zeigt: Die Docker-Engine ist inaktiv (dead)](https://www.ionos.de/di­gi­tal­gui­de/fileadmin/Di­gi­tal­Gui­de/Screen­shots_2023/docker-status-inaktiv.png “Sta­tus­ab­fra­ge via systemctl Die Docker-Engine ist inaktiv (dead))

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

Um den de­ak­ti­vier­ten Daemon zu starten, verwenden Sie systemctl in Kom­bi­na­ti­on mit dem Befehl start:

sudo systemctl start docker
bash

Soll der Docker-Daemon beendet werden, kommt statt­des­sen der Befehl stop zum Einsatz:

sudo systemctl stop docker
bash

Einen Neustart der Engine ver­an­las­sen 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 An­wen­de­rin­nen finden in der cloud­ba­sier­ten Registry alles, was sie benötigen, um ihrer Docker-In­stal­la­ti­on Leben ein­zu­hau­chen.

Der On­line­dienst bietet diverse of­fi­zi­el­le Re­po­si­to­rys mit mehr als 100.000 kos­ten­lo­sen Apps. Anwender haben die Mög­lich­keit, eigene Image-Archive zu erstellen und diese gemeinsam mit Ar­beits­grup­pen zu nutzen. Neben dem pro­fes­sio­nel­len Support durch das Ent­wick­ler­team finden Ein­stei­ger hier Anschluss an die Nut­zer­ge­mein­de. Ein Forum für den Community-Support steht über GitHub zur Verfügung.

Bild: Das Docker-Hub: Anmeldebereich
Ihre per­sön­li­che Docker-ID erstellen Sie kostenlos im Rahmen einer Re­gis­trie­rung / 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 per­sön­li­cher Re­po­si­to­ry-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 aus­ge­wähl­te Beta-Programme. Darüber hinaus er­mög­licht die Docker-ID einen Log-in in das Docker-Support-Center sowie in das Docker-Success-Portal und die Docker-Foren.

Der An­mel­de­pro­zess erfolgt in fünf Schritten:

  1. Docker-ID wählen: Im Rahmen der Anmeldung wählen Sie einen Be­nut­zer­na­men, der später als Ihre per­sön­li­che Docker-ID fungiert.
  2. E-Mail-Adresse angeben: Geben Sie Ihre aktuelle E-Mail-Adresse an. Beachten Sie, dass Sie die An­mel­dun­gen für das Docker-Hub via E-Mail be­stä­ti­gen müssen.
  3. Passwort wählen: Wahlen Sie ein geheimes Passwort.
  4. Anmeldung absenden: Klicken Sie auf „Sign up“, um Ihre Re­gis­trie­rung ein­zu­rei­chen. Wurden die Daten voll­stän­dig über­mit­telt, sendet Docker einen Link zur Ve­ri­fi­zie­rung Ihrer E-Mail-Adresse an das von Ihnen an­ge­ge­be­ne Postfach.
  5. E-Mail-Adresse be­stä­ti­gen: Be­stä­ti­gen Sie Ihre E-Mail-Adresse durch einen Klick auf den Ve­ri­fi­zie­rungs­link.

Die On­line­diens­te des Docker-Projekts stehen Ihnen un­mit­tel­bar nach der Re­gis­trie­rung über den Browser zur Verfügung. Hier erstellen Sie Re­po­si­to­rys und Ar­beits­grup­pen oder durch­su­chen das Docker-Hub via „Explore“ nach öf­fent­li­chen Res­sour­cen.

Bild: Das Dashboard des Docker-Hubs
Über das Docker-Hub-Dashboard verwalten Sie Re­po­si­to­rys und Ar­beits­grup­pen / Quelle: hub.docker.com

Al­ter­na­tiv können Sie sich via docker login direkt über das Terminal Ihres Be­triebs­sys­tems anmelden. Eine de­tail­lier­te Be­schrei­bung des Befehls finden Sie in der Docker-Do­ku­men­ta­ti­on.

Prin­zi­pi­ell steht das Docker-Hub Ihnen auch ohne Account und Docker-ID zur Verfügung. In diesem Fall lassen sich jedoch aus­schließ­lich Images aus öf­fent­li­chen Re­po­si­to­rys laden. Ein Upload (push) eigener Images ist ohne Docker-ID nicht möglich.

Re­po­si­to­rys im Docker-Hub erstellen

Der kos­ten­lo­se Docker-Hub-Account umfasst ein privates Re­po­si­to­ry und bietet Ihnen die Mög­lich­keit, beliebig viele öf­fent­li­che Re­po­si­to­rys zu erstellen. Sollten Sie weitere private Re­po­si­to­rys benötigen, können Sie diese mit einem kos­ten­pflich­ti­gen Upgrade frei­schal­ten.

Um ein Re­po­si­to­ry anzulegen, gehen Sie fol­gen­der­ma­ßen vor:

  1. Namespace wählen: Neu erstellte Re­po­si­to­rys werden au­to­ma­tisch dem Namespace Ihrer Docker-ID zu­ge­ord­net. Al­ter­na­tiv haben Sie die Mög­lich­keit, die ID einer Or­ga­ni­sa­ti­on anzugeben, der Sie angehören.
  2. Re­po­si­to­ry benennen: Geben Sie einen Namen für das neu erstellte Re­po­si­to­ry an.
  3. Be­schrei­bung hin­zu­fü­gen: Fügen Sie eine Be­schrei­bung für Ihre Re­po­si­to­ry hinzu.
  4. Sicht­bar­keit ein­stel­len: Ent­schei­den Sie, ob das Re­po­si­to­ry öf­fent­lich sichtbar (public) oder nur Ihnen oder Ihrer Or­ga­ni­sa­ti­on zu­gäng­lich (private) sein soll.

Be­stä­ti­gen Sie Ihre Angaben mit einem Klick auf „Create“.

Bild: Das Docker-Hub: Eingabemaske zur Erstellung eines Repositorys
Ihre Re­po­si­to­rys werden au­to­ma­tisch im Namespace ihrer Docker-ID erstellt / Quelle: hub.docker.com

Teams & Or­ga­ni­sa­tio­nen erstellen

Mit dem Hub bietet Docker Ihnen eine cloud­ba­sier­te Plattform, auf der Sie selbst­er­stell­te Images zentral verwalten und bequem mit Ar­beits­grup­pen teilen. In der Docker-Ter­mi­no­lo­gie werden diese Or­ga­ni­sa­tio­nen genannt. Genau wie Nutzer-Accounts erhalten Or­ga­ni­sa­tio­nen in­di­vi­du­el­le IDs, über die sich Images be­reit­stel­len und her­un­ter­la­den lassen. Rechte und Rollen innerhalb einer Or­ga­ni­sa­ti­on lassen sich über Teams zuordnen. So haben bei­spiels­wei­se nur Nutzer, die dem Team „Owners“ zu­ge­ord­net wurden, die Be­rech­ti­gung, private oder öf­fent­li­che Re­po­si­to­rys anzulegen und Zu­griffs­rech­te zu vergeben.

Auch Ar­beits­grup­pen erstellen und verwalten Sie direkt über das Dashboard. Weitere In­for­ma­tio­nen zum Umgang mit Or­ga­ni­sa­tio­nen und Teams finden Sie in der Docker-Do­ku­men­ta­ti­on.

So arbeiten Sie mit Images und Con­tai­nern

Als erste An­lauf­stel­le für of­fi­zi­el­le Docker-Res­sour­cen stellt das Docker-Hub den Aus­gangs­punkt unserer Ein­füh­rung in den Umgang mit Images und Con­tai­nern dar. Das Ent­wick­lungs­team stellt hier u. a. das Demo-Image whalesay zur Verfügung, das als Grundlage für das nach­fol­gen­de Docker-Tutorial dienen soll.

Docker-Images her­un­ter­la­den

Das whalesay-Image finden Sie, indem Sie die Start­sei­te des Docker-Hubs aufrufen und den Begriff whalesay in die Such­leis­te rechts neben dem Docker-Logo eingeben.

Bild: Die Suchfunktion im Docker-Hub
Durch­su­chen Sie das Docker-Hub über die Such­leis­te oder die Schalt­flä­che „Explore“ / hub.docker.com

Klicken Sie in den Such­ergeb­nis­sen auf die Ressource mit der Be­zeich­nung docker/whalesay, um das öf­fent­li­che Re­po­si­to­ry für dieses Image auf­zu­ru­fen.

Docker-Re­po­si­to­rys sind immer nach demselben Muster aufgebaut: Im Kopf­be­reich der Seite finden Nutzer die Be­zeich­nung des Images, die Kategorie des Re­po­si­to­rys sowie den Zeitpunkt des letzten Uploads (last pushed).

Bild: Webansicht eines Docker-Repositorys
Im Re­po­si­to­ry finden Nutzer in der Regel alle In­for­ma­tio­nen, die für den Einsatz des Images benötigt werden / Quelle: hub.docker.com

Darüber hinaus bietet jedes Docker-Re­po­si­to­ry folgende Info-Boxen:

  • De­scrip­ti­on: aus­führ­li­che Be­schrei­bung, in der Regel inklusive Ge­brauchs­an­wei­sung
  • Docker Pull Command: Kom­man­do­zei­len­be­fehl, um das Image aus dem Re­po­si­to­ry her­un­ter­zu­la­den (pull)
  • Owner: In­for­ma­ti­on über den Ersteller des Re­po­si­to­rys
  • Comments: Kom­men­tar­be­reich am Sei­ten­en­de

Den In­for­ma­ti­ons­bo­xen des Re­po­si­to­rys lässt sich entnehmen, dass es sich bei whalesay um eine Mo­di­fi­ka­ti­on des quell­of­fe­nen Perl-Skripts cowsay handelt. Das von Tony Monroe im Jahr 1999 ent­wi­ckel­te Programm generiert in seiner Ur­sprungs­form eine ASCII-Grafik in Form einer Kuh, die zusammen mit einer Nachricht im Terminal des Benutzers erscheint.

Um docker/whalesay her­un­ter­zu­la­den, benutzen Sie den Befehl docker pull nach folgendem Grund­sche­ma:

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

Der Befehl docker pull weist den Daemon an, ein Image aus dem Re­po­si­to­ry zu laden. Um welches Image es sich handelt, bestimmen Sie durch die Angabe der Image-Be­zeich­nung (NAME). Darüber hinaus können Sie Docker anweisen, wie der ge­wünsch­te Befehl aus­ge­führt werden soll (OPTIONS). Ebenfalls optional ist die Angabe von Tags (:TAG) und ein­deu­ti­gen Iden­ti­fi­ka­ti­ons­num­mern (@DIGEST), die es er­mög­li­chen, eine bestimmte Version eines Images her­un­ter­zu­la­den.

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 über­sprin­gen. Möchten Sie einen Container starten, lädt der Docker-Daemon Images, die er auf dem lokalen System nicht finden kann, au­to­ma­tisch aus dem Re­po­si­to­ry herunter.

Docker-Images als Container starten

Um ein Docker-Image zu starten, nutzen Sie den Befehl docker run nach folgendem Grund­sche­ma:

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

Einziger ob­li­ga­to­ri­scher Be­stand­teil des Befehls docker run ist die Be­zeich­nung des ge­wünsch­ten Docker-Images. Auch wenn Sie Container starten, haben Sie die Mög­lich­keit, fa­kul­ta­ti­ve Optionen, TAGs und DIGESTs zu de­fi­nie­ren. Darüber hinaus lässt sich der Befehl docker run mit weiteren Befehlen kom­bi­nie­ren, die aus­ge­führt werden, sobald der Container startet. In diesem Fall wird der vom Image-Ersteller de­fi­nier­te CMD (COMMAND, ein Befehl, der beim Starten des Con­tai­ners au­to­ma­tisch aus­ge­führt wird) über­schrie­ben. Weitere optionale Kon­fi­gu­ra­tio­nen lassen sich durch zu­sätz­li­che Argumente (ARG…) de­fi­nie­ren. Diese er­mög­li­chen es bei­spiel­wei­se, Benutzer hin­zu­zu­fü­gen oder Um­ge­bungs­va­ria­blen (En­vi­ron­ment-Variables) zu übergeben.

Nutzen Sie den Kom­man­do­zei­len­be­fehl

docker run docker/whalesay cowsay boo
bash

um das als Image vor­lie­gen­de Perl-Skript her­un­ter­zu­la­den und in einem Container aus­zu­füh­ren. Sie werden sehen, dass sich whalesay in einem we­sent­li­chen Punkt vom Ur­sprungs­skript un­ter­schei­det.

Bild: Terminalausgabe des Containers docker/whalesay: Der Wal sagt boo
Wird docker/whalesay mit dem Stan­dard­be­fehl aus­ge­führt, be­schränkt sich der Docker-Wal auf ein kurzes boo

Wird das Image docker/whalesay aus­ge­führt, gibt das Skript eine ASCII-Grafik in Form eines Wals sowie die mit dem cowsay-Befehl über­ge­be­ne Text­nach­richt „boo“ im Terminal aus.

Wie beim Testlauf sucht der Daemon das ge­wünsch­te Image zunächst im lokalen Da­tei­ver­zeich­nis. Da sich hier kein gleich­na­mi­ges Paket findet, wird ein Pulling aus dem Docker-Re­po­si­to­ry ein­ge­lei­tet. An­schlie­ßend startet der Daemon das mo­di­fi­zier­te Cowsay-Programm. Ist dieses durch­ge­lau­fen, wird der Container au­to­ma­tisch beendet.

Wie cowsay bietet Ihnen auch Dockers whalesay die Mög­lich­keit, in den Pro­gramm­ab­lauf ein­zu­grei­fen, um die Text­aus­ga­be im Terminal zu be­ein­flus­sen. Testen Sie diese Funktion, indem Sie das „boo“ im Aus­gangs­be­fehl durch eine beliebige Zei­chen­fol­ge 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
Bild: 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 be­stimm­tes Image bereits her­un­ter­ge­la­den haben, können Sie eine Übersicht aller Images auf Ihrem lokalen System aufrufen. Nutzen sie dazu folgenden Kom­man­do­zei­len­be­fehl:

sudo docker images
bash

Der Befehl docker images (al­ter­na­tiv docker image ls) gibt Ihnen alle lokalen Images inklusive Da­tei­grö­ße, Tag und Image-ID aus.

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

Starten Sie einen Container, wird das zu­grun­de­lie­gen­de Image als Kopie aus dem Re­po­si­to­ry her­un­ter­ge­la­den und dauerhaft auf Ihrem Computer ge­spei­chert. So sparen Sie Zeit, falls Sie zu einem späteren Zeitpunkt erneut auf das be­tref­fen­de Image zugreifen möchten. Ein erneuter Download wird nur dann ein­ge­lei­tet, wenn sich die Image-Quelle verändert – bei­spiels­wei­se, wenn im Re­po­si­to­ry eine ak­tu­el­le­re 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 aus­ge­führt werden oder in der Ver­gan­gen­heit aus­ge­führt wurden, nutzen Sie den Kom­man­do­zei­len­be­fehl docker ps in Kom­bi­na­ti­on mit der Option --all (kurz: -a):

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

Die Ter­mi­nal­aus­ga­be umfasst In­for­ma­tio­nen wie die jeweilige Container-ID, das zu­grun­de­lie­gen­de Image, den Befehl, der beim Starten des Con­tai­ners aus­ge­fü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 aus­ge­führt werden, nutzen Sie den Kom­man­do­zei­len­be­fehl 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 her­un­ter­lädt und auf jedem be­lie­bi­gen System ausführt, auf dem die Docker-Engine in­stal­liert wurde. Mit Docker steht Ihnen jedoch nicht nur das um­fang­rei­che App-Angebot der Registry zur Verfügung. Die Plattform bietet Ihnen darüber hinaus weit­rei­chen­de Mög­lich­kei­ten, eigene Images zu erstellen und diese mit anderen Ent­wick­lern zu teilen.

Bereits in den ein­lei­ten­den Kapiteln dieses Tutorials haben Sie erfahren, dass jedes Docker-Image auf einem Do­cker­file basiert. Do­cker­files können Sie sich als eine Art Bau­an­lei­tung für Images vor­stel­len. Es handelt sich um einfache Text­da­tei­en, die alle An­wei­sun­gen enthalten, die Docker benötigt, um ein Image zu erstellen. Lernen Sie in den folgenden Schritten, wie Sie ein solches Do­cker­file schreiben und Docker anweisen, dieses als Grundlage für ein eigenes Image zu verwenden.

  1. Neues Ver­zeich­nis anlegen: Das Docker-Ent­wick­ler­team empfiehlt, für jedes Do­cker­file ein eigenes Ver­zeich­nis anzulegen. Ver­zeich­nis­se erstellen Sie unter Linux bequem über das Terminal. Verwenden Sie folgenden Kom­man­do­zei­len­be­fehl, um ein Ver­zeich­nis mit dem Namen my­do­cker­build zu erstellen:
mkdir mydockerbuild
bash
Bild: Ubuntu-Terminal: Der Befehl mkdir
Neue Ver­zeich­nis­se erstellen Sie mit dem Befehl mkdir
  1. In das neue Ver­zeich­nis na­vi­gie­ren: Nutzen Sie den Befehl cd, um in das neu erstellte Ar­beits­ver­zeich­nis zu na­vi­gie­ren.
cd mydockerbuild
bash
Bild: Ubuntu-Terminal: der Befehl cd
Mithilfe des Befehls cd wechseln Sie in ein anderes Ar­beits­ver­zeich­nis
  1. Neue Textdatei erstellen: Auch Text­da­tei­en erstellen Sie unter Ubuntu bequem über das Terminal. Verwenden Sie dazu einen Editor wie Nano oder Vim. Erstellen Sie im Ver­zeich­nis my­do­cker­build eine Textdatei mit dem Namen Do­cker­file.
nano Dockerfile
bash
Bild: Ubuntu-Terminal: Textdateien mit Nano erstellen
Der Text­edi­tor Nano ist bei allen Ubuntu-Versionen vor­in­stal­liert
  1. Do­cker­file schreiben: Die neu erstellte Textdatei dient als Bauplan für Ihr selbst ent­wi­ckel­tes Image. Statt das Image von Grund auf neu zu pro­gram­mie­ren, nutzen wir in diesem Docker-Tutorial das Demo-Image docker/whalesay als Vorlage. Dieses binden Sie über den Befehl FROM in Ihr Do­cker­file 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 Kom­bi­na­ti­on mit dem Befehl zum Starten des Con­tai­ners ein­ge­ge­ben haben. In­ter­es­san­ter wäre es jedoch, wenn das Skript au­to­ma­tisch immer wieder neue Text­aus­ga­ben ge­ne­rie­ren würde. Umsetzen lässt sich dies bei­spiels­wei­se mithilfe des Programms fortunes, das auf jedem Linux-System zur Verfügung steht. Die Grund­funk­ti­on von Fortunes besteht darin, Glücks­keks-Sprüche und hu­mor­vol­le Apho­ris­men zu ge­ne­rie­ren. Nutzen Sie folgenden Befehl, um Ihren lokalen Paket-Index zu ak­tua­li­sie­ren und fortunes zu in­stal­lie­ren:

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

An­schlie­ßend de­fi­nie­ren Sie ein CMD-Statement. Dieses wird nach dem Befehl RUN aus­ge­führt, sofern es beim Aufruf (docker run image CMD) nicht über­schrie­ben wurde. Verwenden Sie folgenden Befehl, um das Programm fortunes mit der Option -a („Wähle aus allen Da­ten­ban­ken) aus­zu­füh­ren und die Ausgabe über das Programm cowsay im Terminal anzeigen zu lassen:

CMD /usr/games/fortune -a | cowsay

Ihr Do­cker­file sollte nun fol­gen­der­ma­ß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 Do­cker­files sind immer einzeilig und beginnen stets mit einem Schlüs­sel­wort. Die zu­grun­de­lie­gen­de Syntax ist case-in­sen­si­ti­ve – es ist also egal, ob Sie groß- oder klein­schrei­ben. Es hat sich jedoch eine kon­se­quen­te Groß­schrei­bung von Schlüs­sel­wör­tern etabliert.

Bild: Der Texteditor Nano im Ubuntu-Terminal
Den Text­edi­tor Nano steuern Sie über die in der Fußzeile an­ge­ge­be­nen Tas­ten­kom­bi­na­tio­nen
  1. Textdatei speichern: Speichern Sie Ihre Eingabe. Sollten Sie den Editor Nano verwenden, nutzen Sie dazu die Tas­ten­kom­bi­na­ti­on [STRG] + [O] und be­stä­ti­gen Sie mit [ENTER]. Nano gibt Ihnen die Meldung aus, dass drei Zeilen in die aus­ge­wähl­te Datei ge­schrie­ben wurden. Beenden Sie den Text­edi­tor mit der Tas­ten­kom­bi­na­ti­on [STRG] + [X].
  2. Image aus Do­cker­file erstellen: Um ein Image aus einem Do­cker­file zu erstellen, na­vi­gie­ren Sie zunächst in das Ver­zeich­nis, in dem Sie die Textdatei abgelegt haben. Die Image-Er­stel­lung starten Sie mit dem Kom­man­do­zei­len­be­fehl docker build. Möchten Sie das Image in­di­vi­du­ell benennen oder mit einem Tag versehen, verwenden Sie die Option -t sowie nach­fol­gend die ge­wünsch­te Kom­bi­na­ti­on aus Be­zeich­nung und Tag. Es gilt das Stan­dard­for­mat name:tag.

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

docker build -t docker-whale .
bash

Der ab­schlie­ßen­de Punkt gibt an, dass sich das zu­grun­de­lie­gen­de Do­cker­file im aus­ge­wähl­ten Ver­zeich­nis befindet. Al­ter­na­tiv haben Sie die Mög­lich­keit, einen Dateipfad oder eine URL zu den Quell­da­tei­en 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 Er­stel­lung des Images benötigt werden. In der Docker-Ter­mi­no­lo­gie werden diese unter dem Begriff „Context“ zu­sam­men­ge­fasst. Im Anschluss wird das Image docker/whalesay mit dem Tag :latest lo­ka­li­siert. Liegt der für die Image-Er­stel­lung benötigte Context voll­stän­dig vor, startet der Docker-Daemon die via FROM ein­ge­bun­de­ne Image-Vorlage in einem tem­po­rä­ren Container und geht zum nächsten Befehl im Do­cker­file über. Im aktuellen Beispiel handelt es sich dabei um den RUN-Befehl, der die In­stal­la­ti­on des fortunes-Programms zur Folge hat.

Am Ende jedes Schritts im Rahmen der Image-Er­stel­lung gibt Docker Ihnen eine ID für den ent­spre­chen­den Layer (Schicht) aus, der in diesem Schritt erstellt wurde. Dabei gilt: Jede Zeile im zu­grun­de­lie­gen­den Do­cker­file ent­spricht einem Layer des darauf auf­bau­en­den Images.

Wurde der RUN-Befehl beendet, stoppt der Docker-Daemon den dafür er­stell­ten Container, entfernt diesen und startet einen neuen tem­po­rä­ren Container für das Layer des CMD-State­ments. Am Ende des Er­stel­lungs­pro­zes­ses wird auch dieser temporäre Container beendet und entfernt. Docker gibt Ihnen die ID des neuen Images aus:

Successfully built a8f2048c9ab8
Bild: Ubuntu-Terminal: Statusmeldungen während der Image-Erstellung
Docker-Images werden in mehreren Layern erstellt

Ihr neu er­stell­tes Image finden Sie unter dem Namen docker-whale in der Übersicht ihrer lokal ge­spei­cher­ten Images.

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

Um einen Container aus Ihrem neu er­stell­ten Image zu starten, verwenden Sie den Kom­man­do­zei­len­be­fehl sudo docker run in Kom­bi­na­ti­on mit dem Namen des Images:

sudo docker run docker-whale
bash

Wurde das Image feh­ler­frei aus dem Do­cker­file erstellt, sollte Ihr Wal Sie nun mit mehr oder weniger weisen Sprüchen be­geis­tern. Beachten Sie: Jedes Mal, wenn Sie den Container neu starten, wird ein anderer Spruch generiert.

Bild: Container auf Basis von docker-whale: Textausgabe im Terminal
Dank fortunes gibt der ASCII-Wal nun Apho­ris­men zum Besten
Tipp

Wie Sie Docker-Images erstellen erfahren Sie noch de­tail­lier­ter in unserem separaten Artikel.

Docker-Images taggen und ins Docker-Hub hochladen

Möchten Sie Ihr selbst­er­stell­tes Image docker-whale ins Hub laden, um es dort der Community oder einer Ar­beits­grup­pe zur Verfügung zu stellen, müssen Sie es zunächst mit einem gleich­na­mi­gen Re­po­si­to­ry in Ihrem per­sön­li­chen Namespace ver­knüp­fen. In der Docker-Ter­mi­no­lo­gie wird dieser Schritt Tagging genannt.

Um ein Image über das Docker-Hub zu ver­öf­fent­li­chen, gehen Sie fol­gen­der­ma­ßen vor:

  1. Re­po­si­to­ry erstellen: Loggen Sie sich mit Ihrer Docker-ID und dem per­sön­li­chen Passwort im Docker-Hub ein und erstellen Sie ein öf­fent­li­ches Re­po­si­to­ry mit dem Namen docker-whale.
Bild: Das Docker-Hub: Eingabemaske zur Erstellung eines Repositorys
Legen Sie ein Re­po­si­to­ry für Ihr selbst­er­stell­tes Image an / Quelle: hub.docker.com
  1. Image-ID ermitteln: Ermitteln Sie die ID Ihres selbst­er­stell­ten Images docker-whale mithilfe des Kom­man­do­zei­len­be­fehls docker images.
Bild: Übersicht aller lokalen Images im Ubuntu-Terminal
Der Befehl docker images listet alle Images auf, die auf Ihrem System ge­spei­chert 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 Kom­man­do­zei­len­be­fehls docker tag nach folgendem Schema:
sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
bash

Auf das aktuelle Beispiel bezogen lautet der Kom­man­do­zei­len­be­fehl für das Tagging somit:

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

Ob Ihr Image korrekt getaggt wurde, über­prü­fen Sie in der Übersicht via docker images. Der Name des Re­po­si­to­rys sollte nun Ihre Docker-ID be­inhal­ten.

Bild: Ubuntu-Terminal: Image-Übersicht vor und nach dem Tagging
Mit dem Befehl docker tag ver­knüp­fen Sie Images mit Ihrer Docker-ID
  1. Image hochladen: Um das Image hoch­zu­la­den, müssen Sie sich zunächst im Docker-Hub anmelden. Dies erfolgt über den Kom­man­do­zei­len­be­fehl docker login.
sudo docker login
bash

Das Terminal fordert Sie auf, Ihren Be­nut­zer­nah­men (die Docker-ID) sowie ihr Passwort ein­zu­ge­ben.

Bild: 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 er­folg­reich, verwenden Sie den Kom­man­do­zei­len­be­fehl docker push, um Ihr Image in das neu erstellte Re­po­si­to­ry hoch­zu­la­den.

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 aus­ge­ge­ben.

Bild: 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 hoch­ge­la­de­ne Image anzeigen zu lassen.

Bild: Docker-Hub: Das Repository [Namespace]/docker-whale in der Detailansicht
Die letzte Ak­tua­li­sie­rung Ihres Re­po­si­to­rys wird Ihnen in der De­tail­an­sicht angezeigt / Quelle: hub.docker.com

Möchten Sie mehr als ein Image pro Re­po­si­to­ry hochladen, verwenden Sie ver­schie­de­ne Tags, um Ihre Images in un­ter­schied­li­chen Versionen an­zu­bie­ten. Bei­spiels­wei­se:

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

Eine Übersicht ver­schie­de­ner Image-Versionen lässt sich in Docker-Hub-Re­po­si­to­rys über den Reiter „Tags“ abrufen.

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

Images ver­schie­de­ner Projekte hingegen sollten in separaten Re­po­si­to­rys angeboten werden.

War der Upload er­folg­reich, steht Ihr selbst­er­stell­tes Image nun jedem Docker-Nutzer weltweit über das öf­fent­li­che Re­po­si­to­ry zur Verfügung.

  1. Testlauf: Testen Sie den Erfolg des Uploads, indem Sie das soeben hoch­ge­la­de­ne Image her­un­ter­la­den.

Beachten Sie, dass Sie die lokale Version des Images zunächst löschen müssen, um eine neue Kopie mit demselben Tag her­un­ter­zu­la­den. An­dern­falls meldet Docker, dass das ge­wünsch­te Image bereits in der aktuellen Version vorliegt.

Bild: Statusmeldung: „Image is up to date“ („Die lokale Kopie ist aktuell)
Liegt ein Image lokal vor, wird der Pull-Befehl ab­ge­bro­chen

Um lokale Docker-Images zu löschen, nutzen Sie den Kom­man­do­zei­len­be­fehl docker rmi in Kom­bi­na­ti­on mit der ent­spre­chen­den Image-ID. Diese ermitteln Sie wie gehabt via docker images. Meldet Docker Konflikte – z. B. weil eine Image-ID in mehreren Re­po­si­to­rys oder von einem Container verwendet wird –, be­kräf­ti­gen Sie Ihren Befehl mit der Option --force (Kurz: -f), um den Lösch­vor­gang zu erzwingen.

sudo docker rmi -f a8f2048c9ab8
bash
Bild: Befehl docker rmi in Kombination mit der Option -f (force)
Nutzen Sie den Befehl docker rmi in Kom­bi­na­ti­on mit der Option -f, um einen Lösch­vor­gang zu erzwingen

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

sudo docker Images
bash

Die ge­lösch­ten Elemente sollten in der Terminal-Ausgabe nicht mehr auf­tau­chen. Nutzen Sie nun den im Re­po­si­to­ry an­ge­ge­be­nen Pull-Befehl, um eine neue Kopie des Images aus dem Docker-Hub her­un­ter­zu­la­den:

sudo docker pull [Namespace]/docker-whale
bash
Bild: Ubuntu-Terminal: Download aus dem Docker-Hub
Das zuvor ver­öf­fent­lich­te Image wurde er­folg­reich her­un­ter­ge­la­den

Weitere Docker-Themen und Tutorials

Das Docker-Universum ist groß. Im Laufe der Zeit hat sich ein le­ben­di­ges Ökosystem aus Docker-Tools ent­wi­ckelt. In­ter­es­sant wird Docker für Ad­mi­nis­tra­to­ren vor allem dann, wenn komplexe An­wen­dun­gen mit mehreren Con­tai­nern parallel auf ver­schie­de­nen Systemen betrieben werden. Docker bietet dazu diverse Funk­tio­nen zur Or­ches­trie­rung eines solches Clusters. Näheres dazu finden Sie in unserm wei­ter­füh­ren­den Artikel über Docker-Or­chestra­ti­on mit Swarm und Compose.

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

Docker eignet sich für die ver­schie­dens­ten An­wen­dungs­sze­na­ri­os. Im Digital Guide finden Sie folgende Tutorials:

Nicht immer ist Docker für jede Anwendung die beste Wahl. Wir zeigen die wich­tigs­ten Docker-Al­ter­na­ti­ven im Überblick. Zudem haben wir einige Al­ter­na­ti­ven im Detail mit Docker ver­gli­chen:

Zum Hauptmenü