# Docker & Docker Compose – Befehls‑Referenz Eine praktische Übersicht der wichtigsten Befehle für den Alltag – von Container‑Verwaltung über Docker Compose bis zur Netzwerk‑Untersuchung. > Hinweis: Je nach Installation heißt der Compose‑Befehl `docker compose` (Plugin, neu) oder `docker-compose` (Standalone, alt). Beide Varianten sind unten aufgeführt, wo es relevant ist. --- ## 1. Container – Grundlagen | Zweck | Befehl | |-------|--------| | Laufende Container anzeigen | `docker ps` | | Alle Container (auch gestoppte) | `docker ps -a` | | Container starten | `docker start ` | | Container stoppen | `docker stop ` | | Container neu starten | `docker restart ` | | Container pausieren / fortsetzen | `docker pause ` / `docker unpause ` | | Container löschen | `docker rm ` | | Laufenden Container zwangsweise löschen | `docker rm -f ` | | Alle gestoppten Container aufräumen | `docker container prune` | ### In einen Container hineingehen ```bash # Interaktive Shell öffnen (bash oder sh, je nach Image) docker exec -it bash docker exec -it sh # Einzelnen Befehl im Container ausführen docker exec ls -la /data # Als bestimmter User (z. B. root) docker exec -it -u root sh ``` --- ## 2. Logs & Diagnose ```bash # Logs anzeigen docker logs # Logs live mitverfolgen (folgen) docker logs -f # Nur die letzten 100 Zeilen, mit Zeitstempel docker logs --tail 100 -t # Logs seit einem Zeitpunkt docker logs --since 10m # Ressourcen-Verbrauch live (CPU, RAM, Netzwerk, I/O) docker stats # Prozesse innerhalb eines Containers docker top # Vollständige Metadaten (JSON): Mounts, Netzwerk, Env, ... docker inspect # Gezielt einen Wert herausfiltern (z. B. IP-Adresse) docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' # Geänderte Dateien im Container-Dateisystem docker diff ``` --- ## 3. Images | Zweck | Befehl | |-------|--------| | Lokale Images anzeigen | `docker images` | | Image herunterladen | `docker pull :` | | Image löschen | `docker rmi ` | | Ungenutzte Images aufräumen | `docker image prune` | | Image aus Dockerfile bauen | `docker build -t : .` | | Image-Historie / Layer ansehen | `docker history ` | --- ## 4. Volumes & Daten ```bash # Volumes auflisten docker volume ls # Volume-Details (z. B. Mountpoint auf dem Host) docker volume inspect # Ungenutzte Volumes aufräumen (VORSICHT: Daten weg!) docker volume prune # Datei vom Host in den Container kopieren docker cp ./datei.txt :/pfad/im/container/ # Datei aus dem Container auf den Host holen docker cp :/pfad/im/container/datei.txt ./ ``` --- ## 5. Aufräumen (Speicher freigeben) ```bash # Alles Ungenutzte entfernen (gestoppte Container, dangling Images, Netzwerke) docker system prune # Zusätzlich ungenutzte Images UND Volumes (aggressiv!) docker system prune -a --volumes # Speicherverbrauch von Docker anzeigen docker system df ``` --- ## 6. Docker Compose – Grundlagen Alle Befehle im Verzeichnis mit der `docker-compose.yml` ausführen. | Zweck | Befehl | |-------|--------| | Stack starten (im Hintergrund) | `docker compose up -d` | | Stack starten + Images neu bauen | `docker compose up -d --build` | | Stack stoppen & Container entfernen | `docker compose down` | | Stack stoppen (Container bleiben) | `docker compose stop` | | Gestoppten Stack wieder starten | `docker compose start` | | Einen einzelnen Dienst neu starten | `docker compose restart ` | | Status aller Dienste | `docker compose ps` | | Logs aller Dienste (live) | `docker compose logs -f` | | Logs eines Dienstes | `docker compose logs -f ` | | In einen Dienst hineingehen | `docker compose exec sh` | | Images der Dienste aktualisieren | `docker compose pull` | | Config einlesen & validieren | `docker compose config` | ### Down mit Aufräumen ```bash # Stack runterfahren UND die zugehörigen Volumes löschen (VORSICHT!) docker compose down -v # Zusätzlich auch die gebauten/verwendeten Images entfernen docker compose down --rmi all ``` ### Update-Workflow (typisch) ```bash docker compose pull # neue Images holen docker compose up -d # Container mit neuen Images neu erstellen docker image prune -f # alte, ungenutzte Images aufräumen ``` --- ## 7. Netzwerk – Untersuchung & Verwaltung Der zentrale Teil, wenn Container sich nicht erreichen oder Ports nicht durchkommen. ### 7.1 Netzwerke auflisten & inspizieren ```bash # Alle Docker-Netzwerke anzeigen docker network ls # Details eines Netzwerks: welche Container hängen dran, Subnetz, Gateway docker network inspect # Kompakt: nur die Container-Namen + IPs eines Netzwerks docker network inspect \ -f '{{range .Containers}}{{.Name}} → {{.IPv4Address}}{{println}}{{end}}' ``` Die Standard-Netzwerktypen: - **bridge** – Standard für einzelne Container auf einem Host. - **host** – Container teilt sich den Netzwerk-Stack des Hosts (kein Port-Mapping nötig). - **none** – kein Netzwerk. - **benutzerdefinierte bridge** – von Compose automatisch pro Projekt angelegt; hier funktioniert DNS-Auflösung über Service-Namen. ### 7.2 Netzwerke anlegen / verbinden ```bash # Netzwerk erstellen docker network create # Container mit einem Netzwerk verbinden docker network connect # Container von einem Netzwerk trennen docker network disconnect # Ungenutzte Netzwerke aufräumen docker network prune ``` ### 7.3 Ports & Erreichbarkeit prüfen ```bash # Welche Ports mappt ein Container? docker port # Port-Mappings in der Übersicht (Spalte PORTS) docker ps # Auf dem Host: lauscht der Port wirklich? ss -tulpn | grep # modern netstat -tulpn | grep # klassisch ``` ### 7.4 Verbindung zwischen Containern testen Wichtig: In einem benutzerdefinierten Compose-Netzwerk erreichen sich Container über ihren **Service-Namen** als Hostname (z. B. `db`, `gitea`, `redis`). ```bash # DNS-Auflösung + Erreichbarkeit vom Container A zum Service "db" docker compose exec app ping -c 3 db # Falls ping fehlt: mit wget/curl gegen den Ziel-Port testen docker compose exec app wget -qO- http://db:5432 || echo "nicht erreichbar" docker compose exec app curl -v http://gitea:3000 # DNS-Auflösung explizit prüfen (nslookup / getent) docker compose exec app nslookup db docker compose exec app getent hosts db ``` Wenn Diagnose-Tools im Container fehlen, hilft ein Wegwerf-Container im selben Netzwerk: ```bash docker run --rm -it --network nicolaka/netshoot # darin dann: ping, curl, dig, nslookup, traceroute, tcpdump, nmap ... ``` `nicolaka/netshoot` ist das Standard-Toolbox-Image für Container-Netzwerk-Debugging. ### 7.5 Häufige Netzwerk-Probleme | Symptom | Prüfen | |---------|--------| | Container erreicht anderen nicht über Namen | Hängen beide im **selben** Netzwerk? → `docker network inspect` | | Port von außen nicht erreichbar | Port-Mapping gesetzt (`-p host:container` / `ports:` in Compose)? Firewall? | | „Connection refused" | Dienst lauscht evtl. nur auf `127.0.0.1` statt `0.0.0.0` im Container | | DNS-Name wird nicht aufgelöst | Standard-`bridge` hat kein DNS – benutzerdefiniertes Netzwerk / Compose nutzen | | Zwei Stacks sollen sich sehen | Gemeinsames externes Netzwerk anlegen und beiden zuweisen | --- ## 8. Nützliche Kombi-Befehle ```bash # Alle laufenden Container stoppen docker stop $(docker ps -q) # Alle Container löschen (gestoppt) docker rm $(docker ps -aq) # In den zuletzt gestarteten Container springen docker exec -it $(docker ps -q -n 1) sh # Nur Namen + Status + Ports, sauber formatiert docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' # Live-Logs eines Compose-Dienstes ab jetzt (ohne Historie) docker compose logs -f --tail 0 ``` --- ## 9. Schnelle Fehlersuche – Reihenfolge 1. **Läuft der Container überhaupt?** → `docker ps -a` (Status `Exited` / `Restarting`?) 2. **Warum crasht er?** → `docker logs --tail 100 ` 3. **Stimmen Mounts / Env / Netzwerk?** → `docker inspect ` 4. **Hängt er am Netzwerk?** → `docker network inspect ` + Ping-Test (Abschnitt 7.4) 5. **Ist der Port offen?** → `docker port ` + `ss -tulpn` auf dem Host 6. **Platz voll?** → `docker system df` → ggf. `docker system prune` --- *Erstellt als schnelle Referenz – bei Docker Compose v1 überall `docker compose` durch `docker-compose` ersetzen.*