50 Docker-Kommandos und Patterns für Entwickler | mironsoft.de
AI generated
Docker · Container · DevOps · CLI
50 Docker-Kommandos und Patterns für Entwickler
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.

20 Min. Lesezeit docker run · build · exec · inspect · Compose Docker 24+ · Docker Compose v2 · Linux · macOS

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.

11. FAQ: Docker-Kommandos und Patterns für Entwickler

1Unterschied docker run vs. docker exec?
docker run startet einen neuen Container aus einem Image. docker exec führt einen Befehl im laufenden Container aus. Für Debugging immer exec – run erstellt eine leere neue Instanz.
2Warum keine Container-Namensauflösung im Standard-Netzwerk?
Das Default-Bridge-Netzwerk hat kein internes DNS. User-definierte Netzwerke aktivieren automatisch DNS – Container können sich per Name ansprechen.
3Wie halte ich den Build-Cache sauber?
docker builder prune --keep-storage 5GB. In CI: docker image prune -a --filter until=1h nach dem Build. docker system prune -a für vollständige Bereinigung.
4Was macht --init bei docker run?
Startet tini als PID 1 – leitet Signals korrekt weiter und räumt Zombie-Prozesse auf. Besonders wichtig bei Apps ohne eigene Signal-Handler.
5IP-Adresse per Skript extrahieren?
docker inspect --format '{ {range .NetworkSettings.Networks} }{ {.IPAddress} }{ {end} }' CONTAINER – direkt, ohne grep oder jq.
6Named Volumes vs. Bind Mounts?
Named Volumes für Persistenz in Produktion. Bind Mounts für Quellcode in der Entwicklung. In Produktion Named Volumes bevorzugen – plattformunabhängig, Docker-verwaltet.
7Wie verkleinere ich mein Docker-Image?
Multi-Stage-Builds, .dockerignore, RUN-Kommandos zusammenfassen, Alpine-Basis. docker image history zeigt welche Layer am meisten Platz belegen.
8Was zeigt docker system df?
Speichernutzung nach Images, Containern, Volumes und Build-Cache aufgeschlüsselt. -v gibt Details pro Image und Volume. Schnellste Übersicht bei vollem Docker-Speicher.
9Nur bestimmte Compose-Services starten?
Profiles: services mit profiles: [dev] markieren, docker compose --profile dev up. Oder direkt: docker compose up app db – startet nur die benannten Services und Abhängigkeiten.
10Netzwerkprobleme zwischen Containern debuggen?
docker network inspect NETWORK. Für tiefere Analyse: docker run --rm --network container:ZIEL nicolaka/netshoot – tcpdump, nmap und dig im Namensraum des Zielcontainers.