Docker Compose

6 Kernkonzepte
Die wichtigsten Docker Compose-Konzepte für Multi-Container-Anwendungen: services · networks · volumes · environment · depends_on · docker-compose commands Docker Compose ermöglicht die Definition und Verwaltung von Multi-Container-Anwendungen mit einer einzigen YAML-Datei. Diese Konzepte sind essenziell für Entwicklung, Test und Produktion.

services – Container definieren

services: web: image: nginx
services: web: image: nginx:latest ports: - "8080:80" environment: - NODE_ENV=production

services definieren die einzelnen Container einer Anwendung. Jeder Service hat einen Namen, ein Image und Konfiguration wie Ports, Umgebungsvariablen und Volumes.

Beispiele
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
db:
image: postgres:15
environment:
- POSTGRES_PASSWORD=secret
volumes:
- postgres_data:/var/lib/postgresql/data
Tipp: Jeder Service kann ein eigenes Dockerfile verwenden (build: .) oder ein Image von Docker Hub (image: nginx). Services sind über ihren Namen im Netzwerk erreichbar.

networks – Netzwerkverbindungen

networks: app-network: driver: bridge
networks: app-network: driver: bridge # Service mit Netzwerk verbinden web: networks: - app-network

networks definieren das Netzwerk, in dem die Container kommunizieren können. Container im gleichen Netzwerk können sich über den Service-Namen erreichen.

Beispiele
services:
api:
build: ./api
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
backend:
Tipp: Container im gleichen Compose-Netzwerk können sich über den Service-Namen erreichen – z.B. db:5432 für die Datenbank, auch wenn sie nicht über Ports veröffentlicht ist.

volumes – Persistente Daten

volumes: db_data: driver: local
volumes: db_data: driver: local # Service mit Volume verbinden db: volumes: - db_data:/var/lib/mysql

volumes definieren persistente Daten, die über Container-Neustarts hinweg erhalten bleiben. Sie können zwischen Containern geteilt werden.

Beispiele
services:
mysql:
image: mysql:8
volumes:
- mysql_data:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d
app:
build: .
volumes:
- ./app:/app # Live-Reload für Entwicklung
- /app/node_modules # Anonymer Volume für node_modules
volumes:
mysql_data:
Tipp: Verwenden Sie benannte Volumes für persistente Daten (z.B. mysql_data) und Bind-Mounts für die Entwicklung (z.B. ./app:/app). Volumes werden nicht mit docker-compose down gelöscht.

environment – Umgebungsvariablen

environment: KEY=value · env_file: .env
environment: - NODE_ENV=production - DB_HOST=db - DB_PASSWORD=${DB_PASSWORD} # Von .env-Datei env_file: - .env

environment setzt Umgebungsvariablen für den Container. env_file lädt Variablen aus einer Datei – ideal für sensible Daten wie Passwörter.

Beispiele
# Direkt im docker-compose.yml
services:
app:
image: myapp
environment:
- NODE_ENV=production
- PORT=3000
- DB_URL=${DATABASE_URL} # aus .env
# Mit env_file
db:
image: postgres
env_file:
- .env.db
Tipp: Verwenden Sie eine .env-Datei für sensible Daten. Compose lädt diese automatisch, wenn sie im gleichen Verzeichnis liegt. Vermeiden Sie es, Passwörter direkt in docker-compose.yml zu speichern.

depends_on – Abhängigkeiten definieren

depends_on: db · depends_on: db condition: service_healthy
depends_on: - db # Mit Healthcheck depends_on: db: condition: service_healthy

depends_on definiert die Startreihenfolge der Services. Der Service startet erst, wenn die abhängigen Services gestartet sind. Mit condition: service_healthy wird auf den Healthcheck gewartet.

Beispiele
services:
app:
build: .
depends_on:
- db
- redis
db:
image: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
# app startet erst, wenn db healthy ist
depends_on:
db:
condition: service_healthy
Tipp: depends_on wartet nur auf den Start der Container, nicht auf die Verfügbarkeit der Services. Verwenden Sie condition: service_healthy für zuverlässige Startreihenfolgen.

docker-compose commands – Die wichtigsten Befehle

up · down · logs · exec · build · ps
docker-compose up -d docker-compose down docker-compose logs -f web docker-compose exec web bash

docker-compose ist das Kommandozeilen-Tool zur Verwaltung der Compose-Anwendung. Diese Befehle sind für den täglichen Einsatz unverzichtbar.

Die wichtigsten Compose-Befehle

Befehl Beschreibung
docker-compose up Container starten (mit -d im Hintergrund)
docker-compose down Container stoppen und entfernen
docker-compose down -v Container + Volumes entfernen
docker-compose ps Status der Container anzeigen
docker-compose logs Logs der Container anzeigen
docker-compose logs -f Logs live verfolgen
docker-compose exec Befehl in Container ausführen
docker-compose build Services neu bauen
docker-compose build --no-cache Build ohne Cache
docker-compose pull Images für Services herunterladen
docker-compose restart Services neu starten
docker-compose stop Container stoppen (nicht entfernen)
docker-compose start Container starten (nach stop)
Beispiele
docker-compose up -d # Alle Services im Hintergrund starten
docker-compose down -v # Container + Volumes löschen
docker-compose logs -f web # Logs des web-Service live verfolgen
docker-compose exec db psql -U postgres # psql in Datenbank-Container
docker-compose build --no-cache app # Nur app neu bauen
docker-compose up -d --build # Neu bauen und starten
Tipp: docker-compose up -d --build kombiniert build und up – perfekt für schnelle Entwicklungsworkflows. docker-compose down -v entfernt auch benannte Volumes – vorsichtig bei Datenbanken!

Docker Compose Best Practices

.env Sensible Daten auslagern
Passwörter, Keys, Tokens
Version Compose-Version angeben
version: '3.8'
Healthcheck Service-Gesundheit prüfen
condition: service_healthy
Netzwerke Service-Isolation
Frontend/Backend trennen
Profile Services für verschiedene Umgebungen
dev, prod, test
Override Umgebungsspezifische Overrides
docker-compose.override.yml

Quick Summary

services
Container definieren
networks
Netzwerke
volumes
Persistente Daten
environment
Umgebungsvariablen
depends_on
Startreihenfolge
up / down
Compose-Befehle
docker-compose up -d · docker-compose logs -f web · docker-compose exec web bash · docker-compose down -v