Einführung
Docker ist eine Anwendung, die das Verwalten von Anwendungsprozessen in Containern vereinfacht . Mit Containern können Sie Ihre Anwendungen in ressourcenisolierten Prozessen ausführen. Sie ähneln virtuellen Maschinen, aber Container sind portabler, ressourcenschonender und abhängiger vom Hostbetriebssystem.
Eine detaillierte Einführung in die verschiedenen Komponenten eines Docker-Containers finden Sie unter The Docker Ecosystem:An Introduction to Common Components.
In diesem Tutorial installieren und verwenden Sie Docker Community Edition (CE) unter Ubuntu 22.04. Sie installieren Docker selbst, arbeiten mit Containern und Images und pushen ein Image in ein Docker-Repository.
Voraussetzungen
Um diesem Tutorial zu folgen, benötigen Sie Folgendes:
- Ein Ubuntu 22.04-Server, der gemäß der Ubuntu 22.04-Anleitung zur Ersteinrichtung des Servers eingerichtet wurde, einschließlich eines
sudo
Nicht-root Benutzer und eine Firewall. - Ein Konto auf Docker Hub, wenn Sie Ihre eigenen Images erstellen und sie an Docker Hub übertragen möchten, wie in den Schritten 7 und 8 gezeigt.
Schritt 1 – Docker installieren
Das im offiziellen Ubuntu-Repository verfügbare Docker-Installationspaket 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.
Aktualisieren Sie zunächst Ihre vorhandene Paketliste:
- sudo apt update
Installieren Sie als Nächstes einige vorausgesetzte Pakete, die apt
zulassen Pakete über HTTPS verwenden:
- 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 zu Ihrem System hinzu:
- 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 zu den APT-Quellen hinzu:
- 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 Ihre vorhandene Paketliste erneut, damit die Hinzufügung erkannt wird:
- sudo apt update
Stellen Sie sicher, dass Sie aus dem Docker-Repo statt aus dem standardmäßigen Ubuntu-Repo installieren:
- apt-cache policy docker-ce
Sie sehen eine Ausgabe wie diese, obwohl die Versionsnummer für Docker anders sein kann:
Ausgabe der apt-cache-Richtlinie docker-cedocker-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
ist nicht installiert, aber der Installationskandidat stammt aus dem Docker-Repository für Ubuntu 22.04 (jammy
).
Installieren Sie abschließend Docker:
- sudo apt install docker-ce
Docker sollte jetzt installiert, der Daemon gestartet und der Prozess aktiviert sein, um beim Booten zu starten. Überprüfen Sie, ob es ausgeführt wird:
- sudo systemctl status docker
Die Ausgabe sollte der folgenden ähneln und zeigen, dass der Dienst aktiv ist 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
Durch die Installation von Docker erhalten Sie jetzt nicht nur den Docker-Dienst (Daemon), sondern auch den docker
Befehlszeilendienstprogramm oder den Docker-Client. Wir untersuchen, wie Sie den docker
verwenden Befehl später in diesem Tutorial.
Schritt 2 – Ausführen des Docker-Befehls ohne Sudo (optional)
Standardmäßig ist das docker
Der Befehl kann nur als root ausgeführt werden Benutzer oder von einem Benutzer im Docker -Gruppe, die während des Installationsprozesses von Docker automatisch erstellt wird. Wenn Sie versuchen, docker
auszuführen Befehl, ohne ihm sudo
voranzustellen oder ohne im Docker zu sein Gruppe erhalten Sie eine Ausgabe wie diese:
Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Wenn Sie die Eingabe von sudo
vermeiden möchten wenn Sie docker
ausführen Befehl, fügen Sie Ihren Benutzernamen zum docker
hinzu Gruppe:
- sudo usermod -aG docker ${USER}
Um die neue Gruppenmitgliedschaft zu übernehmen, melden Sie sich vom Server ab und wieder an oder geben Sie Folgendes ein:
- su - ${USER}
Sie werden aufgefordert, Ihr Benutzerkennwort einzugeben, um fortzufahren.
Bestätigen Sie, dass Ihr Benutzer jetzt zum Docker hinzugefügt wurde gruppieren, indem Sie Folgendes eingeben:
- groups
Outputsammy sudo docker
Wenn Sie einen Benutzer zum docker
hinzufügen müssen Gruppe, als die Sie nicht angemeldet sind, deklarieren Sie diesen Benutzernamen explizit mit:
- sudo usermod -aG docker username
Der Rest dieses Artikels geht davon aus, dass Sie docker
ausführen Befehl als Benutzer im Docker Gruppe. Wenn Sie sich dagegen entscheiden, stellen Sie den Befehlen bitte sudo
voran .
Sehen wir uns den docker
an Befehl weiter.
Schritt 3 – Verwenden des Docker-Befehls
Mit docker
besteht darin, ihm eine Kette von Optionen und Befehlen gefolgt von Argumenten zu übergeben. Die Syntax hat folgende Form:
- docker [option] [command] [arguments]
Um alle verfügbaren Unterbefehle anzuzeigen, geben Sie Folgendes ein:
- docker
Ab Docker-Version 20.10.14 , enthält 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
Geben Sie Folgendes ein, um die für einen bestimmten Befehl verfügbaren Optionen anzuzeigen:
- docker docker-subcommand --help
Um systemweite Informationen zu Docker anzuzeigen, verwenden Sie:
- docker info
Sehen wir uns einige dieser Befehle an. Wir beginnen mit der Arbeit mit Bildern.
Schritt 4 – Arbeiten mit Docker-Images
Docker-Container werden aus Docker-Images erstellt. Standardmäßig zieht Docker diese Images aus Docker Hub, einer Docker-Registrierung, die von Docker, dem Unternehmen hinter dem Docker-Projekt, verwaltet wird. Jeder kann seine Docker-Images auf Docker Hub hosten, sodass die meisten Anwendungen und Linux-Distributionen, die Sie benötigen, dort gehostete Images haben.
Geben Sie Folgendes ein, um zu prüfen, ob Sie auf Bilder von Docker Hub zugreifen und diese herunterladen können:
- docker run hello-world
Die Ausgabe zeigt an, dass Docker korrekt funktioniert:
OutputUnable 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.
...
Docker konnte anfangs hello-world
nicht finden image lokal gespeichert, sodass das Image von Docker Hub heruntergeladen wurde, dem Standard-Repository. Nachdem das Image heruntergeladen wurde, erstellte Docker einen Container aus dem Image und die Anwendung innerhalb des Containers wurde ausgeführt und zeigte die Nachricht an.
Sie können mithilfe von docker
nach Bildern suchen, die auf Docker Hub verfügbar sind Befehl mit dem search
Unterbefehl. Um beispielsweise nach dem Ubuntu-Image zu suchen, geben Sie Folgendes ein:
- docker search ubuntu
Das Skript durchsucht Docker Hub und gibt eine Liste aller Bilder zurück, deren Name mit der Suchzeichenfolge übereinstimmt. In diesem Fall sieht die Ausgabe ähnlich aus:
OutputNAME 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]
...
Im OFFIZIELL Spalte, OK weist auf ein Image hin, 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 mit pull
auf Ihren Computer herunterladen Unterbefehl.
Führen Sie den folgenden Befehl aus, um das offizielle ubuntu
herunterzuladen Bild auf Ihren Computer:
- docker pull ubuntu
Sie sehen die folgende Ausgabe:
OutputUsing 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 Image heruntergeladen wurde, können Sie einen Container mit dem heruntergeladenen Image mit run
ausführen Unterbefehl. Wie Sie bei hello-world
gesehen haben B. wenn ein Bild beim docker
nicht heruntergeladen wurde wird mit run
ausgeführt Unterbefehl, lädt der Docker-Client zuerst das Image herunter und führt dann einen Container damit aus.
Geben Sie Folgendes ein, um die auf Ihren Computer heruntergeladenen Bilder anzuzeigen:
- docker images
Die Ausgabe sieht etwa so aus:
OutputREPOSITORY 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 zum Generieren neuer Bilder verwendet werden, die dann hochgeladen (gepusht ist der Fachbegriff) an Docker Hub oder andere Docker-Registries.
Sehen wir uns genauer an, wie Container ausgeführt werden.
Schritt 5 – Ausführen eines Docker-Containers
Die hello-world
Container, den Sie im vorherigen Schritt ausgeführt haben, ist ein Beispiel für einen Container, der ausgeführt und beendet wird, nachdem eine Testnachricht ausgegeben wurde. Container können viel nützlicher sein, und sie können interaktiv sein. Schließlich sind sie virtuellen Maschinen ähnlich, nur ressourcenschonender.
Lassen Sie uns als Beispiel einen Container mit dem neuesten Image von Ubuntu ausführen. Die Kombination des -i und -t Schalter gibt Ihnen interaktiven Shell-Zugriff auf den Container:
- docker run -it ubuntu
Ihre Eingabeaufforderung sollte sich ändern, um die Tatsache widerzuspiegeln, dass Sie jetzt im Container arbeiten, und diese Form annehmen:
Outputroot@d9b100f2f636:/#
Notieren Sie sich die Container-ID in der Eingabeaufforderung. 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. Lassen Sie uns beispielsweise die Paketdatenbank im Container aktualisieren. Sie müssen keinem Befehl sudo
voranstellen , weil Sie innerhalb des Containers als Root arbeiten Benutzer:
- apt update
Installieren Sie dann eine beliebige Anwendung darin. Lassen Sie uns Node.js installieren:
- apt install nodejs
Dadurch wird Node.js im Container aus dem offiziellen Ubuntu-Repository installiert. Überprüfen Sie nach Abschluss der Installation, ob Node.js installiert ist:
- node -v
Die Versionsnummer wird in Ihrem Terminal angezeigt:
Outputv12.22.9
Alle Änderungen, die Sie innerhalb des Containers vornehmen, gelten nur für diesen Container.
Um den Container zu verlassen, geben Sie exit
ein an der Eingabeaufforderung.
Sehen wir uns als Nächstes die Verwaltung der Container in unserem System an.
Schritt 6 – Verwalten 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:
- docker ps
Sie sehen eine Ausgabe ähnlich der folgenden:
OutputCONTAINER ID IMAGE COMMAND CREATED
In diesem Tutorial haben Sie zwei Container gestartet; eine aus der hello-world
image und ein weiteres aus ubuntu
Bild. Beide Container werden nicht mehr ausgeführt, sind aber noch auf Ihrem System vorhanden.
Um alle Container – aktive und inaktive – anzuzeigen, führen Sie docker ps
aus mit dem -a
Schalter:
- docker ps -a
Sie sehen eine Ausgabe ähnlich der folgenden:
OutputCONTAINER 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 zuletzt erstellten Container anzuzeigen, übergeben Sie ihm den -l
Schalter:
- docker ps -l
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig
Um einen angehaltenen Container zu starten, verwenden Sie docker start
, gefolgt von der Container-ID oder dem Namen des Containers. Starten wir den Ubuntu-basierten Container mit der ID 1c08a7a0d0e4
:
- docker start 1c08a7a0d0e4
Der Container wird gestartet und Sie können docker ps
verwenden um seinen Status zu sehen:
OutputCONTAINER 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. Dieses Mal verwenden wir den Namen, den Docker dem Container zugewiesen hat, nämlich dazzling_taussig
:
- docker stop dazzling_taussig
Wenn Sie entschieden haben, dass Sie einen Container nicht mehr benötigen, entfernen Sie ihn mit docker rm
Befehl, wieder entweder mit der Container-ID oder dem Namen. Verwenden Sie den docker ps -a
Befehl, um die Container-ID oder den Namen für den Container zu finden, der hello-world
zugeordnet ist Bild und entfernen Sie es.
- docker rm adoring_kowalevski
Mit --name
können Sie einen neuen Container starten und ihm einen Namen geben schalten. Sie können auch --rm
verwenden wechseln, um einen Container zu erstellen, der sich selbst entfernt, wenn er gestoppt wird. Siehe docker run help
Befehl für weitere Informationen zu diesen und anderen Optionen.
Container können in Images umgewandelt werden, die Sie zum Erstellen neuer Container verwenden können. Sehen wir uns an, wie das funktioniert.
Schritt 7 – Übertragen von Änderungen in einem Container auf ein Docker-Image
Wenn Sie ein Docker-Image starten, können Sie Dateien erstellen, ändern und löschen, genau wie bei einer virtuellen Maschine. Die von Ihnen vorgenommenen Änderungen gelten nur für diesen Container. Sie können es starten und stoppen, aber sobald Sie es mit dem docker rm
zerstören Befehl, gehen die Änderungen endgültig verloren.
Dieser Abschnitt zeigt Ihnen, wie Sie den Status eines Containers als neues Docker-Image speichern.
Nach der Installation von Node.js im Ubuntu-Container haben Sie jetzt einen Container, der von einem Image ausgeführt wird, aber der Container unterscheidet sich von dem Image, mit dem Sie ihn erstellt haben. Aber vielleicht möchten Sie diesen Node.js-Container später als Grundlage für neue Bilder wiederverwenden.
Übertragen Sie dann die Änderungen mit dem folgenden Befehl in eine neue Docker-Image-Instanz.
- docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
Das -m switch ist für die Commit-Nachricht, die Ihnen und anderen hilft zu wissen, welche Änderungen Sie vorgenommen haben, während -a wird verwendet, um den Autor anzugeben. Die container_id
ist diejenige, die Sie sich zuvor 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
ist normalerweise Ihr Docker Hub-Benutzername.
Zum Beispiel für den Benutzer sammy , mit der Container-ID d9b100f2f636
, wäre der Befehl:
- docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
Wenn Sie sich verpflichten ein Bild, wird das neue Bild lokal auf Ihrem Computer gespeichert. Später in diesem Tutorial erfahren Sie, wie Sie ein Image in eine Docker-Registrierung wie Docker Hub übertragen, damit andere darauf zugreifen können.
Das erneute Auflisten der Docker-Images zeigt das neue Image sowie das alte, von dem es abgeleitet wurde:
- docker images
Sie sehen eine Ausgabe wie diese:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...
In diesem Beispiel ubuntu-nodejs
ist das neue Image, das von dem bestehenden ubuntu
abgeleitet wurde Bild vom Docker-Hub. Der Größenunterschied spiegelt die vorgenommenen Änderungen wider. Und in diesem Beispiel war die Änderung, dass NodeJS installiert wurde. Wenn Sie also das nächste Mal einen Container mit Ubuntu mit vorinstalliertem NodeJS ausführen müssen, können Sie einfach das neue Image verwenden.
Sie können Images auch aus einem Dockerfile
erstellen , mit dem Sie die Installation von Software in einem neuen Image automatisieren können. Dies würde jedoch den Rahmen dieses Tutorials sprengen.
Jetzt teilen wir das neue Image mit anderen, damit sie daraus Container erstellen können.
Schritt 8 – Docker-Images in ein Docker-Repository übertragen
Der nächste logische Schritt nach dem Erstellen eines neuen Images aus einem vorhandenen Image besteht darin, es mit einigen ausgewählten Freunden, der ganzen Welt auf Docker Hub oder einer anderen Docker-Registrierung, auf die Sie Zugriff haben, zu teilen. Um ein Image an Docker Hub oder eine andere Docker-Registrierung zu übertragen, müssen Sie dort ein Konto haben.
Um Ihr Image per Push zu übertragen, 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 angegeben haben, sollte die Authentifizierung erfolgreich sein.
Hinweis: Wenn sich Ihr Docker-Registrierungsbenutzername von dem lokalen Benutzernamen unterscheidet, den Sie zum Erstellen des Images verwendet haben, müssen Sie Ihr Image mit Ihrem Registrierungsbenutzernamen taggen. Für das im letzten Schritt angegebene Beispiel würden Sie Folgendes eingeben:
- docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Dann können Sie Ihr eigenes Bild pushen mit:
- docker push docker-registry-username/docker-image-name
Um die ubuntu-nodejs
zu pushen Bild an sammy Repository wäre der Befehl:
- docker push sammy/ubuntu-nodejs
Der Prozess kann einige Zeit in Anspruch nehmen, da die Bilder hochgeladen werden, aber wenn er abgeschlossen ist, sieht die Ausgabe so aus:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
Nachdem Sie ein Image in eine Registrierung übertragen haben, sollte es im Dashboard Ihres Kontos aufgeführt sein, wie im Bild unten gezeigt.
Wenn ein Push-Versuch zu einem Fehler dieser Art führt, haben Sie sich wahrscheinlich nicht angemeldet:
OutputThe 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-Repository-Seite vorhanden ist.
Sie können jetzt docker pull sammy/ubuntu-nodejs
um das Image auf einen neuen Computer zu ziehen und es zum Ausführen eines neuen Containers zu verwenden.
Schlussfolgerung
In diesem Tutorial haben Sie Docker installiert, mit Images und Containern gearbeitet und ein geändertes Image an Docker Hub gepusht. Nachdem Sie nun die Grundlagen kennen, erkunden Sie die anderen Docker-Tutorials in der DigitalOcean-Community.