Python Lernhandbuch

Kapitel 16: Alles in Docker betreiben · Abschnitt 3 von 5

docker compose: App und Postgres zusammen

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

Tipp: Bei Python-Beispielen kannst du auf ▶ Ausprobieren klicken, den Code verändern und direkt ausführen.

← Zurück