Datei compose.yaml:
yaml
services:
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_USER: lernen
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: lerndb
volumes:
- dbdaten:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lernen -d lerndb"]
interval: 5s
timeout: 3s
retries: 10
mem_limit: 256m
app:
build: .
restart: unless-stopped
ports:
- "8000:8000"
environment:
DATABASE_URL: postgresql://lernen:${DB_PASSWORD}@db:5432/lerndb
depends_on:
db:
condition: service_healthy
mem_limit: 256m
volumes:
dbdaten:
Datei .env (daneben, nicht ins Versionsverwaltungssystem einchecken):
text
DB_PASSWORD=ein-langes-geheimes-passwort
bash
docker compose up -d --build # bauen und im Hintergrund starten
docker compose logs -f app # Ausgabe der App ansehen
docker compose ps # Status der Dienste
docker compose down # stoppen (Daten im Volume bleiben erhalten)
Schlüssel in compose.yaml |
Bedeutung |
|---|---|
services |
Die einzelnen Container |
image oder build |
Fertiges Image laden oder aus eigenem Dockerfile bauen |
environment |
Umgebungsvariablen. ${NAME} wird aus der .env-Datei ersetzt |
ports |
"außen:innen", macht den Dienst erreichbar |
volumes |
Dauerhafte Datenspeicherung. Ohne Volume sind die Datenbankdaten beim Löschen des Containers weg |
depends_on mit service_healthy |
App startet erst, wenn die Datenbank bereit ist |
restart: unless-stopped |
Startet nach Absturz oder Neustart des Servers automatisch neu |
mem_limit |
Begrenzt den Arbeitsspeicher des Containers |
Innerhalb von Compose erreichen sich die Dienste über ihren Namen: Die App spricht den Datenbankserver mit db an (nicht localhost).