Einleitung
Docker hat die Art wie wir Software entwickeln und deployen revolutioniert. Container machen deine App ueberall lauffaehig – egal ob auf deinem Laptop, im CI/CD-System oder in der Cloud.
In diesem Tutorial lernst du Docker von Grund auf: Was sind Container? Wie schreibst du ein Dockerfile? Wie nutzt du Docker Compose fuer Multi-Container-Apps? Alles mit praktischen Beispielen.
Inhaltsverzeichnis
- Was ist Docker?
- Installation
- Erste Container starten
- Dockerfile schreiben
- Images bauen und verwalten
- Volumes & Persistenz
- Docker Networking
- Docker Compose
- Best Practices
- Naechste Schritte
1. Was ist Docker?
Somit kannst du direkt mit der Umsetzung beginnen.
Docker packt deine Anwendung zusammen mit allen Abhaengigkeiten in einen Container. Dieser Container laeuft ueberall identisch – kein „Works on my machine“ mehr.
- Image: Die Vorlage (Bauplan) fuer einen Container
- Container: Eine laufende Instanz eines Images
- Dockerfile: Das Rezept zum Bauen eines Images
- Registry: Speicherort fuer Images (Docker Hub, GitHub Container Registry)
Docker vs. Virtuelle Maschinen
Folglich profitierst du von einem besseren Verständnis dieser Konzepte.
| Eigenschaft | Docker | VM |
|---|---|---|
| Start-Zeit | Sekunden | Minuten |
| Speicher | MBs | GBs |
| OS | Teilt Host-Kernel | Eigenes OS |
| Isolation | Prozess-Level | Hardware-Level |
| Performance | Nah an nativ | Overhead |
2. Docker installieren
Windows & macOS
Im Grunde vereinfacht dieser Ansatz den gesamten Workflow erheblich.
Installiere Docker Desktop von docker.com. Enthaelt Docker Engine, CLI und Docker Compose.
Linux (Ubuntu)
Tatsächlich ist dieser Bereich besonders wichtig für Entwickler.
# Docker installieren
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Docker ohne sudo nutzen
sudo usermod -aG docker $USER
# Version pruefen
docker --version
docker compose version
Dementsprechend ist eine manuelle Überprüfung empfehlenswert.
3. Erste Container starten
Allerdings gibt es einige wichtige Unterschiede zu beachten.
# Hello World – teste ob Docker funktioniert
docker run hello-world
# Nginx Webserver starten
docker run -d -p 8080:80 --name mein-nginx nginx
# Oeffne http://localhost:8080 im Browser
# Laufende Container anzeigen
docker ps
# Alle Container anzeigen (auch gestoppte)
docker ps -a
# Container stoppen und entfernen
docker stop mein-nginx
docker rm mein-nginx
# In einen Container "reingehen"
docker run -it ubuntu bash
# Du bist jetzt in einem Ubuntu-Container!
# exit zum Verlassen
Folglich erhältst du mit diesem Ansatz deutlich bessere Resultate.
Wichtige Docker-Befehle
Natürlich gibt es dabei verschiedene Herangehensweisen.
# Images auflisten
docker images
# Image herunterladen
docker pull python:3.12
# Container-Logs anzeigen
docker logs mein-nginx
# Container-Details
docker inspect mein-nginx
# Alle gestoppten Container entfernen
docker container prune
# Alle ungenutzten Images entfernen
docker image prune -a
Natürlich solltest du den generierten Code vor dem Einsatz testen.
4. Dockerfile schreiben
Grundsätzlich gibt es dabei einige Punkte zu beachten.
Ein Dockerfile definiert wie dein Image gebaut wird. Hier ein Beispiel fuer eine Python Flask App:
# Dockerfile
FROM python:3.12-slim
# Arbeitsverzeichnis setzen
WORKDIR /app
# Dependencies zuerst kopieren (Docker Layer Caching)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# App-Code kopieren
COPY . .
# Port freigeben
EXPOSE 5000
# App starten
CMD ["python", "app.py"]
Und fuer eine Node.js Express App:
# Dockerfile
FROM node:20-alpine
WORKDIR /app
# Package Files zuerst (Caching!)
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
# Non-Root User (Security!)
USER node
CMD ["node", "server.js"]
Grundsätzlich kannst du diesen Prompt an deine Bedürfnisse anpassen.
Image bauen und starten
Dennoch solltest du einige Besonderheiten beachten.
# Image bauen
docker build -t meine-app:1.0 .
# Container starten
docker run -d -p 3000:3000 --name app meine-app:1.0
# Image taggen und pushen
docker tag meine-app:1.0 username/meine-app:1.0
docker push username/meine-app:1.0
Außerdem kannst du den Prompt für verschiedene Programmiersprachen anpassen.
5. Volumes – Daten persistent speichern
Darüber hinaus bietet dieser Abschnitt konkrete Beispiele und Tipps.
Container sind ephemeral – wenn du sie loeschst, sind die Daten weg. Volumes speichern Daten ausserhalb des Containers:
# Named Volume erstellen
docker volume create app-daten
# Container mit Volume starten
docker run -d \
-v app-daten:/data \
--name db \
postgres:16
# Bind Mount (lokaler Ordner)
docker run -d \
-v $(pwd)/src:/app/src \
-p 3000:3000 \
meine-app:1.0
# Volumes auflisten
docker volume ls
Dabei zeigt dieses Beispiel den grundlegenden Ansatz.
6. Docker Networking
Weiterhin ist es wichtig, die Grundlagen zu verstehen.
# Netzwerk erstellen
docker network create mein-netzwerk
# Container im gleichen Netzwerk
docker run -d --network mein-netzwerk --name api meine-api
docker run -d --network mein-netzwerk --name db postgres:16
# Container "api" kann jetzt "db" per Hostname erreichen:
# postgres://db:5432/mydb
7. Docker Compose – Multi-Container-Apps
Insbesondere für den Einstieg sind die folgenden Informationen hilfreich.
Docker Compose definiert Multi-Container-Apps in einer YAML-Datei. Hier ein komplettes Beispiel:
# docker-compose.yml
version: '3.8'
services:
# Frontend (React)
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- api
environment:
- REACT_APP_API_URL=http://localhost:5000
# Backend API (Python Flask)
api:
build: ./backend
ports:
- "5000:5000"
depends_on:
- db
- redis
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
- REDIS_URL=redis://redis:6379
volumes:
- ./backend:/app # Hot Reload fuer Development
# Datenbank
db:
image: postgres:16
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
# Cache
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres-data:
Weiterhin ist es ratsam, die Ergebnisse immer kritisch zu prüfen.
Docker Compose Befehle
Ebenfalls relevant sind die praktischen Anwendungsbeispiele.
# Alle Services starten
docker compose up -d
# Logs anzeigen
docker compose logs -f
# Status anzeigen
docker compose ps
# Alle Services stoppen
docker compose down
# Stoppen und Volumes loeschen
docker compose down -v
# Nur einen Service neustarten
docker compose restart api
# Images neu bauen
docker compose build
Somit sparst du Zeit und erhältst qualitativ hochwertigeren Output.
8. Docker Best Practices
Ebenso wichtig ist es, die Best Practices zu kennen.
- Kleine Base Images: Nutze
-alpineoder-slimVarianten - Multi-Stage Builds: Zusätzlich trenne Build- und Runtime-Umgebung
- Non-Root User: Ebenfalls fuehre Container nie als Root aus
- Layer Caching: Besonders cOPY package.json VOR dem App-Code
- .dockerignore: Schliesse node_modules, .git, .env aus
- Health Checks: Definiere HEALTHCHECK im Dockerfile
- Keine Secrets im Image: Nutze Environment Variables oder Docker Secrets
Multi-Stage Build Beispiel
Außerdem gibt es hilfreiche Tools, die dich dabei unterstützen.
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Deshalb empfiehlt es sich, den Prompt schrittweise zu verfeinern.
Ergebnis: Ein winziges Nginx-Image mit nur den statischen Build-Dateien statt eines grossen Node.js-Images.
9. Naechste Schritte
Deshalb lohnt es sich, dieses Thema genauer zu betrachten.
- Kubernetes lernen: Nimm einen Docker/Kubernetes Kurs
- CI/CD: Ebenfalls nutze Docker in CI/CD Pipelines mit GitHub Actions
- Cloud Deployment: Deploye auf AWS ECS, Google Cloud Run oder AWS
- AI-Tools: Lass ChatGPT oder GitHub Copilot Dockerfiles fuer dich generieren
Profi-Tipp: Nutze AI-Tools wie ChatGPT Plus um Dockerfiles und docker-compose.yml Dateien zu generieren. Beschreibe einfach deinen Tech-Stack und du bekommst eine optimierte Konfiguration.