Docker Run meistern: Wesentliche Befehlsoptionen erklärt
Der docker run-Befehl von Docker ist die Grundlage für die Erstellung und den Start von Containern aus Ihren Docker-Images. Während ein einfaches docker run <image_name> Sie in Gang bringen kann, erfordert die volle Ausschöpfung des Potenzials von Containern das Verständnis seiner zahlreichen Optionen. Dieser Artikel befasst sich mit den wichtigsten docker run-Flags, die Sie befähigen, Netzwerke zu verwalten, Umgebungsvariablen zu konfigurieren, Daten mit Volumes persistent zu speichern und die Container-Ausführung im Detached-Modus zu steuern.
Das Verständnis dieser Optionen ist entscheidend für eine effiziente Containerisierung und ermöglicht es Ihnen, robuste, flexible und verwaltbare Anwendungen zu erstellen. Egal, ob Sie einen Webserver, eine Datenbank oder einen komplexen Microservice ausführen, die Beherrschung von docker run wird Ihren Docker-Workflow erheblich verbessern.
Die Grundlagen von docker run
Die grundlegende Syntax für den docker run-Befehl lautet:
docker run [OPTIONEN] IMAGE [BEFEHL] [ARG...]
[OPTIONEN]: Dies sind die Flags, die das Verhalten des Containers modifizieren.IMAGE: Der Name des Docker-Images, aus dem der Container erstellt werden soll (z.B.ubuntu,nginx:latest).[BEFEHL]: Ein optionaler Befehl, der innerhalb des Containers ausgeführt wird und den Standardbefehl des Images überschreibt.[ARG...]: Argumente für den Befehl.
Lassen Sie uns einige der wirkungsvollsten Optionen untersuchen.
Wichtige docker run-Optionen erklärt
Detached-Modus (-d oder --detach)
Standardmäßig startet docker run einen Container im Vordergrund und verbindet Ihr Terminal mit seinen Standard-Ein-, Ausgabe- und Fehlerströmen. Das bedeutet, dass Ihr Terminal belegt ist, bis der Container stoppt. Der Detached-Modus (-d) ermöglicht es dem Container, im Hintergrund zu laufen, wodurch Ihr Terminal frei wird.
Beispiel:
docker run -d nginx
Dieser Befehl startet einen Nginx-Webserver-Container im Hintergrund. Sie sehen eine lange Container-ID, die auf Ihrem Terminal ausgegeben wird, und Ihre Eingabeaufforderung kehrt sofort zurück.
Tipp: Um die Protokolle eines getrennten Containers anzuzeigen, verwenden Sie docker logs <container_id_or_name>.
Port-Mapping (-p oder --publish)
Container sind isolierte Netzwerkumgebungen. Um einen Dienst eines Containers für die Host-Maschine oder andere Maschinen im Netzwerk verfügbar zu machen, müssen Sie Ports zuordnen. Das -p-Flag ermöglicht es Ihnen, einen Port eines Containers einem bestimmten Port auf dem Host zuzuordnen.
Das Format ist -p <host_port>:<container_port>.
Beispiel:
Ausführen eines Nginx-Containers und Zuordnung von Port 80 im Container zu Port 8080 auf dem Host:
docker run -d -p 8080:80 nginx
Nun können Sie den Nginx-Server aufrufen, indem Sie in Ihrem Webbrowser zu http://localhost:8080 navigieren.
Mehrere Port-Mappings: Sie können mehrere Ports zuordnen, indem Sie das -p-Flag mehrmals verwenden:
docker run -d -p 8080:80 -p 4430:443 nginx
IP-Adresse angeben: Sie können auch angeben, an welche IP-Adresse auf dem Host gebunden werden soll:
docker run -d -p 127.0.0.1:8080:80 nginx
Dies bindet Port 8080 auf dem Host nur an die Loopback-Schnittstelle (localhost).
Volume-Mounting (-v oder --volume)
Container-Dateisysteme sind standardmäßig flüchtig. Wenn ein Container entfernt wird, gehen alle darin erstellten oder geänderten Daten verloren. Volumes bieten einen Mechanismus, um Daten außerhalb des Lebenszyklus des Containers persistent zu speichern. Sie können ein Verzeichnis von Ihrer Host-Maschine in den Container mounten oder von Docker verwaltete Volumes verwenden.
Das grundlegende Format ist -v <host_path>:<container_path>.
Beispiel:
Mounten eines lokalen Verzeichnisses ~/my-nginx-html in das Standard-Nginx-HTML-Verzeichnis (/usr/share/nginx/html) innerhalb des Containers:
docker run -d -p 8080:80 -v ~/my-nginx-html:/usr/share/nginx/html nginx
Alle HTML-Dateien, die Sie auf Ihrem Host in ~/my-nginx-html ablegen, werden von Nginx bedient. Änderungen an diesen Dateien werden sofort innerhalb des Containers widergespiegelt.
Benannte Volumes: Von Docker verwaltete benannte Volumes werden oft für bessere Portabilität und Verwaltung bevorzugt:
docker run -d -p 8080:80 -v my-nginx-data:/usr/share/nginx/html nginx
Wenn my-nginx-data nicht existiert, wird es von Docker erstellt. Sie können diese Volumes mit docker volume ls, docker volume create und docker volume rm verwalten.
Umgebungsvariablen (-e oder --env)
Umgebungsvariablen sind Schlüssel-Wert-Paare, die zur Konfiguration von Anwendungen innerhalb von Containern verwendet werden können. Das -e-Flag ermöglicht es Ihnen, diese Variablen festzulegen.
Beispiel:
Festlegen einer benutzerdefinierten Konfigurationsvariablen für eine Anwendung:
docker run -d -e APP_ENV=production my-custom-app:latest
Mehrere Variablen festlegen: Verwenden Sie -e mehrmals:
docker run -d -e DB_HOST=database.example.com -e DB_USER=admin my-app:latest
Verwendung von .env-Dateien: Für die Verwaltung vieler Variablen können Sie das --env-file-Flag verwenden:
docker run -d --env-file ./app.env my-app:latest
Wobei app.env enthalten könnte:
DB_HOST=database.example.com
DB_USER=admin
Tipp: Seien Sie vorsichtig, wenn Sie sensible Informationen (wie Passwörter) direkt in Umgebungsvariablen oder .env-Dateien einfügen, die in die Versionskontrolle eingecheckt werden.
Container-Benennung (--name)
Wenn Sie einen Container starten, weist Docker ihm einen zufälligen, oft langen, hexadezimalen Namen zu. Die Zuweisung eines benutzerdefinierten, menschenlesbaren Namens mit dem --name-Flag erleichtert die spätere Bezugnahme auf den Container für Befehle wie docker stop, docker logs oder docker exec erheblich.
Beispiel:
docker run -d --name my-webserver -p 8080:80 nginx
Nun können Sie auf diesen Container als my-webserver verweisen, anstatt auf seine ID.
Warnung: Containernamen müssen eindeutig sein. Wenn bereits ein Container mit diesem Namen existiert, schlägt docker run fehl.
Interaktiver Modus und TTY (-i, -t oder -it)
Für die Ausführung von Befehlen, die Benutzerinteraktion oder ein Pseudo-Terminal (wie eine Shell) erfordern, verwenden Sie die Flags -i (interaktiv) und -t (ein Pseudo-TTY zuweisen). Oft werden sie als -it kombiniert.
Beispiel:
Ausführen einer interaktiven Bash-Shell in einem Ubuntu-Container:
docker run -it ubuntu bash
Dieser Befehl startet einen Ubuntu-Container, führt bash aus und verbindet Ihr Terminal damit, sodass Sie Befehle eingeben können, als wären Sie in einem Linux-System angemeldet. Wenn Sie die Shell verlassen (exit), wird der Container gestoppt.
Neustartrichtlinien (--restart)
Neustartrichtlinien definieren, ob ein Container automatisch neu gestartet werden soll, wenn er stoppt, und unter welchen Bedingungen.
no: Den Container nicht automatisch neu starten (Standard).on-failure[:max_retries]: Nur neu starten, wenn der Container mit einem Exit-Code ungleich Null beendet wird. Sie können optional eine maximale Anzahl von Wiederholungsversuchen angeben.always: Den Container immer neu starten, wenn er stoppt, unabhängig vom Exit-Status.unless-stopped: Den Container immer neu starten, es sei denn, er wurde explizit vom Benutzer oder dem Docker-Daemon gestoppt.
Beispiel:
Um sicherzustellen, dass Ihr Webserver nach einem Absturz automatisch neu gestartet wird:
docker run -d --name my-resilient-webserver --restart always -p 8080:80 nginx
Container nach Beendigung entfernen (--rm)
Für temporäre Container, insbesondere während des Testens oder der Entwicklung, möchten Sie oft, dass der Container automatisch entfernt wird, sobald er beendet wird. Das --rm-Flag erledigt dies.
Beispiel:
Ausführen eines Befehls in einem temporären Container und anschließendes Entfernen:
docker run --rm ubuntu echo "Hallo von einem temporären Container"
Nachdem der echo-Befehl abgeschlossen ist und der Container beendet wird, wird er automatisch entfernt. Dies hilft, Ihr System von alten, gestoppten Containern sauber zu halten.
Alles zusammenfügen: Ein praktisches Beispiel
Kombinieren wir mehrere Optionen, um eine benutzerdefinierte Webanwendung auszuführen:
- Im Detached-Modus ausführen (
-d). - Einen Namen zuweisen (
--name my-app). - Host-Port 3000 auf Container-Port 80 mappen (
-p 3000:80). - Ein lokales Verzeichnis für Protokolle mounten (
-v $(pwd)/logs:/app/logs). - Eine Umgebungsvariable setzen (
-e NODE_ENV=production). - Sicherstellen, dass er neu gestartet wird, wenn er fehlschlägt (
--restart on-failure). - Ein bestimmtes Image verwenden (
my-node-app:1.0).
docker run -d --name my-app --restart on-failure -p 3000:80 -v $(pwd)/logs:/app/logs -e NODE_ENV=production my-node-app:1.0
Dieser Befehl stellt Ihre Anwendung effektiv bereit, macht sie zugänglich, ermöglicht die Persistenz von Protokollen und stellt ein gewisses Maß an Ausfallsicherheit sicher.
Fazit
Der docker run-Befehl ist weitaus vielseitiger, als seine grundlegende Verwendung vermuten lässt. Durch die Nutzung von Optionen wie -d, -p, -v, -e, --name und --rm erhalten Sie eine präzise Kontrolle über Ihre containerisierten Anwendungen. Die Beherrschung dieser wesentlichen Flags ist ein grundlegender Schritt zum Aufbau und zur effizienten und zuverlässigen Verwaltung komplexer containerisierter Umgebungen. Experimentieren Sie weiterhin mit diesen Optionen, um sie vollständig in Ihre Docker-Workflows zu integrieren.