Wie man Docker unter Ubuntu 22.04 installiert und verwendet

Einführung

Docker ist eine Anwendung, die den Prozess der Verwaltung von Anwendungsprozessen in Containern vereinfacht. Container ermöglichen es Ihnen, Ihre Anwendungen in ressourcenisolierten Prozessen auszuführen. Sie ähneln virtuellen Maschinen, aber Container sind portabler, ressourcenschonender und abhängiger vom Host-Betriebssystem.

Für eine ausführliche Einführung in die verschiedenen Komponenten eines Docker-Containers, lesen Sie Das Docker-Ökosystem: Eine Einführung in die gängigen Komponenten.

In diesem Tutorial werden Sie Docker Community Edition (CE) unter Ubuntu 22.04 installieren und verwenden. Sie werden Docker selbst installieren, mit Containern und Abbildern arbeiten und ein Abbild in ein Docker-Repository hochladen.

Vereinfachen Sie das Bereitstellen von Anwendungen mit DigitalOcean App Platform. Bereitstellung direkt von GitHub in wenigen Minuten.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie Folgendes:

Schritt 1 — Installation von Docker

Das Docker-Installationspaket, das im offiziellen Ubuntu-Repository verfügbar ist, ist möglicherweise nicht die neueste Version. Um sicherzustellen, dass wir die neueste Version erhalten, installieren wir Docker aus dem offiziellen Docker-Repository. Dazu fügen wir eine neue Paketquelle hinzu, fügen den GPG-Schlüssel von Docker hinzu, um sicherzustellen, dass die Downloads gültig sind, und installieren dann das Paket.

Zuerst aktualisieren Sie Ihre vorhandene Liste von Paketen:

  1. sudo apt update

Installieren Sie dann ein paar Voraussetzungspakete, die apt ermöglichen, Pakete über HTTPS zu verwenden:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

Fügen Sie dann den GPG-Schlüssel für das offizielle Docker-Repository Ihrem System hinzu:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Fügen Sie das Docker-Repository den APT-Quellen hinzu:

  1. echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Aktualisieren Sie erneut Ihre vorhandene Liste von Paketen, damit die Ergänzung erkannt wird:

  1. sudo apt update

Stellen Sie sicher, dass Sie aus dem Docker-Repository installieren, anstelle des standardmäßigen Ubuntu-Repositorys:

  1. apt-cache policy docker-ce

Sie sehen eine Ausgabe wie diese, obwohl die Versionsnummer für Docker unterschiedlich sein kann:

Output of apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

Beachten Sie, dass docker-ce nicht installiert ist, aber der Kandidat für die Installation stammt aus dem Docker-Repository für Ubuntu 22.04 (jammy).

Zum Schluss installieren Sie Docker:

  1. sudo apt install docker-ce

Docker sollte jetzt installiert sein, der Daemon gestartet sein und der Prozess aktiviert sein, um beim Booten zu starten. Überprüfen Sie, ob er läuft:

  1. sudo systemctl status docker

Die Ausgabe sollte ähnlich wie folgt sein und zeigen, dass der Dienst aktiv und ausgeführt wird:

Output
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 7854 (dockerd) Tasks: 7 Memory: 38.3M CPU: 340ms CGroup: /system.slice/docker.service └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Die Installation von Docker bietet Ihnen nicht nur den Docker-Dienst (Daemon), sondern auch das docker-Befehlszeilenprogramm oder den Docker-Client. Wir werden später in diesem Tutorial erkunden, wie man den docker-Befehl verwendet.

Schritt 2 — Ausführen des Docker-Befehls ohne Sudo (Optional)

Standardmäßig kann der docker-Befehl nur vom Benutzer root oder von einem Benutzer in der docker-Gruppe ausgeführt werden, die während des Installationsprozesses von Docker automatisch erstellt wird. Wenn Sie versuchen, den docker-Befehl ohne vorangestelltes sudo oder ohne Mitglied der docker-Gruppe auszuführen, erhalten Sie eine Ausgabe wie diese:

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.

Wenn Sie vermeiden möchten, bei jedem Ausführen des docker-Befehls sudo einzugeben, fügen Sie Ihren Benutzernamen der docker-Gruppe hinzu:

  1. sudo usermod -aG docker ${USER}

Um die neue Gruppenmitgliedschaft anzuwenden, melden Sie sich vom Server ab und wieder an oder geben Sie folgendes ein:

  1. su - ${USER}

Sie werden aufgefordert, das Passwort Ihres Benutzers einzugeben, um fortzufahren.

Bestätigen Sie, dass Ihr Benutzer jetzt zur docker-Gruppe hinzugefügt wurde, indem Sie eingeben:

  1. groups
Output
sammy sudo docker

Wenn Sie einen Benutzer zur docker-Gruppe hinzufügen müssen, als den Sie nicht angemeldet sind, geben Sie den Benutzernamen explizit an, indem Sie verwenden:

  1. sudo usermod -aG docker username

Der Rest dieses Artikels setzt voraus, dass Sie den docker-Befehl als Benutzer in der docker-Gruppe ausführen. Wenn Sie dies nicht tun möchten, fügen Sie den Befehlen bitte sudo voran.

Lassen Sie uns als Nächstes den docker-Befehl erkunden.

Schritt 3 — Verwenden des Docker-Befehls

Die Verwendung von docker besteht darin, ihm eine Kette von Optionen und Befehlen sowie Argumente zu übergeben. Die Syntax hat diese Form:

  1. docker [option] [command] [arguments]

Um alle verfügbaren Unterbefehle anzuzeigen, geben Sie ein:

  1. docker

Ab Docker-Version 20.10.14 umfasst die vollständige Liste der verfügbaren Unterbefehle:

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 ein:

  1. docker docker-subcommand --help

Um systemweite Informationen über Docker anzuzeigen, verwenden Sie:

  1. docker info

Lassen Sie uns einige dieser Befehle erkunden. Wir werden mit Bildern beginnen.

Schritt 4 — Arbeiten mit Docker-Images

Docker-Container werden aus Docker-Images erstellt. Standardmäßig lädt Docker diese Images von Docker Hub, einem von Docker verwalteten Docker-Register, dem Unternehmen hinter dem Docker-Projekt. Jeder kann seine Docker-Images auf Docker Hub hosten, sodass die meisten Anwendungen und Linux-Distributionen, die Sie benötigen, dort gehostete Images haben werden.

Um zu überprüfen, ob Sie auf Docker Hub zugreifen und Images herunterladen können, geben Sie Folgendes ein:

  1. docker run hello-world

Die Ausgabe zeigt an, dass Docker ordnungsgemäß funktioniert:

Output
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...

Anfangs konnte Docker das hello-world-Image nicht lokal finden, daher wurde das Image von Docker Hub heruntergeladen, was das Standard-Repository ist. Sobald das Image heruntergeladen wurde, erstellte Docker einen Container aus dem Image, und die Anwendung innerhalb des Containers wurde ausgeführt und die Nachricht angezeigt.

Sie können nach verfügbaren Images auf Docker Hub suchen, indem Sie das docker-Befehl mit dem search-Unterbefehl verwenden. Um beispielsweise nach dem Ubuntu-Image zu suchen, geben Sie Folgendes ein:

  1. docker search ubuntu

Das Skript wird Docker Hub durchsuchen und eine Liste aller Images zurückgeben, deren Name mit dem Suchbegriff übereinstimmt. In diesem Fall wird die Ausgabe ähnlich wie folgt sein:

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK] websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK] ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK] neurodebian NeuroDebian provides neuroscience research s… 88 [OK] open-liberty Open Liberty multi-architecture images based… 51 [OK] ...

In der OFFIZIELLEN Spalte bedeutet OK, dass es sich um ein Bild handelt, das von dem Unternehmen hinter dem Projekt erstellt und unterstützt wird. Sobald Sie das Bild identifiziert haben, das Sie verwenden möchten, können Sie es mithilfe des pull-Befehls auf Ihren Computer herunterladen.

Führen Sie den folgenden Befehl aus, um das offizielle ubuntu-Bild auf Ihren Computer herunterzuladen:

  1. docker pull ubuntu

Sie sehen die folgende Ausgabe:

Output
Using default tag: latest latest: Pulling from library/ubuntu e0b25ef51634: Pull complete Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

Nachdem ein Bild heruntergeladen wurde, können Sie dann einen Container mithilfe des heruntergeladenen Bildes mit dem run-Befehl ausführen. Wie Sie am Beispiel von hello-world gesehen haben, wird, wenn ein Bild nicht heruntergeladen wurde und docker mit dem run-Befehl ausgeführt wird, der Docker-Client zuerst das Bild herunterladen und dann einen Container damit ausführen.

Um die Bilder anzuzeigen, die auf Ihrem Computer heruntergeladen wurden, geben Sie ein:

  1. docker images

Die Ausgabe wird ähnlich aussehen wie folgt:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB

Wie Sie später in diesem Tutorial sehen werden, können Bilder, die Sie zum Ausführen von Containern verwenden, geändert und verwendet werden, um neue Bilder zu generieren, die dann auf Docker Hub oder anderen Docker-Registrierungen hochgeladen (gepushed ist der Fachbegriff) werden können.

Lassen Sie uns nun genauer betrachten, wie Container ausgeführt werden.

Schritt 5 — Ausführen eines Docker-Containers

Der hello-world-Container, den Sie im vorherigen Schritt ausgeführt haben, ist ein Beispiel für einen Container, der ausgeführt wird und nach dem Aussenden einer Testnachricht beendet wird. Container können jedoch viel nützlicher sein als das und sie können interaktiv sein. Immerhin ähneln sie virtuellen Maschinen, sind jedoch ressourcenschonender.

Als Beispiel führen wir einen Container mit dem neuesten Ubuntu-Image aus. Die Kombination der Schalter -i und -t ermöglicht Ihnen den interaktiven Shell-Zugriff auf den Container:

  1. docker run -it ubuntu

Ihre Befehlszeile sollte sich ändern, um widerzuspiegeln, dass Sie nun innerhalb des Containers arbeiten, und sollte diese Form haben:

Output
root@d9b100f2f636:/#

Beachten Sie die Container-ID in der Befehlszeile. In diesem Beispiel ist es d9b100f2f636. Sie benötigen diese Container-ID später, um den Container zu identifizieren, wenn Sie ihn entfernen möchten.

Jetzt können Sie jeden Befehl innerhalb des Containers ausführen. Zum Beispiel aktualisieren wir die Paketdatenbank im Container. Sie müssen keinen Befehl mit sudo prefixieren, da Sie innerhalb des Containers als Benutzer root arbeiten:

  1. apt update

Führen Sie dann eine Anwendung darin aus. Lassen Sie uns Node.js installieren:

  1. apt install nodejs

Dies installiert Node.js im Container aus dem offiziellen Ubuntu-Repository. Überprüfen Sie nach Abschluss der Installation, ob Node.js installiert ist:

  1. node -v

Sie sehen die Versionsnummer in Ihrem Terminal angezeigt:

Output
v12.22.9

Alle Änderungen, die Sie innerhalb des Containers vornehmen, gelten nur für diesen Container.

Um den Container zu verlassen, geben Sie an der Eingabeaufforderung exit ein.

Lassen Sie uns als nächstes die Verwaltung der Container auf unserem System betrachten.

Schritt 6 – Verwaltung von Docker-Containern

Nachdem Sie Docker eine Weile verwendet haben, haben Sie viele aktive (laufende) und inaktive Container auf Ihrem Computer. Um die aktiven anzuzeigen, verwenden Sie:

  1. docker ps

Sie werden eine Ausgabe sehen, die der folgenden ähnelt:

Output
CONTAINER ID IMAGE COMMAND CREATED

In diesem Tutorial haben Sie zwei Container gestartet; einen aus dem hello-world-Image und einen anderen aus dem ubuntu-Image. Beide Container laufen nicht mehr, existieren jedoch noch auf Ihrem System.

Um alle Container anzuzeigen – aktiv und inaktiv – führen Sie docker ps mit dem -a-Schalter aus:

  1. docker ps -a

Sie sehen eine Ausgabe ähnlich dieser:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig 587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski

Um den neuesten Container anzuzeigen, den Sie erstellt haben, geben Sie ihm den -l-Schalter:

  1. docker ps -l
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig

Um einen gestoppten Container zu starten, verwenden Sie docker start, gefolgt von der Container-ID oder dem Namen des Containers. Lassen Sie uns den Container auf Basis von Ubuntu mit der ID 1c08a7a0d0e4 starten:

  1. docker start 1c08a7a0d0e4

Der Container wird gestartet, und Sie können mit docker ps seinen Status anzeigen:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig

Um einen laufenden Container zu stoppen, verwenden Sie docker stop, gefolgt von der Container-ID oder dem Namen. Diesmal verwenden wir den Namen, den Docker dem Container zugewiesen hat, nämlich dazzling_taussig:

  1. docker stop dazzling_taussig

Sobald Sie sich entschieden haben, dass Sie einen Container nicht mehr benötigen, entfernen Sie ihn mit dem docker rm Befehl, indem Sie entweder die Container-ID oder den Namen verwenden. Verwenden Sie den Befehl docker ps -a, um die Container-ID oder den Namen für den Container zu finden, der mit dem hello-world Image verbunden ist, und entfernen Sie ihn.

  1. docker rm adoring_kowalevski

Sie können einen neuen Container starten und ihm einen Namen geben, indem Sie den Schalter --name verwenden. Sie können auch den Schalter --rm verwenden, um einen Container zu erstellen, der sich selbst entfernt, wenn er gestoppt wird. Weitere Informationen zu diesen Optionen und anderen finden Sie im Befehl docker run help.

Container können in Images umgewandelt werden, die Sie verwenden können, um neue Container zu erstellen. Schauen wir uns an, wie das funktioniert.

Schritt 7 — Änderungen in einem Container in ein Docker-Image übernehmen

Wenn Sie ein Docker-Image starten, können Sie Dateien erstellen, ändern und löschen, genauso wie bei einer virtuellen Maschine. Die von Ihnen vorgenommenen Änderungen gelten nur für diesen Container. Sie können ihn starten und stoppen, aber sobald Sie ihn mit dem Befehl docker rm zerstören, gehen die Änderungen für immer verloren.

In diesem Abschnitt wird erklärt, wie der Zustand eines Containers als neues Docker-Image gespeichert wird.

Nach der Installation von Node.js innerhalb des Ubuntu-Containers haben Sie jetzt einen Container, der auf einem Bild läuft, das sich jedoch vom Bild unterscheidet, das Sie zur Erstellung verwendet haben. Möglicherweise möchten Sie diesen Node.js-Container später als Basis für neue Bilder wiederverwenden.

Dann übernehmen Sie die Änderungen in eine neue Docker-Image-Instanz mit dem folgenden Befehl.

  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

Der -m-Schalter dient der Commit-Nachricht, die Ihnen und anderen mitteilt, welche Änderungen Sie vorgenommen haben, während -a verwendet wird, um den Autor anzugeben. Die container_id ist diejenige, die Sie früher im Tutorial notiert haben, als Sie die interaktive Docker-Sitzung gestartet haben. Sofern Sie keine zusätzlichen Repositories auf Docker Hub erstellt haben, ist das repository normalerweise Ihr Docker-Hub-Benutzername.

Zum Beispiel, für den Benutzer sammy, mit der Container-ID von d9b100f2f636, lautet der Befehl:

  1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

Wenn Sie ein Bild commiten, wird das neue Bild lokal auf Ihrem Computer gespeichert. Später in diesem Tutorial erfahren Sie, wie Sie ein Bild in ein Docker-Registry wie Docker Hub hochladen können, damit andere darauf zugreifen können.

Das Auflisten der Docker-Bilder zeigt erneut das neue Bild sowie das alte, von dem es abgeleitet wurde:

  1. docker images

Sie werden eine Ausgabe wie diese sehen:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ...

In diesem Beispiel ist ubuntu-nodejs das neue Bild, das vom bestehenden ubuntu-Bild von Docker Hub abgeleitet wurde. Der Größenunterschied spiegelt die vorgenommenen Änderungen wider. Und in diesem Beispiel wurde NodeJS installiert. Wenn Sie also das nächste Mal einen Container mit Ubuntu und vorinstalliertem NodeJS ausführen müssen, können Sie einfach das neue Bild verwenden.

Sie können auch Bilder aus einem Dockerfile erstellen, mit dem Sie die Installation von Software in einem neuen Image automatisieren können. Dies liegt jedoch außerhalb des Umfangs dieses Tutorials.

Jetzt teilen wir das neue Image mit anderen, damit sie Container daraus erstellen können.

Schritt 8 — Docker-Images in ein Docker-Repository hochladen

Der nächste logische Schritt nach der Erstellung eines neuen Images aus einem vorhandenen Image besteht darin, es mit einigen Ihrer Freunde, der ganzen Welt auf Docker Hub oder einem anderen Docker-Registry, auf den Sie Zugriff haben, zu teilen. Um ein Bild auf Docker Hub oder einem anderen Docker-Registry zu pushen, müssen Sie dort ein Konto haben.

Um Ihr Bild zu pushen, melden Sie sich zunächst bei Docker Hub an.

  1. docker login -u docker-registry-username

Sie werden aufgefordert, sich mit Ihrem Docker-Hub-Passwort zu authentifizieren. Wenn Sie das richtige Passwort angegeben haben, sollte die Authentifizierung erfolgreich sein.

Hinweis: Wenn Ihr Docker-Registry-Benutzername von dem lokalen Benutzernamen abweicht, den Sie zum Erstellen des Images verwendet haben, müssen Sie Ihr Image mit Ihrem Registry-Benutzernamen taggen. Für das im letzten Schritt angegebene Beispiel würden Sie Folgendes eingeben:

  1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

Dann können Sie Ihr eigenes Bild mit folgendem Befehl pushen:

  1. docker push docker-registry-username/docker-image-name

Um das ubuntu-nodejs-Bild in das sammy-Repository zu pushen, wäre der Befehl:

  1. docker push sammy/ubuntu-nodejs

Der Vorgang kann einige Zeit dauern, bis er abgeschlossen ist, da die Bilder hochgeladen werden, aber wenn er abgeschlossen ist, sieht die Ausgabe so 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 ...

Nachdem ein Bild in ein Repository gepusht wurde, sollte es auf dem Dashboard Ihres Kontos aufgelistet sein, wie im Bild unten gezeigt.

Wenn ein Push-Versuch zu einem Fehler dieser Art führt, haben Sie sich 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 required

Melden Sie sich mit docker login an und wiederholen Sie den Push-Versuch. Überprüfen Sie dann, ob es auf Ihrer Docker Hub-Repositoryseite existiert.

Sie können jetzt docker pull sammy/ubuntu-nodejs verwenden, um das Bild auf eine neue Maschine zu ziehen und es zu verwenden, um einen neuen Container auszuführen.

Fazit

In diesem Tutorial haben Sie Docker installiert, mit Bildern und Containern gearbeitet und ein modifiziertes Bild auf Docker Hub gepusht. Jetzt, da Sie die Grundlagen kennen, erkunden Sie die anderen Docker-Tutorials in der DigitalOcean-Community.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04