⌨️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.

38 Befehle
$ docker pull nginx:1.27-alpine
Images

Image 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 images
Images

Lokale 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 .
Images

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

Schichten 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.0
Images

Zusätzlichen Namen vergeben – kein Kopieren, nur ein weiterer Verweis auf dieselbe Image-ID.

$ docker push ghcr.io/org/meine-app:1.0
Images

Image in eine Registry hochladen; vorhandene Schichten werden übersprungen.

…: Layer already exists
…: Pushed
1.0: digest: sha256:… size: 1993
$ docker image inspect --format '{{.Config.Cmd}}' nginx
Images

Einzelne Felder der Image-Konfiguration mit Go-Templates auslesen.

[nginx -g daemon off;]
$ docker run -d --name web -p 8080:80 nginx
Container

Container 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 -a
Container

Container 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 sh
Container

Zusätzlichen Prozess im laufenden Container starten – z. B. eine Shell. Gleiche Namespaces wie PID 1.

$ docker stop web
Container

SIGTERM (bzw. STOPSIGNAL) an PID 1, nach 10 s SIGKILL. -t ändert die Frist.

web
$ docker rm -f web
Container

Container löschen (-f: auch laufend). Benannte Volumes bleiben erhalten.

web
$ docker cp web:/etc/nginx/nginx.conf .
Container

Dateien zwischen Container und Host kopieren – funktioniert auch bei gestoppten Containern.

$ docker update --restart unless-stopped --memory 512m web
Container

Restart-Policy und Ressourcengrenzen eines bestehenden Containers ändern.

web
$ docker logs -f --tail 50 web
Diagnose

STDOUT/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-db
Diagnose

Health-Status (starting/healthy/unhealthy) auslesen; ohne --format das komplette JSON.

healthy
$ docker stats --no-stream
Diagnose

CPU, 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 web
Diagnose

Prozesse 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 10m
Diagnose

Ereignisstrom des Daemons: create, start, health_status, die, destroy …

$ docker system df
Diagnose

Platzverbrauch 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-netz
Netz & Volumes

Eigenes Bridge-Netz mit festem Subnetz und eingebautem DNS anlegen.

$ docker network ls
Netz & Volumes

Netze 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_default
Netz & Volumes

Subnetz, Gateway und angeschlossene Container (mit IPs) eines Netzes.

$ docker port web
Netz & Volumes

Veröffentlichte Ports eines Containers.

80/tcp -> 0.0.0.0:8080
80/tcp -> [::]:8080
$ docker volume ls
Netz & Volumes

Volumes auflisten; Compose-Volumes heißen <projekt>_<name>.

DRIVER    VOLUME NAME
local     visualdemo_db-data
$ docker volume inspect visualdemo_db-data
Netz & Volumes

Speicherort (Mountpoint) und Labels eines Volumes.

[{ "Driver": "local",
   "Mountpoint": "/var/lib/docker/volumes/visualdemo_db-data/_data",
   "Name": "visualdemo_db-data" }]
$ docker compose up -d --build
Compose

Images 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 ps
Compose

Container 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 app
Compose

Logs eines oder aller Services, farbig nach Service getrennt.

$ docker compose config
Compose

Zusammengeführte, interpolierte Konfiguration ausgeben – ideal zum Prüfen von Overrides und ${VARIABLEN}.

$ docker compose --profile debug up -d
Compose

Zusätzlich die Services des Profils „debug“ starten.

$ docker compose exec db mariadb -u root -p
Compose

Befehl in einem laufenden Service ausführen (wie docker exec, aber per Service-Name).

$ docker compose down
Compose

Container 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 -d
Compose

Neue Image-Versionen holen und nur geänderte Services neu erstellen.

$ docker container prune
Aufräumen

Alle gestoppten Container löschen.

$ docker image prune -a
Aufräumen

Alle Images löschen, die von keinem Container verwendet werden (ohne -a nur namenlose „dangling“ Images).

$ docker builder prune
Aufräumen

Build-Cache leeren.

$ docker system prune
Aufräumen

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