Loading...

Best Practices für PostgreSQL in Docker (Mit Beispielen)

Jonas Scholz - Co-Founder von sliplane.ioJonas Scholz
6 min

PostgreSQL in Docker-Containern zu betreiben kann die Entwicklung, Deployment und Verwaltung von Datenbankanwendungen vereinfachen. Docker-Container bieten Konsistenz und Portabilität, aber es gibt einige Praktiken, die PostgreSQL zuverlässiger laufen lassen. Diese empfohlenen Methoden helfen, deinen PostgreSQL-Container effizient, sicher und wartungsfreundlich zu halten.

1. Verwende spezifische PostgreSQL-Version-Tags

Fixiere dein PostgreSQL Docker-Image immer auf ein bestimmtes Versions-Tag. Statt ein allgemeines "latest"-Image zu wählen, sorgt die Angabe einer exakten Version für eine konsistente Umgebung. Die Verwendung derselben PostgreSQL-Version über alle Deployment-Stufen hinweg kann Kompatibilitätsprobleme verhindern.

Beispiel:

docker run -d --name my-postgres postgres:16.2

So stellst du sicher, dass du genau PostgreSQL Version 16.2 verwendest und vermeidest unerwartete Unterschiede in deinem Setup.

2. Optimiere die Ressourcenzuweisung für Container

PostgreSQL läuft besser, wenn es angemessene Ressourcenbeschränkungen erhält, wie Speicher- und CPU-Nutzung. Vernünftige Limits sorgen dafür, dass der Host nicht überlastet wird und verbessern die Stabilität.

Beispiel:

docker run -d --name optimized-postgres --memory="2g" --cpus="1.5" postgres:16.2

Hier ist der Container auf 2GB RAM und etwa 1,5 CPU-Kerne begrenzt, was eine gute Balance zwischen Performance und Ressourcenverbrauch schafft.

3. Automatisiere Datenbankeinrichtung mit Init-Skripten

Postgres Docker-Images erlauben es dir, Datenbanken beim Container-Start automatisch zu initialisieren, indem du SQL-Skripte in das Verzeichnis /docker-entrypoint-initdb.d/ legst. Dieser Ansatz vereinfacht die Einrichtung notwendiger Schemas oder Basisdaten für neue Deployments.

Erstelle eine lokale Datei (z.B. init-db.sql):

CREATE DATABASE mydb;
CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypassword';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

Starte den Container und mounte das Skript:

docker run -d \
  -v "$(pwd)/init-db.sql":/docker-entrypoint-initdb.d/init-db.sql \
  postgres:16.2

Bei Start führt PostgreSQL deine SQL-Befehle automatisch aus.

4. Aktiviere WAL (Write-Ahead Logging) Archivierung

Write-Ahead Logging (WAL) speichert detaillierte Aufzeichnungen von Datenbankänderungen. Die Verwaltung der WAL-Archivierung ermöglicht es dir, Datenbanken zu bestimmten Zeitpunkten wiederherzustellen.

Passe eine postgresql.conf Datei mit WAL-Einstellungen an:

wal_level = replica
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/data/wal_archive/%f'

Mounte diese angepasste Konfigurationsdatei beim Container-Start:

docker run -d \
  -v "$(pwd)/my-postgresql.conf":/var/lib/postgresql/data/postgresql.conf \
  postgres:16.2 -c 'config_file=/var/lib/postgresql/data/postgresql.conf'

Die Archivierung von WAL-Datensätzen ist vorteilhaft für komplexe Recovery-Setups.

5. Sichere Verbindungen mit SSL/TLS

Die Verschlüsselung von PostgreSQL-Verbindungen über SSL/TLS-Zertifikate sichert Datenübertragungen und schützt deine Datenbank vor unerwünschtem Zugriff.

Lege deine server.key und server.crt Zertifikatsdateien auf deinem lokalen Rechner ab und aktualisiere postgresql.conf:

ssl = on
ssl_cert_file = '/var/lib/postgresql/server.crt'
ssl_key_file = '/var/lib/postgresql/server.key'

Starte den Container mit gemounteten Zertifikaten:

docker run -d \
  -v "$(pwd)/certs/":/var/lib/postgresql/ \
  -v "$(pwd)/postgresql.conf":/var/lib/postgresql/data/postgresql.conf \
  postgres:16.2 -c 'config_file=/var/lib/postgresql/data/postgresql.conf'

6. Verwende Alpine Postgres Images für kleinere Container

Alpine-Images bieten eine schlanke PostgreSQL-Variante. Sie erstellen deutlich kleinere Container, sparen Speicherplatz, beschleunigen Deployments und reduzieren den Speicherdruck und Ressourcenverbrauch des Hosts.

Beispiel mit Alpine-Variante:

docker run -d postgres:16.2-alpine

Obwohl kleiner, bieten Alpine-basierte Images volle PostgreSQL-Funktionalität, besonders geeignet für kleinere Footprints und leichtgewichtige Deployments.

7. Füge Container Health Checks hinzu

Die Überwachung der Container-Gesundheit ermöglicht Docker, automatisch zu prüfen, ob Postgres reagiert. Docker kann dann Container melden oder neu starten, die nicht richtig funktionieren.

Füge einen Health-Check mit dem Befehl pg_isready hinzu oder definiere ihn im Dockerfile:

HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD pg_isready -U postgres || exit 1

Diese Prüfung alle 30 Sekunden ermöglicht es Docker, zu bestätigen, dass deine Datenbank betriebsbereit und reaktionsfähig bleibt.

8. Netzwerkisolation zur Verbesserung der Sicherheit

Die Einschränkung des Container-Netzwerkzugriffs verhindert, dass nicht autorisierte Dienste eine Verbindung zu PostgreSQL herstellen. Dies schützt deine Datenbank vor unnötiger Exposition und hilft, eingehenden Traffic zu kontrollieren.

Stelle PostgreSQL so ein, dass es nur auf bestimmten Schnittstellen in der postgresql.conf lauscht:

listen_addresses = '172.18.0.2'

Führe den PostgreSQL-Container innerhalb eines Docker-spezifischen Netzwerks aus (stelle sicher, dass du auch deine postgresql.conf mountest):

docker network create my_pg_net
docker run -d --network my_pg_net --ip 172.18.0.2 postgres:16.2

So können nur zugelassene Container in einem bestimmten Netzwerk auf die Datenbank zugreifen.

9. Maximiere die Beobachtbarkeit mit Extensions

Die Verwendung von PostgreSQL-Extensions verbessert die Sichtbarkeit der Datenbank und das Performance-Monitoring. Gängige Extensions wie pg_stat_statements verfolgen Abfragemuster und Nutzung.

Starte PostgreSQL und erstelle Extensions bei der Initialisierung:

CREATE EXTENSION pg_stat_statements;

Mounte dieses SQL-Skript bei Start in das Docker-Init-Verzeichnis, um eine konstante Verfügbarkeit für Anwendungsverfolgung und Leistungsmessung zu gewährleisten.

10. Docker Secrets zum Schutz sensibler Daten

Verlasse dich nicht nur auf Umgebungsvariablen für Passwörter und sensible Informationen, da diese leicht eingesehen werden können. Docker Secrets speichern solche Parameter sicher innerhalb von Containern.

Erstelle zunächst Docker Secrets:

echo "mypassword" | docker secret create pg_passwd -

Beziehe dich auf sie aus Container-Deployments (z.B. Docker Compose YAML):

services:
  db:
    image: postgres:16.2
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/pg_passwd
    secrets:
      - pg_passwd
secrets:
  pg_passwd:
    external: true

Wenn du diese Best Practices befolgst, kannst du sicherstellen, dass deine PostgreSQL-Container stabil, sicher und einfach zu verwalten sind. Wenn du nach einer unkomplizierten Möglichkeit suchst, Docker-Container zu deployen und zu verwalten, schau dir Sliplane.io an. Unsere Plattform vereinfacht das Container-Hosting, sodass du dich auf die Entwicklung großartiger Anwendungen konzentrieren kannst, ohne dir Gedanken über die Infrastruktur machen zu müssen.

Willkommen in der Container-Cloud

Sliplane macht es einfach, Container in der Cloud zu deployen und bei Bedarf zu skalieren. Probier es jetzt aus!