⌨️Befehls-Spickzettel
Die wichtigsten Docker- und Compose-Befehle mit Erklärung und Beispielausgabe. IDs, Größen und Zeiten in den Ausgaben sind Beispiele bzw. mit „…“ gekürzt.
$ docker pull nginx:1.27-alpineImage aus der Registry laden (ohne Tag: latest).
1.27-alpine: Pulling from library/nginx …: Pull complete Digest: sha256:… Status: Downloaded newer image for nginx:1.27-alpine docker.io/library/nginx:1.27-alpine
$ docker imagesLokale Images auflisten (auch: docker image ls).
REPOSITORY TAG IMAGE ID CREATED SIZE visualdocker latest 4c1d0e5f9a2b 2 hours ago … nginx 1.27-alpine 7d3a1b2c4e5f 3 weeks ago …
$ docker build -t meine-app:1.0 .Image aus dem Dockerfile im aktuellen Ordner bauen; der Ordner ist der Build-Kontext.
[+] Building 12.3s (14/14) FINISHED => [deps 4/4] RUN npm ci CACHED => [builder 3/4] COPY . . 0.4s => [builder 4/4] RUN npm run build 9.8s => exporting to image 0.6s => => naming to docker.io/library/meine-app:1.0
💡 --no-cache baut ohne Cache, --target <stufe> nur bis zu einer Stufe, --progress=plain zeigt alle Ausgaben.
$ docker history nginx:1.27-alpineSchichten eines Images mit Größe und erzeugender Anweisung.
IMAGE CREATED BY SIZE
<missing> CMD ["nginx" "-g" "daemon off;"] 0B
<missing> STOPSIGNAL SIGQUIT 0B
<missing> EXPOSE map[80/tcp:{}] 0B
<missing> RUN /bin/sh -c set -x && addgroup … …MB$ docker tag meine-app:1.0 ghcr.io/org/meine-app:1.0Zusätzlichen Namen vergeben – kein Kopieren, nur ein weiterer Verweis auf dieselbe Image-ID.
$ docker push ghcr.io/org/meine-app:1.0Image in eine Registry hochladen; vorhandene Schichten werden übersprungen.
…: Layer already exists …: Pushed 1.0: digest: sha256:… size: 1993
$ docker image inspect --format '{{.Config.Cmd}}' nginxEinzelne Felder der Image-Konfiguration mit Go-Templates auslesen.
[nginx -g daemon off;]
$ docker run -d --name web -p 8080:80 nginxContainer im Hintergrund starten, Port 8080 des Hosts auf 80 im Container.
3f9c2a7d1b4e…(64 Hex-Zeichen)
💡 --rm löscht den Container nach dem Ende, -it für interaktive Shells, -e für Umgebungsvariablen.
$ docker ps -aContainer auflisten – ohne -a nur laufende.
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES 3f9c2a7d1b4e nginx "/docker-entrypoint.…" Up 5 minutes 0.0.0.0:8080->80/tcp web 8b1e0c3d2a7f alpine "sh" Exited (0) 2 hours ago quizzical_hopper
$ docker exec -it web shZusätzlichen Prozess im laufenden Container starten – z. B. eine Shell. Gleiche Namespaces wie PID 1.
$ docker stop webSIGTERM (bzw. STOPSIGNAL) an PID 1, nach 10 s SIGKILL. -t ändert die Frist.
web
$ docker rm -f webContainer löschen (-f: auch laufend). Benannte Volumes bleiben erhalten.
web
$ docker cp web:/etc/nginx/nginx.conf .Dateien zwischen Container und Host kopieren – funktioniert auch bei gestoppten Containern.
$ docker update --restart unless-stopped --memory 512m webRestart-Policy und Ressourcengrenzen eines bestehenden Containers ändern.
web
$ docker logs -f --tail 50 webSTDOUT/STDERR des Containers anzeigen und folgen.
/docker-entrypoint.sh: Configuration complete; ready for start up 172.17.0.1 - - [24/Sep/2026:10:15:02 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/8.5.0"
$ docker inspect --format '{{.State.Health.Status}}' visualdemo-dbHealth-Status (starting/healthy/unhealthy) auslesen; ohne --format das komplette JSON.
healthy
$ docker stats --no-streamCPU, RAM, Netz und I/O je Container – die Werte stammen aus den cgroups.
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O PIDS 3f9c2a7d1b4e web 0.00% 9.2MiB / 512MiB 1.80% 1.2kB / 780B 9
$ docker top webProzesse im Container – mit den PIDs des Hosts.
UID PID PPID CMD root 48213 48190 nginx: master process nginx -g daemon off; 101 48260 48213 nginx: worker process
$ docker events --since 10mEreignisstrom des Daemons: create, start, health_status, die, destroy …
$ docker system dfPlatzverbrauch von Images, Containern, Volumes und Build-Cache.
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 12 5 …GB …GB (…%) Containers 6 5 …MB … Local Volumes 4 3 …MB … Build Cache 87 0 …GB …GB
$ docker network create --subnet 10.89.61.0/24 app-netzEigenes Bridge-Netz mit festem Subnetz und eingebautem DNS anlegen.
$ docker network lsNetze auflisten – bridge, host und none gibt es immer.
NETWORK ID NAME DRIVER SCOPE 1a2b3c4d5e6f bridge bridge local 2b3c4d5e6f7a host host local 3c4d5e6f7a8b none null local 4d5e6f7a8b9c visualdemo_default bridge local
$ docker network inspect visualdemo_defaultSubnetz, Gateway und angeschlossene Container (mit IPs) eines Netzes.
$ docker port webVeröffentlichte Ports eines Containers.
80/tcp -> 0.0.0.0:8080 80/tcp -> [::]:8080
$ docker volume lsVolumes auflisten; Compose-Volumes heißen <projekt>_<name>.
DRIVER VOLUME NAME local visualdemo_db-data
$ docker volume inspect visualdemo_db-dataSpeicherort (Mountpoint) und Labels eines Volumes.
[{ "Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/visualdemo_db-data/_data",
"Name": "visualdemo_db-data" }]$ docker compose up -d --buildImages bauen (falls nötig), Netze/Volumes anlegen, Container in Abhängigkeitsreihenfolge starten.
[+] Running 4/4 ✔ Network visualdemo_default Created ✔ Volume "visualdemo_db-data" Created ✔ Container visualdemo-db Healthy ✔ Container visualdemo-app Started
$ docker compose psContainer des Projekts mit Status und Ports.
NAME IMAGE SERVICE STATUS PORTS visualdemo-app visualdemo:latest app Up 2 minutes (healthy) 127.0.0.1:3051->3000/tcp visualdemo-db mariadb:11.4 db Up 2 minutes (healthy) 3306/tcp
$ docker compose logs -f appLogs eines oder aller Services, farbig nach Service getrennt.
$ docker compose configZusammengeführte, interpolierte Konfiguration ausgeben – ideal zum Prüfen von Overrides und ${VARIABLEN}.
$ docker compose --profile debug up -dZusätzlich die Services des Profils „debug“ starten.
$ docker compose exec db mariadb -u root -pBefehl in einem laufenden Service ausführen (wie docker exec, aber per Service-Name).
$ docker compose downContainer und Netze des Projekts entfernen. Volumes bleiben – mit -v werden sie ebenfalls gelöscht!
[+] Running 3/3 ✔ Container visualdemo-app Removed ✔ Container visualdemo-db Removed ✔ Network visualdemo_default Removed
$ docker compose pull && docker compose up -dNeue Image-Versionen holen und nur geänderte Services neu erstellen.
$ docker container pruneAlle gestoppten Container löschen.
$ docker image prune -aAlle Images löschen, die von keinem Container verwendet werden (ohne -a nur namenlose „dangling“ Images).
$ docker builder pruneBuild-Cache leeren.
$ docker system pruneGestoppte Container, ungenutzte Netze, dangling Images und Build-Cache auf einmal. Volumes nur mit --volumes.
💡 Vorher docker system df ansehen – und bei Datenbanken nie blind --volumes verwenden.