Erste Container starten
Die wichtigsten Docker-CLI-Befehle in der Praxis: run, ps, exec, logs, stop, rm und wie Volumes und Ports funktionieren.
Inhaltsverzeichnis
Erste Container starten
Zeit, Docker wirklich zu nutzen. Wir starten Container, schauen rein, stoppen sie und lernen Ports und Volumes kennen.
docker run - der Alleskoenner
docker run hello-world
Was passiert:
- Docker sucht das Image
hello-worldlokal - Wenn nicht vorhanden: laedt es aus Docker Hub
- Startet einen Container daraus
- Container laeuft (gibt โHello from Docker!โ aus) und endet
Ein Container, der nicht sofort endet
docker run -it ubuntu bash
-iinteractive (stdin offen)-ttty (ein โrichtigesโ Terminal)bashals Kommando
Du landest in einer Ubuntu-Shell:
root@d8f4e3:/# cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
...
root@d8f4e3:/# exit
exit beendet die Shell und den Container.
Container im Hintergrund
docker run -d --name web nginx
-ddetached - laeuft im Hintergrund--name webgibt einen lesbaren Namen
Pruefen:
docker ps
# CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
# 1a2b3c nginx ... Up ... web
Port-Mapping
Ein Container hat ein eigenes Netzwerk. Damit du vom Host zugreifen kannst, mappst du Ports:
docker run -d -p 8080:80 --name web nginx
-p 8080:80- Host-Port 8080 โ Container-Port 80
Im Browser: http://localhost:8080 - du siehst die NGINX-Willkommens-Seite.
Kurz: -p HOST:CONTAINER
-p 3000:3000- gleicher Port-p 0.0.0.0:3000:3000- an alle Interfaces binden-p 127.0.0.1:3000:3000- nur an Localhost binden (sicherer)
Environment-Variablen
Viele Images konfigurierst du ueber Env-Variablen:
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=mein_projekt \
-p 5432:5432 \
postgres:16
Test:
docker exec -it postgres psql -U postgres -d mein_projekt
Tipp: Eine laufende Postgres fuer Entwicklung - in drei Zeilen.
docker exec - in einen Container rein
docker exec -it web bash
Du bist in der Shell des laufenden web-Containers. exit verlaesst sie - Container laeuft weiter.
exec ist dein Debug-Freund: Logs, Konfig pruefen, schnell etwas testen.
Logs ansehen
docker logs web
docker logs -f web # follow (wie tail -f)
docker logs --tail 50 web # letzte 50 Zeilen
Alles, was der Container auf stdout/stderr schreibt, landet hier.
Stoppen und loeschen
docker stop web # stoppt, Container bleibt erhalten
docker start web # startet wieder
docker restart web
docker rm web # loescht (nur wenn gestoppt)
docker rm -f web # force: stoppen + loeschen
Tipp: --rm beim run loescht automatisch nach Ende:
docker run --rm -it ubuntu bash
# nach exit ist der Container weg
Ideal fuer einmalige Tests.
docker ps im Detail
docker ps # laufende Container
docker ps -a # alle (auch gestoppte)
docker ps -q # nur IDs
docker ps --filter name=web
Container pruefen und kontrollieren
docker stats # CPU, Memory live
docker inspect web # komplette Config als JSON
docker top web # laufende Prozesse im Container
Images verwalten
docker images # lokale Images listen
docker pull ubuntu:24.04 # Image holen ohne zu starten
docker rmi ubuntu:22.04 # Image loeschen
Image-Tags
Ein Image hat Name und Tag:
nginx=nginx:latest(immer die aktuellste Version)nginx:1.27-alpine= spezifische Version, Alpine-basiertnode:22-slim= Node 22, schlanke Variante
Wichtig fuer Produktion: Nimm konkrete Tags, keine latest - sonst deployst du plotzlich andere Versionen.
Volumes - Daten persistieren
Ein Container ist eph(emer - Daten sind weg, wenn er weg ist. Mit Volumes bleiben Daten erhalten.
Bind Mount
Host-Ordner im Container:
docker run -d \
--name web \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx
Dateien in ./html sind im Container unter /usr/share/nginx/html sichtbar.
Named Volume
Docker verwaltet den Ordner:
docker run -d \
--name postgres \
-v postgres-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16
Das Volume postgres-data bleibt, auch wenn der Container weg ist. Verwaltung:
docker volume ls
docker volume inspect postgres-data
docker volume rm postgres-data
Interaktiver Kurz-Test
Ein Beispiel, das alle Konzepte vereint:
# Postgres starten
docker run -d \
--name pg \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
-v pg-data:/var/lib/postgresql/data \
postgres:16
# Log pruefen
docker logs pg
# In den Container rein
docker exec -it pg psql -U postgres
# In psql:
CREATE TABLE users (id int, name text);
INSERT INTO users VALUES (1, 'Anna');
\q
# Container stoppen und loeschen
docker rm -f pg
# Volume existiert noch - wir starten neu und pruefen
docker run -d \
--name pg \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
-v pg-data:/var/lib/postgresql/data \
postgres:16
docker exec -it pg psql -U postgres
SELECT * FROM users; # Anna ist noch da!
Aufraeumen
Nach einer Zeit sammeln sich Container, Images und Volumes an:
# Alle gestoppten Container loeschen
docker container prune
# Ungenutzte Images
docker image prune
docker image prune -a # auch benutzte Tags
# Ungenutzte Volumes
docker volume prune
# Alles mit einem Schlag
docker system prune -a --volumes
Vorsicht mit der letzten - sie raeumt alles weg, was gerade nicht benutzt wird.
Haeufige Fehler
Port schon belegt
Error: bind: address already in use
Ein anderer Prozess belegt Port 80/8080. Loesung: anderen Port nehmen oder lsof -i :8080 / netstat -an | grep 8080 zum Finden.
Berechtigung abgelehnt
Got permission denied while trying to connect to the Docker daemon socket
Du bist nicht in der docker-Gruppe. Linux-Loesung:
sudo usermod -aG docker $USER
newgrp docker
Zusammenfassung
docker runstartet Container, mit-dim Hintergrund-p HOST:CONTAINERmappt Ports-e KEY=VALUEfuer Environment-Variablen-v host:containeroder-v name:pathfuer Volumesdocker exec -it <name> bashin einen laufenden Containerdocker logs -ffuer Logsdocker system prunezum Aufraeumen
Im naechsten Kapitel: Eigene Images mit einem Dockerfile bauen.