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
| Teil | Bedeutung |
|---|---|
docker run | Startet einen neuen Container aus einem Image |
--name cities_test | Gibt dem Container einen festen Namen |
-e POSTGRES_PASSWORD=mysecretpassword | Setzt das Passwort für die Postgres-DB |
-p 5431:5432 | Port-Mapping: dein Rechner (5431) zu Container (5432) |
-d | Detached Mode: läuft im Hintergrund |
postgres | Offizielles Postgres-Image von Docker Hub |
Warum
5431statt5432?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
| Teil | Bedeutung |
|---|---|
docker exec | Führt einen Befehl in einem laufenden Container aus |
-it | Interaktiv + Terminal (du kannst direkt Befehle eingeben) |
| `cities_test | Name des Containers |
psql | Postgres CLI-Tool (ähnlich wie SQL-Konsole) |
-U postgres | Standard-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_dataist dein Volume auf dem Rechner/var/lib/postgresqlist 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.