4 min read
Postgres in Docker

Postgres ist keine Datei wie SQLite - es ist ein Datenbankserver.

Das bedeutet: Postgres läuft als eigener Prozess, hört auf einem Port (Standard: 5432) und nimmt Verbindungen entgegen - von deiner App, von einem CLI-Tool, von einem GUI wie pgAdmin.

Vorteile gegenüber SQLite:

  • Mehrere Verbindungen gleichzeitig möglich
  • Robustere Typen und Constraints
  • Näher an dem, was in Production läuft
  • Skaliert für echte Projekte

Docker macht es möglich Postgres zu nutzen, ohne es direkt auf deinem Rechner zu installieren. Stattdessen läuft Postgres isoliert in einem Container - du kannst ihn jederzeit stoppen, löschen und neu starten.

Dieser Workaround basiert auf dem Tutorial von Caleb Curry: Run Postgres in a Docker Container

Wir machen es in zwei Schritten: zuerst ein Container ohne Volume (zum Verstehen), dann mit Volume (für echte Nutzung).

## Container vs. Volume

Ein Container ist eine laufende Instanz eines Images. Wenn du ihn löschst, ist alles darin weg - auch deine Daten. Das ist praktisch zum Experimentieren, aber nicht für echte Arbeit.

Ein Volume ist ein Ordner auf deinem Rechner, der in den Container eingehängt wird. Die Daten liegen auf deinem System, nicht im Container. Wenn du den Container löschst und neu erstellst, sind die Daten noch da.

Kurz: Container ist flüchtig. Volume ist persistent.

Erster Start: Container ohne Volume

Öffne zuerst Docker Desktop. Dann im Terminal:

Dann im Terminal baue die erste Datenbank:

docker run --name cities_test -e POSTGRES_PASSWORD=mysecretpassword -p 5431:5432 -d postgres
TeilBedeutung
docker runStartet einen neuen Container aus einem Image
--name cities_testGibt dem Container einen festen Namen
-e POSTGRES_PASSWORD=mysecretpasswordSetzt das Passwort für die Postgres-DB
-p 5431:5432Port-Mapping: dein Rechner (5431) zu Container (5432)
-dDetached Mode: läuft im Hintergrund
postgresOffizielles Postgres-Image von Docker Hub

Warum 5431 statt 5432?

5432 ist der Standard-Port von Postgres. Wenn auf deinem Rechner schon Postgres läuft oder ein anderer Container diesen Port nutzt, gibt es einen Konflikt.

  • 5432 → Port im Container (Postgres Standard, bleibt immer so)
  • 5431 → Port auf deinem Rechner (nach außen, kannst du frei wählen)

Alle laufenden Container anzeigen:

docker ps -a

Verbindung aufbauen

Mit der Postgres DB verbinden:

docker exec -it cities_test psql -U postgres
TeilBedeutung
docker execFührt einen Befehl in einem laufenden Container aus
-itInteraktiv + Terminal (du kannst direkt Befehle eingeben)
`cities_testName des Containers
psqlPostgres CLI-Tool (ähnlich wie SQL-Konsole)
-U postgresStandard-User im Container

Alle Tabellen anzeigen:

\dt

Noch leer. Tabelle erstellen:

CREATE TABLE cities (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  country TEXT,
  population INTEGER
);

Nochmal prüfen:

\dt

Jetzt siehst du die Tabelle.

Container stoppen und löschen

Stoppen:

docker stop cities_test
docker rm cities_test

Danach nochmal docker ps -a - Container ist weg. Daten auch.

Mit Volume: Daten bleiben erhalten

Zuerst das Volume erstellen:

docker volume create cities_data

Dann den Container mit Volume starten:

docker run --name cities_test -e POSTGRES_PASSWORD=mysecretpassword -p 5431:5432 -v cities_data:/var/lib/postgresql -d postgres

[!grau] Der neue Teil: -v cities_data:/var/lib/postgresql

  • cities_data ist dein Volume auf dem Rechner
  • /var/lib/postgresql ist der Pfad im Container wo Postgres seine Daten speichert
  • Docker verbindet beides

Wenn du jetzt den Container stoppst, löschst und neu erstellst mit demselben Volume - sind alle Daten noch da.

Verbindung in deiner App

Connection String für .env:

DATABASE_URL="postgresql://postgres:mysecretpassword@localhost:5431/postgres"

Port 5431, weil das dein nach-außen-gemappter Port ist.