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 nginx

docker run -d <image> — Startet einen Container im Hintergrund (detached).

docker run -d nginx

docker run -it <image> <command> — Startet einen Container interaktiv mit TTY. Praktisch für Shells.

docker run -it ubuntu bash

docker run --name <name> <image> — Startet einen Container mit eigenem Namen für leichtere Referenzierung.

docker run --name my-web -d nginx

docker 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-web

docker stop <container> — Stoppt einen laufenden Container sauber (sendet SIGTERM, nach Timeout SIGKILL).

docker stop my-web

docker restart <container> — Stoppt einen Container und startet ihn anschließend neu.

docker restart my-web

docker kill <container> — Stoppt einen Container sofort per SIGKILL.

docker kill my-web

docker rm <container> — Entfernt einen gestoppten Container.

docker rm my-web

docker rm -f <container> — Erzwingt das Entfernen eines laufenden Containers (Stoppen + Entfernen).

docker rm -f my-web

Ports & Umgebungsvariablen

docker run -p <host_port>:<container_port> <image> — Bildet einen Host-Port auf einen Container-Port ab.

docker run -d -p 8080:80 nginx

docker 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-server

docker run -P <image> — Bildet alle exponierten Ports auf zufällige Host-Ports ab.

docker run -d -P nginx

docker run -e <KEY>=<value> <image> — Setzt eine Umgebungsvariable im Container.

docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8

docker run --env-file <file> <image> — Lädt Umgebungsvariablen aus einer Datei.

docker run -d --env-file .env my-app

docker run --restart=<policy> <image> — Setzt die Restart-Policy: no, on-failure, always, unless-stopped.

docker run -d --restart=unless-stopped nginx

Volumes & 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 nginx

docker 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-app

docker 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:8

docker volume create <name> — Erstellt ein benanntes Volume für persistente Daten.

docker volume create db-data

docker volume ls — Listet alle Docker-Volumes auf.

docker volume ls

docker volume inspect <name> — Zeigt detaillierte Informationen zu einem Volume.

docker volume inspect db-data

docker volume rm <name> — Entfernt ein Volume. Schlägt fehl, wenn es noch benutzt wird.

docker volume rm db-data

docker volume prune — Entfernt alle ungenutzten Volumes und gibt Speicherplatz frei.

docker volume prune

Auflisten & Inspizieren

docker ps — Listet alle laufenden Container auf.

docker ps

docker ps -a — Listet alle Container auf, auch gestoppte.

docker ps -a

docker 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-web

docker inspect --format '{{.NetworkSettings.IPAddress}}' <container> — Extrahiert ein bestimmtes Feld aus den Container-Metadaten per Go-Template.

docker inspect --format '{{.NetworkSettings.IPAddress}}' my-web

docker port <container> — Zeigt die Port-Zuordnungen eines Containers.

docker port my-web

docker stats — Zeigt CPU-, Speicher-, Netzwerk- und Disk-I/O-Auslastung aller laufenden Container live an.

docker stats

docker top <container> — Zeigt die laufenden Prozesse innerhalb eines Containers.

docker top my-web

Logs & Exec

docker logs <container> — Zeigt die Logs (stdout/stderr) eines Containers.

docker logs my-web

docker logs -f <container> — Folgt der Log-Ausgabe in Echtzeit (tail).

docker logs -f my-web

docker logs --tail <n> <container> — Zeigt nur die letzten N Zeilen der Logs.

docker logs --tail 50 my-web

docker logs --since <time> <container> — Zeigt Logs ab einem Zeitstempel oder relativer Zeit.

docker logs --since 30m my-web

docker exec -it <container> <command> — Führt einen Befehl interaktiv in einem laufenden Container aus.

docker exec -it my-web bash

docker exec <container> <command> — Führt einen Befehl in einem laufenden Container aus (nicht interaktiv).

docker exec my-web cat /etc/nginx/nginx.conf

docker exec -u <user> <container> <command> — Führt einen Befehl als bestimmter Benutzer im Container aus.

docker exec -u root my-web apt-get update

Kopieren & Diff

docker cp <container>:<path> <host_path> — Kopiert Dateien aus einem Container auf den Host.

docker cp my-web:/etc/nginx/nginx.conf ./nginx.conf

docker 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-web

Images

docker images — Listet alle lokal verfügbaren Images auf.

docker images

docker pull <image> — Lädt ein Image aus einer Registry herunter.

docker pull nginx:alpine

docker pull <image>:<tag> — Lädt eine bestimmte getaggte Version eines Images herunter.

docker pull node:22-slim

docker push <image> — Lädt ein Image in eine Registry hoch.

docker push myuser/my-app:latest

docker tag <source_image> <target_image> — Erstellt einen neuen Tag (Alias) für ein vorhandenes Image.

docker tag my-app:latest myuser/my-app:v1.0

docker rmi <image> — Entfernt ein lokales Image.

docker rmi nginx:alpine

docker image prune — Entfernt alle ungenutzten (dangling/untagged) Images.

docker image prune

docker image prune -a — Entfernt alle Images, die von keinem Container genutzt werden.

docker image prune -a

docker history <image> — Zeigt die Layer-Historie eines Images.

docker history nginx:alpine

docker save -o <file> <image> — Exportiert ein Image in ein Tar-Archiv.

docker save -o my-app.tar my-app:latest

docker load -i <file> — Importiert ein Image aus einem Tar-Archiv.

docker load -i my-app.tar

Images 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 ls

docker network create <name> — Erstellt ein neues Bridge-Netzwerk.

docker network create my-network

docker network inspect <name> — Zeigt detaillierte Informationen zu einem Netzwerk inkl. verbundener Container.

docker network inspect my-network

docker network connect <network> <container> — Verbindet einen laufenden Container mit einem Netzwerk.

docker network connect my-network my-web

docker network disconnect <network> <container> — Trennt einen Container von einem Netzwerk.

docker network disconnect my-network my-web

docker run --network <name> <image> — Startet einen Container, der an ein bestimmtes Netzwerk angebunden ist.

docker run -d --network my-network --name api my-api

docker network rm <name> — Entfernt ein Netzwerk. Schlägt fehl, wenn noch Container verbunden sind.

docker network rm my-network

docker network prune — Entfernt alle ungenutzten Netzwerke.

docker network prune

Docker Compose

docker compose up — Erstellt und startet alle in docker-compose.yml definierten Services.

docker compose up

docker compose up -d — Startet alle Services im Hintergrund (detached).

docker compose up -d

docker compose up --build — Baut Images neu, bevor die Services gestartet werden.

docker compose up --build -d

docker compose down — Stoppt und entfernt alle von up erstellten Container und Netzwerke.

docker compose down

docker compose down -v — Stoppt und entfernt Container, Netzwerke und Volumes.

docker compose down -v

docker compose ps — Listet die Container des aktuellen Compose-Projekts auf.

docker compose ps

docker compose logs <service> — Zeigt die Logs eines bestimmten Services.

docker compose logs web

docker compose logs -f — Folgt den Logs aller Services in Echtzeit.

docker compose logs -f

docker compose exec <service> <command> — Führt einen Befehl in einem laufenden Compose-Service-Container aus.

docker compose exec web bash

docker compose run <service> <command> — Startet einen einmaligen Befehl in einem neuen Container für einen Service.

docker compose run web npm test

docker compose pull — Lädt die aktuellen Images für alle Services herunter.

docker compose pull

docker compose build — Baut oder baut alle Service-Images neu.

docker compose build

docker compose restart <service> — Startet einen bestimmten Service neu.

docker compose restart web

docker compose config — Validiert und zeigt die aufgelöste Compose-Konfiguration.

docker compose config

Aufräumen & System

docker system df — Zeigt den Docker-Speicherverbrauch: Images, Container, Volumes und Build-Cache.

docker system df

docker system df -v — Zeigt den Speicherverbrauch detailliert mit Einzelgrößen.

docker system df -v

docker system prune — Entfernt alle gestoppten Container, ungenutzten Netzwerke, dangling Images und den Build-Cache.

docker system prune

docker system prune -a — Entfernt alles Ungenutzte: alle Images, Container, Netzwerke und Cache.

docker system prune -a

docker system prune -a --volumes — Vollständiges Aufräumen inkl. ungenutzter Volumes. Gibt maximalen Speicher frei.

docker system prune -a --volumes

docker container prune — Entfernt alle gestoppten Container.

docker container prune

docker system info — Zeigt systemweite Docker-Informationen (Version, Storage-Driver, OS usw.).

docker system info

docker version — Zeigt Versionsdetails von Docker-Client und -Server.

docker version

Ressourcen-Limits

docker run -m <memory> <image> — Setzt ein Speicher-Limit für den Container.

docker run -d -m 512m nginx

docker run --cpus=<number> <image> — Begrenzt die Anzahl der CPU-Kerne, die der Container nutzen darf.

docker run -d --cpus=1.5 my-app

docker 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-app

docker run --pids-limit=<number> <image> — Begrenzt die Anzahl der Prozesse im Container.

docker run -d --pids-limit=100 my-app

docker 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.

Verwandte Kommandos

  • ddev – lokale Docker-Entwicklungsumgebungen für PHP-Projekte
  • docker-compose – Multi-Container-Anwendungen deklarativ definieren
  • helm – Paketmanager für Kubernetes-Anwendungen