Docker — Container bauen, ausliefern und betreiben
Praxis-Guide zu Docker — Container-Lebenszyklus, Images bauen, Volumes, Netzwerke, Compose und Aufräumen auf der Kommandozeile, mit Beispielen.
Docker verpackt Anwendungen samt ihren Abhängigkeiten in Container – leichtgewichtige, isolierte Einheiten, die auf jedem System gleich laufen. Statt „funktioniert bei mir" bekommst du reproduzierbare Umgebungen vom Laptop bis zur Produktion. Über die Kommandozeile baust du Images, startest Container, mappst Ports, mountest Volumes und orchestrierst ganze Stacks per Compose. Dieser Guide bündelt die wichtigsten docker-Befehle für den Alltag – vom ersten docker run bis zum gezielten Aufräumen mit prune.
Container-Lebenszyklus
docker run <image> — Erstellt und startet einen neuen Container aus einem Image.
docker run nginxdocker run -d <image> — Startet einen Container im Hintergrund (detached).
docker run -d nginxdocker run -it <image> <command> — Startet einen Container interaktiv mit TTY. Praktisch für Shells.
docker run -it ubuntu bashdocker run --name <name> <image> — Startet einen Container mit eigenem Namen für leichtere Referenzierung.
docker run --name my-web -d nginxdocker run --rm <image> — Entfernt den Container automatisch, sobald er beendet wird.
docker run --rm alpine echo "Hello"docker start <container> — Startet einen gestoppten Container.
docker start my-webdocker stop <container> — Stoppt einen laufenden Container sauber (sendet SIGTERM, nach Timeout SIGKILL).
docker stop my-webdocker restart <container> — Stoppt einen Container und startet ihn anschließend neu.
docker restart my-webdocker kill <container> — Stoppt einen Container sofort per SIGKILL.
docker kill my-webdocker rm <container> — Entfernt einen gestoppten Container.
docker rm my-webdocker rm -f <container> — Erzwingt das Entfernen eines laufenden Containers (Stoppen + Entfernen).
docker rm -f my-webPorts & Umgebungsvariablen
docker run -p <host_port>:<container_port> <image> — Bildet einen Host-Port auf einen Container-Port ab.
docker run -d -p 8080:80 nginxdocker run -p <host_port>:<container_port>/udp <image> — Bildet einen UDP-Port vom Host auf den Container ab.
docker run -d -p 5353:53/udp dns-serverdocker run -P <image> — Bildet alle exponierten Ports auf zufällige Host-Ports ab.
docker run -d -P nginxdocker run -e <KEY>=<value> <image> — Setzt eine Umgebungsvariable im Container.
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8docker run --env-file <file> <image> — Lädt Umgebungsvariablen aus einer Datei.
docker run -d --env-file .env my-appdocker run --restart=<policy> <image> — Setzt die Restart-Policy: no, on-failure, always, unless-stopped.
docker run -d --restart=unless-stopped nginxVolumes & Mounts
docker run -v <host_path>:<container_path> <image> — Bindet ein Host-Verzeichnis als Bind-Mount in den Container ein.
docker run -d -v ./html:/usr/share/nginx/html nginxdocker run -v <host_path>:<container_path>:ro <image> — Bindet ein Host-Verzeichnis schreibgeschützt (read-only) ein.
docker run -d -v ./config:/etc/app/config:ro my-appdocker run -v <volume_name>:<container_path> <image> — Bindet ein benanntes Docker-Volume in den Container ein.
docker run -d -v db-data:/var/lib/mysql mysql:8docker volume create <name> — Erstellt ein benanntes Volume für persistente Daten.
docker volume create db-datadocker volume ls — Listet alle Docker-Volumes auf.
docker volume lsdocker volume inspect <name> — Zeigt detaillierte Informationen zu einem Volume.
docker volume inspect db-datadocker volume rm <name> — Entfernt ein Volume. Schlägt fehl, wenn es noch benutzt wird.
docker volume rm db-datadocker volume prune — Entfernt alle ungenutzten Volumes und gibt Speicherplatz frei.
docker volume pruneAuflisten & Inspizieren
docker ps — Listet alle laufenden Container auf.
docker psdocker ps -a — Listet alle Container auf, auch gestoppte.
docker ps -adocker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" — Listet Container in einem eigenen Ausgabeformat auf.
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"docker inspect <container> — Zeigt detaillierte JSON-Informationen zu einem Container.
docker inspect my-webdocker inspect --format '{{.NetworkSettings.IPAddress}}' <container> — Extrahiert ein bestimmtes Feld aus den Container-Metadaten per Go-Template.
docker inspect --format '{{.NetworkSettings.IPAddress}}' my-webdocker port <container> — Zeigt die Port-Zuordnungen eines Containers.
docker port my-webdocker stats — Zeigt CPU-, Speicher-, Netzwerk- und Disk-I/O-Auslastung aller laufenden Container live an.
docker statsdocker top <container> — Zeigt die laufenden Prozesse innerhalb eines Containers.
docker top my-webLogs & Exec
docker logs <container> — Zeigt die Logs (stdout/stderr) eines Containers.
docker logs my-webdocker logs -f <container> — Folgt der Log-Ausgabe in Echtzeit (tail).
docker logs -f my-webdocker logs --tail <n> <container> — Zeigt nur die letzten N Zeilen der Logs.
docker logs --tail 50 my-webdocker logs --since <time> <container> — Zeigt Logs ab einem Zeitstempel oder relativer Zeit.
docker logs --since 30m my-webdocker exec -it <container> <command> — Führt einen Befehl interaktiv in einem laufenden Container aus.
docker exec -it my-web bashdocker exec <container> <command> — Führt einen Befehl in einem laufenden Container aus (nicht interaktiv).
docker exec my-web cat /etc/nginx/nginx.confdocker exec -u <user> <container> <command> — Führt einen Befehl als bestimmter Benutzer im Container aus.
docker exec -u root my-web apt-get updateKopieren & Diff
docker cp <container>:<path> <host_path> — Kopiert Dateien aus einem Container auf den Host.
docker cp my-web:/etc/nginx/nginx.conf ./nginx.confdocker cp <host_path> <container>:<path> — Kopiert Dateien vom Host in einen Container.
docker cp ./index.html my-web:/usr/share/nginx/html/docker diff <container> — Zeigt Dateisystem-Änderungen im Container (A=hinzugefügt, C=geändert, D=gelöscht).
docker diff my-webImages
docker images — Listet alle lokal verfügbaren Images auf.
docker imagesdocker pull <image> — Lädt ein Image aus einer Registry herunter.
docker pull nginx:alpinedocker pull <image>:<tag> — Lädt eine bestimmte getaggte Version eines Images herunter.
docker pull node:22-slimdocker push <image> — Lädt ein Image in eine Registry hoch.
docker push myuser/my-app:latestdocker tag <source_image> <target_image> — Erstellt einen neuen Tag (Alias) für ein vorhandenes Image.
docker tag my-app:latest myuser/my-app:v1.0docker rmi <image> — Entfernt ein lokales Image.
docker rmi nginx:alpinedocker image prune — Entfernt alle ungenutzten (dangling/untagged) Images.
docker image prunedocker image prune -a — Entfernt alle Images, die von keinem Container genutzt werden.
docker image prune -adocker history <image> — Zeigt die Layer-Historie eines Images.
docker history nginx:alpinedocker save -o <file> <image> — Exportiert ein Image in ein Tar-Archiv.
docker save -o my-app.tar my-app:latestdocker load -i <file> — Importiert ein Image aus einem Tar-Archiv.
docker load -i my-app.tarImages bauen
docker build -t <name>:<tag> . — Baut ein Image aus einem Dockerfile im aktuellen Verzeichnis.
docker build -t my-app:latest .docker build -t <name> -f <dockerfile> . — Baut mit einem bestimmten Dockerfile.
docker build -t my-app -f Dockerfile.prod .docker build --no-cache -t <name> . — Baut ohne Layer-Cache. Erzwingt einen frischen Build.
docker build --no-cache -t my-app:latest .docker build --build-arg <KEY>=<value> -t <name> . — Übergibt eine Build-Variable an das Dockerfile.
docker build --build-arg NODE_ENV=production -t my-app .docker build --target <stage> -t <name> . — Baut nur bis zu einer bestimmten Stage in einem Multi-Stage-Dockerfile.
docker build --target builder -t my-app:build .docker build --platform <platform> -t <name> . — Baut für eine bestimmte Plattform-Architektur.
docker build --platform linux/amd64 -t my-app .Netzwerke
docker network ls — Listet alle Docker-Netzwerke auf.
docker network lsdocker network create <name> — Erstellt ein neues Bridge-Netzwerk.
docker network create my-networkdocker network inspect <name> — Zeigt detaillierte Informationen zu einem Netzwerk inkl. verbundener Container.
docker network inspect my-networkdocker network connect <network> <container> — Verbindet einen laufenden Container mit einem Netzwerk.
docker network connect my-network my-webdocker network disconnect <network> <container> — Trennt einen Container von einem Netzwerk.
docker network disconnect my-network my-webdocker run --network <name> <image> — Startet einen Container, der an ein bestimmtes Netzwerk angebunden ist.
docker run -d --network my-network --name api my-apidocker network rm <name> — Entfernt ein Netzwerk. Schlägt fehl, wenn noch Container verbunden sind.
docker network rm my-networkdocker network prune — Entfernt alle ungenutzten Netzwerke.
docker network pruneDocker Compose
docker compose up — Erstellt und startet alle in docker-compose.yml definierten Services.
docker compose updocker compose up -d — Startet alle Services im Hintergrund (detached).
docker compose up -ddocker compose up --build — Baut Images neu, bevor die Services gestartet werden.
docker compose up --build -ddocker compose down — Stoppt und entfernt alle von up erstellten Container und Netzwerke.
docker compose downdocker compose down -v — Stoppt und entfernt Container, Netzwerke und Volumes.
docker compose down -vdocker compose ps — Listet die Container des aktuellen Compose-Projekts auf.
docker compose psdocker compose logs <service> — Zeigt die Logs eines bestimmten Services.
docker compose logs webdocker compose logs -f — Folgt den Logs aller Services in Echtzeit.
docker compose logs -fdocker compose exec <service> <command> — Führt einen Befehl in einem laufenden Compose-Service-Container aus.
docker compose exec web bashdocker compose run <service> <command> — Startet einen einmaligen Befehl in einem neuen Container für einen Service.
docker compose run web npm testdocker compose pull — Lädt die aktuellen Images für alle Services herunter.
docker compose pulldocker compose build — Baut oder baut alle Service-Images neu.
docker compose builddocker compose restart <service> — Startet einen bestimmten Service neu.
docker compose restart webdocker compose config — Validiert und zeigt die aufgelöste Compose-Konfiguration.
docker compose configAufräumen & System
docker system df — Zeigt den Docker-Speicherverbrauch: Images, Container, Volumes und Build-Cache.
docker system dfdocker system df -v — Zeigt den Speicherverbrauch detailliert mit Einzelgrößen.
docker system df -vdocker system prune — Entfernt alle gestoppten Container, ungenutzten Netzwerke, dangling Images und den Build-Cache.
docker system prunedocker system prune -a — Entfernt alles Ungenutzte: alle Images, Container, Netzwerke und Cache.
docker system prune -adocker system prune -a --volumes — Vollständiges Aufräumen inkl. ungenutzter Volumes. Gibt maximalen Speicher frei.
docker system prune -a --volumesdocker container prune — Entfernt alle gestoppten Container.
docker container prunedocker system info — Zeigt systemweite Docker-Informationen (Version, Storage-Driver, OS usw.).
docker system infodocker version — Zeigt Versionsdetails von Docker-Client und -Server.
docker versionRessourcen-Limits
docker run -m <memory> <image> — Setzt ein Speicher-Limit für den Container.
docker run -d -m 512m nginxdocker run --cpus=<number> <image> — Begrenzt die Anzahl der CPU-Kerne, die der Container nutzen darf.
docker run -d --cpus=1.5 my-appdocker run --memory-swap=<limit> <image> — Setzt das Limit für Speicher + Swap. -1 für unbegrenzten Swap.
docker run -d -m 512m --memory-swap=1g my-appdocker run --pids-limit=<number> <image> — Begrenzt die Anzahl der Prozesse im Container.
docker run -d --pids-limit=100 my-appdocker update --memory <limit> <container> — Aktualisiert Ressourcen-Limits eines laufenden Containers.
docker update --memory 1g my-web Fazit
Docker ist aus moderner Entwicklung und DevOps kaum noch wegzudenken: Was als einzelner Container beginnt, wächst schnell zu mehrstufigen Builds, Compose-Stacks und CI/CD-Pipelines. Wenn du die Befehle aus diesem Guide verinnerlicht hast, lohnt der nächste Blick auf schlanke Multi-Stage-Images, benannte Volumes für persistente Daten und regelmäßiges prune, damit dir der Speicher nicht zuläuft.
Weiterführende Links
- Docker-Dokumentation – offizielle Referenz und Handbücher (englisch)
- docker CLI-Referenz – alle Befehle und Optionen (englisch)
- Docker (Software) – Wikipedia – Hintergrund und Architektur
Verwandte Kommandos
- ddev – lokale Docker-Entwicklungsumgebungen für PHP-Projekte
- docker-compose – Multi-Container-Anwendungen deklarativ definieren
- helm – Paketmanager für Kubernetes-Anwendungen