von docker run bis zu produktionsreifen Compose-Stacks
Wer Docker nur aus dem Bauch heraus bedient, verliert Zeit beim Debuggen und baut fragile Images. Die 50 wichtigsten Docker-Kommandos und Patterns decken Images, Container, Volumes, Netzwerke und Compose ab – mit konkreten Beispielen, die im täglichen Entwicklerbetrieb sofort einsetzbar sind.
Inhaltsverzeichnis
- 1. Warum Docker-Kommandos systematisch lernen lohnt
- 2. Images bauen und verwalten: der Kern des Workflows
- 3. Container starten, stoppen und debuggen
- 4. Volumes und Bind Mounts richtig einsetzen
- 5. Netzwerke: Container miteinander verbinden
- 6. Docker Compose: Stacks deklarativ verwalten
- 7. Inspektion, Logs und Ressourcenüberwachung
- 8. Cleanup: Images, Container und Volumes aufräumen
- 9. Docker-Kommandos im direkten Vergleich
- 10. Zusammenfassung
- 11. FAQ
1. Warum Docker-Kommandos systematisch lernen lohnt
Das Docker-CLI ist mächtig, aber es ist auch tief. Viele Entwickler kennen ein Dutzend Docker-Kommandos auswendig und stolpern beim Rest. Das kostet Zeit, vor allem wenn ein Container nicht startet, ein Volume leer bleibt oder ein Build unerwartet eine Stunde dauert. Wer die wichtigsten Docker-Kommandos und ihre Optionen versteht, kann Probleme systematisch eingrenzen, statt planlos Container zu löschen und neu zu starten.
Die Docker CLI ist in logische Gruppen unterteilt: docker image, docker container, docker volume, docker network und docker compose. Jede Gruppe hat eigene Subkommandos, und die Kenntnis dieser Struktur hilft beim Erkunden unbekannter Optionen mit docker <gruppe> --help. Die folgenden Abschnitte gehen durch die wichtigsten Docker-Kommandos jeder Gruppe – mit konkreten Beispielen und dem Fokus auf häufige Entwicklerfehler, die mit dem richtigen Kommando sofort sichtbar werden.
2. Images bauen und verwalten: der Kern des Workflows
Das wichtigste Docker-Kommando im täglichen Build-Workflow ist docker build mit gezielten Optionen. --no-cache erzwingt einen vollständigen Rebuild ohne gecachte Layer – sinnvoll bei geheimnisvollen Build-Fehlern, die nur im CI auftreten. --target baut einen bestimmten Stage in einem Multi-Stage-Dockerfile, was für Tests, Entwicklung und Produktion unterschiedliche Images aus einem einzigen Dockerfile ermöglicht. Mit --build-arg übergibt man Build-Zeitargumente, die im Dockerfile als ARG deklariert sind.
Für das Image-Management sind drei Docker-Kommandos zentral: docker images mit --filter dangling=true listet ungetaggte Images auf, die Speicherplatz belegen. docker image history IMAGE zeigt die Layer-Hierarchie mit Größen – unverzichtbar für das Verständnis, warum ein Image größer als erwartet ist. docker image inspect IMAGE liefert das vollständige JSON-Manifest mit Environment-Variablen, Entrypoint, Ports und Labels. Diese drei Docker-Kommandos ersetzen viel Raterei bei Image-Problemen durch direkte Fakten.
Ein häufiges Missverständnis bei Docker-Kommandos: docker build . sendet das gesamte Verzeichnis als Build-Kontext an den Docker-Daemon. Ohne eine sorgfältige .dockerignore-Datei werden node_modules, .git und andere große Verzeichnisse mitgeschickt, was den Build unnötig verlangsamt. Das Docker-Kommando docker build --no-cache --progress=plain . zeigt den vollständigen Build-Output mit Zeitstempeln für jeden Schritt – der schnellste Weg, um den langsamen Schritt im Dockerfile zu identifizieren.
3. Container starten, stoppen und debuggen
docker run ist das am häufigsten verwendete Docker-Kommando, aber kaum jemand kennt alle wichtigen Flags. --rm löscht den Container nach dem Beenden automatisch – sinnvoll für One-Shot-Container. -it öffnet ein interaktives Terminal. --init startet einen minimalen Init-Prozess als PID 1, der Zombie-Prozesse aufräumt und Signals korrekt weiterleitet. --read-only macht das Dateisystem des Containers schreibgeschützt und erzwingt explizite Volume-Mounts für Schreiboperationen – ein einfacher Sicherheitsgewinn.
Für laufende Container sind docker exec und docker logs die zentralen Debug-Docker-Kommandos. docker exec -it CONTAINER sh öffnet eine Shell im laufenden Container ohne Neustart. docker logs --follow --since 5m CONTAINER zeigt die letzten 5 Minuten Logs und streamt neue Zeilen. docker top CONTAINER zeigt die Prozesse im Container. docker stats --no-stream gibt einen einmaligen Schnappschuss der CPU- und Memory-Nutzung aller laufenden Container – das schnellste Docker-Kommando für Ressourcendiagnose ohne externe Tools.
4. Volumes und Bind Mounts richtig einsetzen
Volumes und Bind Mounts sind konzeptuell verschieden, aber das Docker-Kommando -v bedient beide. Ein Named Volume (-v myvolume:/app/data) wird von Docker verwaltet und überlebt den Container-Lifecycle. Ein Bind Mount (-v ./src:/app/src) spiegelt ein Host-Verzeichnis in den Container – ideal für die Entwicklung, gefährlich in der Produktion, wenn Host-Pfade nicht existieren oder falsche Berechtigungen haben. Das Docker-Kommando --mount type=volume,src=myvolume,dst=/app/data ist expliziter und erlaubt zusätzliche Optionen wie readonly.
Für das Volume-Management sind drei Docker-Kommandos besonders nützlich: docker volume ls listet alle Volumes mit ihrem Namen und Treiber. docker volume inspect VOLUME zeigt den tatsächlichen Mountpoint auf dem Host – wichtig, wenn man direkt auf Volume-Daten zugreifen muss. docker volume prune löscht alle unbenutzten Volumes, die keinem Container zugeordnet sind. Für Backups ist das Docker-Kommando docker run --rm -v myvolume:/data -v $(pwd):/backup alpine tar czf /backup/data.tar.gz /data das Standardmuster: ein temporärer Alpine-Container mountet das Volume und erstellt ein Archiv.
5. Netzwerke: Container miteinander verbinden
Docker-Netzwerke sind der häufigste Ort für Verwirrung beim Einstieg in Docker-Kommandos. Das Standard-Bridge-Netzwerk erlaubt keine Container-Namensauflösung – ein Container kann den anderen nicht per Name ansprechen. User-definierte Bridge-Netzwerke lösen das Problem: Container im selben Netzwerk können einander per Namen ansprechen, da Docker ein internes DNS betreibt. Das Docker-Kommando docker network create mynet erstellt ein solches Netzwerk, docker run --network mynet verbindet einen Container damit.
Das Docker-Kommando docker network inspect NETWORK zeigt alle verbundenen Container mit ihren IP-Adressen und ist das erste Werkzeug bei Netzwerkproblemen. docker network connect NETWORK CONTAINER verbindet einen laufenden Container nachträglich mit einem Netzwerk – ohne Neustart. Für die Diagnose von Netzwerkproblemen ist das Docker-Kommando docker run --rm --network container:ZIELCONTAINER nicolaka/netshoot ein leistungsstarkes Werkzeug: Es startet einen temporären Container im Netzwerknamespace des Zielcontainers mit vollständigen Netzwerk-Tools wie tcpdump, nmap und dig.
6. Docker Compose: Stacks deklarativ verwalten
Docker Compose ist kein eigenständiges Tool mehr, sondern ein Plugin (docker compose statt docker-compose). Das wichtigste Docker-Kommando im Compose-Kontext ist docker compose up --watch, das in Docker Compose Watch (seit v2.22) automatisch geänderte Dateien in laufende Container synchronisiert – ohne Volume-Mounts zu erfordern. docker compose --profile dev up startet nur die Services, die dem Profil "dev" zugeordnet sind, und ermöglicht unterschiedliche Service-Kombinationen für Entwicklung, Tests und Produktion aus einem einzigen compose.yaml.
Für das tägliche Arbeiten mit Compose sind vier Docker-Kommandos unverzichtbar: docker compose ps zeigt Status und Health aller Services. docker compose logs -f SERVICE streamt Logs eines einzelnen Services. docker compose exec SERVICE sh öffnet eine Shell im laufenden Service. docker compose config löst alle extends, Variablen und Overrides auf und zeigt die finale Konfiguration – ideal zum Debuggen von Compose-Dateien vor dem Starten. Das Docker-Kommando docker compose down -v stoppt den Stack und löscht gleichzeitig alle benannten Volumes.
7. Inspektion, Logs und Ressourcenüberwachung
Das Docker-Kommando docker inspect ist eines der mächtigsten Werkzeuge, wird aber selten vollständig genutzt. Mit --format und Go-Template-Syntax extrahiert man gezielt einzelne Felder aus dem JSON-Output. docker inspect --format '{ {.State.Health.Status} }' CONTAINER gibt den Health-Status zurück. docker inspect --format '{ {range .NetworkSettings.Networks} }{ {.IPAddress} }{ {end} }' CONTAINER liefert die IP-Adresse. Diese Docker-Kommandos sind in Skripten wertvoller als das Parsen des vollen JSON-Outputs mit jq.
Für die Ressourcenüberwachung bietet das Docker-Kommando docker events einen Echtzeit-Stream aller Docker-Events – Container-Starts, Stops, Image-Pulls, Volume-Mounts. Mit --filter type=container --filter event=die kann man gezielt auf abgestürzte Container reagieren. docker system df zeigt eine Übersicht der genutzten Speichermengen für Images, Container und Volumes – das schnellste Docker-Kommando, um zu verstehen, warum die Docker-Partition voll läuft. docker system df -v gibt die Details pro Image und Volume aus.
8. Cleanup: Images, Container und Volumes aufräumen
Docker hat eine bekannte Tendenz, Speicherplatz durch alte Images, gestoppte Container und verwaiste Volumes zu belegen. Das Docker-Kommando docker system prune räumt alles auf einmal auf: gestoppte Container, ungenutzte Netzwerke, dangling Images und Build-Cache. Mit --volumes werden zusätzlich ungenutzte Volumes gelöscht – Vorsicht bei Entwicklungsumgebungen, da persistente Daten verloren gehen können. Das Flag --filter until=48h beschränkt die Bereinigung auf Ressourcen, die älter als 48 Stunden sind.
Für granulare Bereinigung gibt es spezifische Docker-Kommandos: docker image prune -a löscht alle nicht verwendeten Images, auch getaggte. docker container prune löscht gestoppte Container. docker builder prune --keep-storage 5GB begrenzt den BuildKit-Cache auf 5 GB. In CI-Pipelines wird oft docker image prune -a --filter until=1h nach dem Build ausgeführt, um den Speicherverbrauch auf dem CI-Agent zu begrenzen. Das Docker-Kommando docker system prune -af --volumes als wöchentlicher Cronjob auf Entwicklungsmaschinen hält Docker-Installationen schlank.
9. Docker-Kommandos im direkten Vergleich
Viele Aufgaben lassen sich mit verschiedenen Docker-Kommandos lösen – mit erheblichen Unterschieden in Effizienz und Sicherheit. Die Wahl des richtigen Kommandos beeinflusst direkt, wie schnell man Probleme löst und wie robust das Setup ist.
| Aufgabe | Suboptimal | Empfohlenes Kommando | Vorteil |
|---|---|---|---|
| Shell in Container | docker run -it IMAGE bash |
docker exec -it CONTAINER sh |
Laufenden Container nutzen, kein neuer Container |
| IP-Adresse ermitteln | docker inspect … | grep IPAddress |
docker inspect --format '{ {.NetworkSettings…} }' |
Direkte Ausgabe, kein grep-Parsen nötig |
| Container-Namensauflösung | docker network (default bridge) |
docker network create (user-defined) |
DNS zwischen Containern funktioniert automatisch |
| Build-Context klein halten | Kein .dockerignore |
.dockerignore mit node_modules, .git |
Build deutlich schneller, weniger Netzwerkverkehr |
| Speicherübersicht | du -sh /var/lib/docker |
docker system df -v |
Aufschlüsselung nach Images, Volumes, Cache |
Die Wahl zwischen docker run und docker exec ist der häufigste Fehler bei der Diagnose laufender Container. Wer mit docker run einen neuen Container startet, um den Zustand eines laufenden Containers zu untersuchen, bekommt einen leeren, frischen Zustand – nicht den des problematischen Containers. Nur docker exec arbeitet im selben Namespaces des laufenden Containers. Diese Unterscheidung erklärt, warum viele Docker-Kommandos für Debugging nur mit exec sinnvoll sind.
Mironsoft
Docker-Infrastruktur, Container-Stacks und CI/CD-Automatisierung
Docker-Stacks, die im Team zuverlässig funktionieren?
Wir analysieren bestehende Docker-Setups, identifizieren fragile Muster und ersetzen sie durch robuste Docker-Kommandos und Compose-Konfigurationen – mit vollständiger Fehlerbehandlung und sauberem Cleanup.
Docker-Review
Analyse bestehender Dockerfiles und Compose-Konfigurationen auf Schwachstellen und Optimierungspotenziale
Compose-Stack-Setup
Produktionsreife Docker-Compose-Stacks mit Health Checks, Restart-Policies und Secrets-Management
CI/CD-Integration
Docker-Builds und Deployments in GitLab CI, GitHub Actions oder Jenkins integrieren und optimieren
10. Zusammenfassung
Die 50 wichtigsten Docker-Kommandos und Patterns decken alle Aspekte des Container-Alltags ab: Images effizient bauen mit Multi-Stage-Builds und gezielten Build-Args, Container mit --init und --read-only sicher starten, Volumes und Netzwerke verstehen statt raten. docker inspect --format ersetzt grep-Parsen durch direkte Feldextraktion. docker compose config macht Compose-Konfigurationen transparent, bevor der Stack gestartet wird. docker system df und system prune halten Entwicklungsmaschinen und CI-Agenten sauber.
Der größte Hebel liegt in der Kombination: Docker-Kommandos für Inspektion und Debugging systematisch einzusetzen, statt Container blind neu zu starten. Wer docker logs, docker exec, docker inspect und docker stats konsequent nutzt, findet Probleme in Minuten statt Stunden. Die Ergänzung um eine gepflegte .dockerignore, gezieltes Multi-Stage-Bauen und User-definierte Netzwerke macht Docker-Setups nicht nur schneller, sondern auch deutlich wartbarer im Team.
50 Docker-Kommandos und Patterns — Das Wichtigste auf einen Blick
Images & Build
docker build --target für Multi-Stage, --no-cache bei mysteriösen Fehlern, image history für Layer-Analyse – Build-Probleme systematisch einkreisen.
Container & Debug
docker exec für Shell im laufenden Container, logs --since für zeitbasierte Logs, stats --no-stream für Ressourcenüberblick.
Netzwerke & Volumes
User-definierte Netzwerke für DNS-Auflösung, Named Volumes für Persistenz, Bind Mounts nur für Entwicklung. network inspect bei Konnektivitätsproblemen.
Cleanup & Compose
docker system prune für Speicherbereinigung, compose config für Konfigurationstransparenz, compose down -v für vollständigen Reset.