Einführung
Docker ist ein Programm, das die Verwaltung von Anwendungsprozessen in Containern vereinfacht. Container ermöglichen es, Anwendungen in ressourcenisolierten Prozessen auszuführen. Sie ähneln virtuellen Maschinen, sind aber portabler, ressourcenschonender und weniger abhängig vom Host-Betriebssystem.
Eine detaillierte Einführung in die verschiedenen Komponenten eines Docker-Containers finden Sie unter „Das Docker-Ökosystem: Eine Einführung in gängige Komponenten“.
In diesem Tutorial installieren und verwenden Sie Docker Community Edition (CE) unter Ubuntu 20.04. Sie installieren Docker selbst, arbeiten mit Containern und Images und übertragen ein Image in ein Docker-Repository.
Notiz
Dieser Artikel führt Sie durch die Installation von Docker auf einem Ubuntu-Server. Wenn Sie eine Docker-Anwendung mit nur einem Klick auf einem Live-Server bereitstellen möchten, werfen Sie einen Blick auf die Anwendungsplattform von DigitalOcean.
Voraussetzungen
Um dieser Anleitung zu folgen, benötigen Sie Folgendes:
- Ein Ubuntu 20.04 Server wurde gemäß der Anleitung zur Ersteinrichtung des Ubuntu 20.04 Servers eingerichtet, einschließlich eines sudo-Benutzers ohne Root-Rechte und einer Firewall.
- Wie in den Schritten 7 und 8 gezeigt, benötigen Sie ein Docker Hub-Konto, wenn Sie Ihre eigenen Images erstellen und diese auf Docker Hub hochladen möchten.
Schritt 1 – Docker installieren
Das im offiziellen Ubuntu-Repository verfügbare Docker-Installationspaket ist möglicherweise nicht die aktuellste Version. Um sicherzustellen, dass Sie die neueste Version erhalten, installieren wir Docker aus dem offiziellen Docker-Repository. Dazu fügen wir eine neue Paketquelle hinzu, geben den GPG-Schlüssel von Docker ein, um gültige Downloads zu gewährleisten, und installieren anschließend das Paket.
Aktualisieren Sie zunächst Ihre Liste der verfügbaren Pakete:
sudo apt update
Installieren Sie anschließend einige erforderliche Pakete, die es apt ermöglichen, Pakete über HTTPS zu verwenden:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Fügen Sie anschließend den offiziellen Docker-Repository-GPG-Schlüssel zu Ihrem System hinzu:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Fügen Sie das Docker-Repository zu den APT-Quellen hinzu:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Dadurch wird auch unsere Paketdatenbank mit Docker-Paketen aus dem neu hinzugefügten Repository aktualisiert.
Stellen Sie sicher, dass Sie die Installation aus dem Docker-Repository und nicht aus dem standardmäßigen Ubuntu-Repository durchführen:
apt-cache policy docker-ce
Sie sehen eine Ausgabe wie diese, wobei die Docker-Versionsnummer abweichen kann:
docker-ce:
Installed: (none)
Candidate: 5:19.03.9~3-0~ubuntu-focal
Version table:
5:19.03.9~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 PackagesBeachten Sie, dass docker-ce nicht installiert ist, aber als Installationskandidat aus dem Docker-Repository für Ubuntu 20.04 (canonical) verfügbar ist.
Installieren Sie abschließend Docker:
sudo apt install docker-ce
Docker sollte nun installiert, der Daemon gestartet und der Prozess so konfiguriert sein, dass er beim Systemstart automatisch gestartet wird. Überprüfen Sie, ob er ausgeführt wird:
sudo systemctl status docker
Die Ausgabe sollte in etwa wie folgt aussehen und darauf hinweisen, dass der Dienst betriebsbereit ist:
Output
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 24321 (dockerd)
Tasks: 8
Memory: 46.4M
CGroup: /system.slice/docker.service
└─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockDie Installation von Docker stellt Ihnen nicht nur den Docker-Dienst (Daemon) zur Verfügung, sondern auch das Docker-Befehlszeilentool bzw. den Docker-Client. Im weiteren Verlauf dieses Tutorials werden wir uns mit der Verwendung des Docker-Befehls befassen.
Schritt 2 – Docker-Befehl ohne Sudo ausführen (optional)
Standardmäßig kann der Docker-Befehl nur vom Root-Benutzer oder einem Benutzer der Docker-Gruppe ausgeführt werden, die während der Docker-Installation automatisch erstellt wird. Wenn Sie versuchen, den Docker-Befehl ohne das Präfix „sudo“ oder ohne Mitgliedschaft in der Docker-Gruppe auszuführen, erhalten Sie eine Ausgabe wie die folgende:
Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.Wenn Sie beim Ausführen des Docker-Befehls die Eingabe von sudo vermeiden möchten, fügen Sie Ihren Benutzernamen der Docker-Gruppe hinzu:
sudo usermod -aG docker ${USER}
Um die neue Gruppenzugehörigkeit anzuwenden, melden Sie sich vom Server ab und wieder an oder geben Sie Folgendes ein:
su - ${USER}
Um fortzufahren, werden Sie zur Eingabe Ihres Benutzerpassworts aufgefordert.
Überprüfen Sie, ob Ihr Benutzer nun der Docker-Gruppe hinzugefügt wurde, indem Sie Folgendes eingeben:
groups
sammy sudo docker
Wenn Sie einen Benutzer zur Docker-Gruppe hinzufügen müssen, mit dem Sie nicht angemeldet sind, geben Sie diesen Benutzernamen explizit an mit:
sudo usermod -aG docker usernameIm Folgenden wird davon ausgegangen, dass Sie den Docker-Befehl als Benutzer der Docker-Gruppe ausführen. Falls Sie dies nicht wünschen, fügen Sie den Befehlen bitte `sudo` hinzu.
Schauen wir uns als Nächstes den Docker-Befehl an.
Schritt 3 – Verwendung des Docker-Befehls
Die Verwendung von Docker erfordert das Übergeben einer Kette von Optionen und Befehlen, gefolgt von Argumenten. Die Syntax lautet wie folgt:
docker [option] [command] [arguments]
Um alle verfügbaren Unterbefehle anzuzeigen, geben Sie Folgendes ein:
dockerAb Docker 19 umfasst die vollständige Liste der verfügbaren Unterbefehle Folgendes:
Output
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
Um die verfügbaren Optionen für einen bestimmten Befehl anzuzeigen, geben Sie Folgendes ein:
docker docker-subcommand --help
Um systemweite Informationen zu Docker anzuzeigen, verwenden Sie Folgendes:
docker info
Lassen Sie uns einige dieser Befehle genauer betrachten. Wir beginnen mit der Arbeit mit Bildern.
Schritt 4 – Arbeiten mit Docker-Images
Docker-Container werden aus Docker-Images erstellt. Standardmäßig bezieht Docker diese Images von Docker Hub, einer Docker-Registry, die von Docker, dem Unternehmen hinter dem Docker-Projekt, betrieben wird. Jeder kann seine eigenen Docker-Images auf Docker Hub hosten, daher sind die meisten benötigten Anwendungen und Linux-Distributionen dort als Images verfügbar.
Um zu prüfen, ob Sie auf Docker Hub zugreifen und Images herunterladen können, geben Sie Folgendes ein:
docker run hello-world
Die Ausgabe zeigt, dass Docker ordnungsgemäß funktioniert:
Output
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...Docker konnte das Hello-World-Image zunächst nicht lokal finden und lud es daher von Docker Hub herunter, dem Standard-Repository. Nach dem Herunterladen erstellte Docker einen Container aus dem Image, und die darin enthaltene Anwendung wurde ausgeführt und zeigte die Meldung an.
Sie können auf Docker Hub nach Images suchen, indem Sie den Docker-Befehl mit dem Unterbefehl `search` verwenden. Um beispielsweise nach einem Ubuntu-Image zu suchen, geben Sie Folgendes ein:
docker search ubuntu
Das Skript durchsucht Docker Hub und gibt eine Liste aller Images zurück, deren Namen der Suchzeichenfolge entsprechen. In diesem Fall sieht die Ausgabe etwa so aus:
Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 218 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with
...
In der Spalte „OFFIZIELL“ bedeutet „OK“, dass es sich um ein Image handelt, das vom Unternehmen hinter dem Projekt erstellt und unterstützt wird. Sobald Sie das gewünschte Image ausgewählt haben, können Sie es mit dem Unterbefehl „pull“ auf Ihren Computer herunterladen.
Führen Sie folgenden Befehl aus, um das offizielle Ubuntu-Image auf Ihren Computer herunterzuladen:
docker pull ubuntu
Sie sehen folgende Ausgabe:
Output
Using default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latestNach dem Herunterladen eines Images können Sie mit dem Unterbefehl `run` einen Container mit diesem Image starten. Wie Sie im Hello-World-Beispiel gesehen haben, lädt der Docker-Client das Image zuerst herunter, wenn beim Ausführen von `docker` mit dem Unterbefehl `run` noch kein Image heruntergeladen wurde, und startet anschließend einen Container damit.
Um die auf Ihren Computer heruntergeladenen Bilder anzuzeigen, geben Sie Folgendes ein:
docker images
Das Ergebnis wird in etwa der folgenden Abbildung entsprechen:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
hello-world latest bf756fb1ae65 4 months ago 13.3kBWie Sie später in diesem Tutorial sehen werden, können die Images, die Sie zum Ausführen von Containern verwenden, modifiziert und zur Erstellung neuer Images verwendet werden, die dann auf Docker Hub oder andere Docker-Registries (das ist der Fachbegriff) hochgeladen werden können.
Lassen Sie uns genauer untersuchen, wie Container funktionieren.
Schritt 5 – Docker-Container ausführen
Der Hello-World-Container, den Sie im vorherigen Schritt ausgeführt haben, ist ein Beispiel für einen Container, der nach dem Senden einer Testnachricht gestartet und beendet wird. Container können aber viel mehr leisten und sind interaktiv. Schließlich ähneln sie virtuellen Maschinen, sind aber ressourcenschonender.
Nehmen wir beispielsweise an, wir starten einen Container mit dem neuesten Ubuntu-Image. Die Kombination der Schalter -i und -t ermöglicht den interaktiven Shell-Zugriff auf den Container:
docker run -it ubuntu
Ihre Befehlszeile sollte sich ändern, um der Tatsache Rechnung zu tragen, dass Sie nun in einem Container arbeiten, und sollte folgendermaßen aussehen:
Output
root@d9b100f2f636:/#Notieren Sie sich die Container-ID in der Befehlszeile. In diesem Beispiel lautet sie d9b100f2f636. Sie benötigen die Container-ID später, um den Container beim Entfernen zu identifizieren.
Sie können nun beliebige Befehle innerhalb des Containers ausführen. Aktualisieren wir beispielsweise die Paketdatenbank innerhalb des Containers. Sie müssen keinem Befehl „sudo“ voranstellen, da Sie den Container als Root-Benutzer ausführen.
apt updateInstallieren Sie anschließend eine beliebige Anwendung. Installieren wir Node.js:
apt install nodejs
Es installiert Node.js aus dem offiziellen Ubuntu-Repository. Überprüfen Sie nach Abschluss der Installation, ob Node.js installiert ist:
node -v
Die Versionsnummer wird in Ihrem Terminal angezeigt:
Output
v10.19.0Änderungen, die Sie innerhalb eines Containers vornehmen, gelten nur für diesen Container.
Um den Container zu verlassen, geben Sie an der Eingabeaufforderung „exit“ ein.
Schauen wir uns als nächstes die Verwaltung von Containern in unserem System an.
Schritt 6 – Docker-Container verwalten
Nach einiger Zeit der Nutzung von Docker befinden sich viele aktive (laufende) und inaktive Container auf Ihrem Computer. Um die aktiven Container anzuzeigen, verwenden Sie:
docker ps
Sie sehen eine Ausgabe, die in etwa wie folgt aussieht:
Output
CONTAINER ID IMAGE COMMAND CREATED
In diesem Tutorial haben Sie zwei Container gestartet: einen mit dem Hello-World-Image und den anderen mit dem Ubuntu-Image. Beide Container laufen nicht mehr, sind aber weiterhin auf Ihrem System vorhanden.
Um alle Container – aktive und inaktive – anzuzeigen, führen Sie docker ps mit dem Schalter -a aus:
docker ps -a
Sie sehen eine Ausgabe, die in etwa so aussieht:
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty
a707221a5f6c hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago youthful_curie
Um den zuletzt erstellten Container anzuzeigen, übergeben Sie den Schalter -l:
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
Um einen gestoppten Container zu starten, verwenden Sie `docker start` gefolgt von der Container-ID oder dem Containernamen. Starten wir den Ubuntu-basierten Container mit der ID 1c08a7a0d0e4:
docker start 1c08a7a0d0e4docker start 1c08a7a0d0e4
Der Container wird gestartet und Sie können seinen Status mit docker ps anzeigen:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty
Um einen laufenden Container zu stoppen, verwenden Sie `docker stop` gefolgt von der Container-ID oder dem Namen. Dieses Mal verwenden wir den Namen, den Docker dem Container zugewiesen hat, nämlich `quizical_mcnulty`.
docker stop quizzical_mcnulty
Wenn Sie den Container nicht mehr benötigen, entfernen Sie ihn mit dem Befehl `docker rm`, indem Sie erneut die Container-ID oder den Namen verwenden. Verwenden Sie den Befehl `docker ps -a`, um die Container-ID oder den Namen des Hello-World-Images zu finden und ihn zu entfernen.
docker rm youthful_curie
Sie können einen neuen Container starten und ihm mit dem Parameter `--name` einen Namen geben. Mit dem Parameter `--rm` erstellen Sie einen Container, der sich nach dem Beenden selbst löscht. Weitere Informationen zu diesen und anderen Optionen finden Sie in der Hilfe des Befehls `docker run`.
Container lassen sich in Images umwandeln, mit denen Sie neue Container erstellen können. Schauen wir uns an, wie das funktioniert.
Schritt 7 – Änderungen an einem Container in einem Docker-Image vornehmen
Beim Starten eines Docker-Images können Sie Dateien erstellen, bearbeiten und löschen, genau wie bei einer virtuellen Maschine. Die vorgenommenen Änderungen gelten nur für diesen Container. Sie können ihn starten und stoppen, aber wenn Sie ihn mit dem Befehl `docker rm` löschen, sind die Änderungen unwiederbringlich verloren.
In diesem Abschnitt erfahren Sie, wie Sie den Zustand eines Containers als neues Docker-Image speichern.
Nach der Installation von Node.js in einem Ubuntu-Container verfügen Sie nun über einen laufenden Container, der auf einem Image basiert. Dieser Container unterscheidet sich jedoch von dem Image, mit dem er erstellt wurde. Sie können diesen Node.js-Container später als Grundlage für neue Images verwenden.
Nehmen Sie anschließend die Änderungen an einer neuen Docker-Image-Instanz mit dem folgenden Befehl vor.
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
Der Schalter `-m` dient zur Eingabe einer Commit-Nachricht, die Ihnen und anderen die vorgenommenen Änderungen erläutert, während `-a` den Autor angibt. Die `container_id` ist diejenige, die Sie zuvor im Tutorial beim Starten der interaktiven Docker-Sitzung angegeben haben. Sofern Sie keine zusätzlichen Repositories in Docker Hub erstellt haben, ist dies üblicherweise Ihr Docker-Hub-Benutzername.
Für den Benutzer sammy mit der Container-ID d9b100f2f636 würde der Befehl beispielsweise wie folgt lauten:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
Wenn Sie ein Image hochladen, wird das neue Image lokal auf Ihrem Computer gespeichert. Im weiteren Verlauf dieses Tutorials erfahren Sie, wie Sie ein Image in eine Docker-Registry wie Docker Hub hochladen, damit andere darauf zugreifen können.
Durch das erneute Auflisten der Docker-Images werden sowohl das neue Image als auch das alte Image, von dem es abgeleitet wurde, angezeigt:
docker images
Die Ausgabe sieht dann etwa so aus:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...
In diesem Beispiel ist ubuntu-nodejs ein neues Image, das vom bestehenden Ubuntu-Image von Docker Hub abgeleitet wurde. Der Größenunterschied verdeutlicht die vorgenommenen Änderungen. In diesem Beispiel bestand die Änderung in der Installation von NodeJS. Wenn Sie also das nächste Mal einen Container mit Ubuntu und vorinstalliertem NodeJS ausführen möchten, können Sie einfach das neue Image verwenden.
Sie können auch Images aus einer Dockerfile erstellen, wodurch Sie die Installation von Software in ein neues Image automatisieren können. Dies geht jedoch über den Rahmen dieses Tutorials hinaus.
Jetzt teilen wir das neue Image mit anderen, damit diese daraus Container erstellen können.
Schritt 8 – Docker-Images in das Docker-Repository übertragen
Der nächste logische Schritt nach der Erstellung eines neuen Images aus einem bestehenden ist, es mit ausgewählten Freunden, der gesamten Welt über Docker Hub oder anderen Docker-Registries, auf die Sie Zugriff haben, zu teilen. Um ein Image bei Docker Hub oder einer anderen Docker-Registry einzureichen, benötigen Sie dort ein Konto.
Dieser Abschnitt zeigt Ihnen, wie Sie ein Docker-Image auf Docker Hub hochladen. Informationen zum Erstellen einer eigenen privaten Docker-Registry finden Sie unter „Einrichtung einer privaten Docker-Registry unter Ubuntu 18.04“.
Um Ihr Image hochzuladen, melden Sie sich zuerst bei Docker Hub an.
docker login -u docker-registry-username
Sie werden aufgefordert, sich mit Ihrem Docker Hub-Passwort zu authentifizieren. Wenn Sie das richtige Passwort eingegeben haben, sollte die Authentifizierung erfolgreich sein.
Hinweis: Wenn sich Ihr Docker-Registry-Benutzername von dem lokalen Benutzernamen unterscheidet, mit dem Sie das Image erstellt haben, müssen Sie Ihr Image mit Ihrem Registry-Benutzernamen taggen. Im Beispiel des letzten Schritts würden Sie Folgendes eingeben:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Anschließend können Sie Ihr Bild wie folgt verwenden:
docker push docker-registry-username/docker-image-name
Um das ubuntu-nodejs-Image in das Sami-Repository zu übertragen, lautet der Befehl wie folgt:
docker push sammy/ubuntu-nodejs
Das Hochladen der Bilder kann eine Weile dauern, aber nach Abschluss sieht die Ausgabe folgendermaßen aus:
Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...Nach dem Hochladen eines Images in eine Registry sollte es in Ihrem Konto-Dashboard angezeigt werden, wie im folgenden Bild dargestellt.
Wenn der Push-Versuch zu diesem Fehler führt, sind Sie wahrscheinlich nicht angemeldet:
Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication requiredMelden Sie sich in Ihrem Docker-Konto an und versuchen Sie den Push erneut. Überprüfen Sie anschließend, ob das Projekt auf Ihrer Docker Hub-Repository-Seite angezeigt wird.
Sie können jetzt docker pull sammy/ubuntu-nodejs verwenden, um das Image auf einen neuen Rechner zu laden und damit einen neuen Container auszuführen.
Ergebnis
In diesem Tutorial haben Sie Docker installiert, mit Images und Containern gearbeitet und ein modifiziertes Image auf Docker Hub hochgeladen. Nachdem Sie nun die Grundlagen kennen, können Sie weitere Docker-Tutorials in der DigitalOcean-Community entdecken.










