Das Repo enthält im Wurzelverzeichnis ein Dockerfile, welches
das Image nginx:stable-alpine3.17-slim
als Basis-Image verwendet.
Das Image enthält also als Betriebs-System Alpine Linux
und den Webserver nginx; bei Alpine Linux handelt
es sich um eine besonders leichtgewichtige Linux-Distribution, die sich besonders
gut als Grundlage für Container eignet.
Das Dockerfile kopiert den Web-Content aus dem Unterverzeichnis docs/
in den Ordner /usr/share/nginx/html/ im Image, weil dies der Ordner für den von
nginx ausgelieferten Web-Content ist.
Vorbemerkung:
Unter Linux müssen Sie für die folgenden Aufrufe von docker evtl. den Befehl sudo voranstellen.
Führen Sie den folgenden Befehl im Verzeichnis mit dem Dockerfile aus, um das Image zu erstellen:
docker build -t mide76/hallodocker:1.0 .
- Hierbei ist
mide76der Nutzername auf Docker Hub. Wenn Sie das Image nicht auf Docker Hub veröffentlichen wollen (siehe unten), dann können Sie dasmide76/weglassen. Wenn Sie das Image aber veröffentlichen wollen, dann müssen Siemide76durch Ihren eigenen Nutzernamen auf Docker Hub veröffentlichen. hallodockerist der Name des Images. Er darf keine Großbuchstaben enthalten.1.0ist die Version, die erstellt wird.- Der einzelne Punkt '.' am Ende steht für das aktuelle Verzeichnis. Hier wird nach dem Dockerfile gesucht.
- Doku für diesen Befehl
Nach einem erfolgreichen Lauf dieses Befehls sollte das neu erzeugte Image in der Liste aller lokalen Images, die vom folgenden Befehl ausgegeben wird, enthalten sein:
docker image ls
- Das
lssteht für "list". - Doku für dieses Befehl
Wie können dann einen Container (laufende Instanz) von diesem Image erzeugen:
docker run --detach --name mein-webserver-1 -p 8080:80 mide76/hallodocker:1.0
Die Bedeutung der verwendeten Optionen und Argumente ist:
--detach: Container wird im Hintergrund ausgeführt, blockiert also nicht die Shell, mit der der Befehl ausgeführt wurde--name mein-webserver-1: Name des Containers-p 8080:80: Der Port 80 des Containers soll an den Port 8080 des "äußeren" Betriebs-System gebunden werdenmide76/hallodocker:1.0: Image, für das ein Container erzeugt werden soll.- Doku für diesen Befehl
Nach erfolgreicher Erzeugung sollte der Container in der Liste der laufenden Container, die der folgende Befehl ausgibt, enthalten sein:
docker container ls
Die Webseite aus dem Ordner docs/ dieses Repos sollte dann unter der folgenden lokalen URL im Web-Browser erreichbar sein:
http://localhost:8080/
Mit dem folgenden Befehl können wir uns das aktuelle Log-File des Container anzeigen lassen:
docker container logs mein-webserver-1
Es ist auch möglich, eine interaktive Shell im Container zu öffnen:
docker exec --interactive --tty mein-webserver-1 sh
- Das
sham Ende ist der im Container auszuführende Befehl, nämlich die Shell. --interactive: Interaktive Ausführung--tty: Pseudo-Terminal erstellen- Doku für diesen Befehl
Mit dem folgenden Befehl kann man sich den Inhalt des Verzeichnisses mit dem Web-Content ausgeben lassen:
ls -l /usr/share/nginx/html/
lssteht für den Linux-Befehl "list" (entspricht in etwa dem DOS-Befehldir)-l: Detaillierte Anzeige (nicht nur Dateiname, sondern z.B. auch noch Größe der Datei)- Doku zu diesem Befehl
Wir können mit dem folgenden Befehl eine Datei mit dem aktuellen Datum und Uhrzeit im Container erzeugen:
date > /root/datum.txt
Mit dem > wird die Ausgabe vom Programm date in eine Datei umgeleitet.
Sie können noch weitere Linux-Befehl eingeben oder die interaktive Shell mit dem Befehl exit verlassen.
Während ein oder mehrere Container laufen, können Sie mit dem folgenden Befehl den Ressourcenverbrauch (z.B. CPU und RAM) der einzelnen Container anzeigen lassen:
docker container stats
Abbruch dieser Anzeige mit STRG+C.
Die in dem Container laufenden Prozesse können Sie sich mit dem folgenden Befehl ausgeben lassen:
docker container top mein-webserver-1
Der folgende Befehl listet die Dateien auf, welche sich im Container im Vergleich zu Image geändert haben:
docker container diff mein-webserver-1
Wir können dann den Container mit dem folgenden Befehl beenden:
docker container stop mein-webserver-1
Die Ausgabe des folgenden Befehls zeigt, dass der gestoppte Container immer noch vorhanden ist:
docker container ls --all
Die Option --all ist herbei erforderlich, damit auch gestoppte Container angezeigt werden.
Wie können den Container mit folgendem Befehl wieder starten:
docker container start mein-webserver-1
Dabei müssen wir das Port-Forwarding nicht erneut spezifizieren. Doku zu diesem Befehl
Wenn wir erneut eine interaktive Shell zum Container öffnen, dann können wir uns mit dem folgenden Befehl die während des vorherigen Laufs erzeugte Datei datum.txt anzeigen lassen:
cat /root/datum.txt
Dies zeigt, dass die im Container geänderten Dateien auch erhalten bleiben, wenn der Container gestoppt und neu gestartet wird.
Doku zu Linux-Befehl cat
Die Datei /root/datum.txt aus dem Container können Sie sich mit dem folgenden Befehl aus dem Container herauskopieren:
docker container cp mein-webserver-1:/root/datum.txt datum-aus-container.txt
Wir stoppen den Container erneut mit dem selben Befehl wie oben.
Der gestoppte Container kann mit folgendem Befehl gelöscht werden:
docker container rm mein-webserver-1
Um ALLE gestoppten Container zu löschen kann der folgende Befehl eingegeben werden (gefährlich!):
docker container prune
Wenn Sie das Image auf Docker Hub veröffentlichen möchten, dann gehen Sie wie folgt beschrieben vor. Sie können aber auch die offizielle Dokumentation lesen.
Legen Sie sich ein (kostenloses) Konto auf Docker Hub an.
Hierbei müssen Sie einen Nutzernamen festlegen.
Im weiteren Beispiel ist dieser mide76.
Legen Sie sich auf der Weboberfläche ein Repository an.
Dieser Repo-Name ist für das weitere Beispiel hallodocker.
Loggen Sie sich dann auf der Konsole mit Ihrem Docker-Konto ein:
docker login
Sie können dann das Image mit folgendem Befehl auf den Server hochladen:
docker push mide76/hallodocker:1.0
Öffentliche URL des Beispiel-Repos: https://hub.docker.com/r/mide76/hallodocker
Andere Nutzer können des Image dann mit dem folgenden Befehl herunterladen:
docker pull mide76/hallodocker:1.0
Wenn wir eine weitere Version des Image auf Docker Hub hochladen wollen (z.B. wegen Änderungen
in Dockerfile oder im verpackten Web-Content), dann können wir auch direkt das Image mit dem
Nutzernamen als Prefix erzeugen.
Für eine Version 1.1 sieht der Befehl wie folgt aus:
sudo docker build -t mide76/hallodocker:1.1 .
Der zugehörige push-Befehl sieht dann so aus:
docker push mide76/hallodocker:1.1
Es ist Konvention, der aktuellsten stabilen Version eines Images noch den Tag latest zu geben.
Dies können wir für die gerade erstellte Version 1.1 mit folgendem Befehl machen:
docker tag mide76/hallodocker:1.1 mide76/hallodocker:latest
Mit dem letzten Befehl wurde der Tag aber nur lokal angelegt. Damit dieser Tag auch im Repositry auf Docker Hub verfügbar ist, muss er gepusht werden:
docker push mide76/hallodocker:latest
Dieser Tag und die beiden Versionen werden dann im Tab "Tags" des Repos auf Docker Hub angezeigt, siehe hier. Wenn zwei Tags den gleichen (Hash-)Wert für "Digest" haben, dann handelt es sich um dieselbe Version.
Wenn wir später noch eine Version 1.2 des Image erstellen, dann können wir mit dem folgenden
Befehl den Tag latest von der Version 1.1. zu der Version 1.2. verschieben:
docker tag mide76/hallodocker:1.2 mide76/hallodocker:latest
Durch Anhängen des Tag latest an eine andere Version wird der Tag von der bisherigen Version 1.1 entfernt.
Wir müssen dann noch das neue Image mit den beiden Tags 1.2 und latest zu Docker Hub pushen:
docker push mide76/hallodocker:1.2
docker push mide76/hallodocker:latest
See the LICENSE file for license rights and limitations (BSD 3-Clause License).