diff --git a/docker-cheatsheet.md b/docker-cheatsheet.md new file mode 100644 index 0000000..0d12171 --- /dev/null +++ b/docker-cheatsheet.md @@ -0,0 +1,285 @@ +# 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.*