Docker/Datenbank/PostgreSQL

Aus Foxwiki
Version vom 11. November 2026, 12:51 Uhr von Dirkwagner (Diskussion | Beiträge) (Dirkwagner verschob die Seite Docker/Buch/10 Datenbanken/PostgreSQL nach Docker/Datenbank/PostgreSQL)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu:Navigation, Suche

PostgreSQL

PostgreSQL behauptet sich schon seit vielen Jahren auf dem Markt der Open-Source- Datenbanken

  • Mit Features, die sonst nur sehr teure Enterprise-Datenbanksysteme aufweisen, hat sich PostgreSQL bei vielen großen Projekten als Datenbank der Wahl bewährt

Im Unterschied zu MySQL/MariaDB bietet PostgreSQL neben dem klassischen relationalen Datenbankmodell auch einen objektorientierten Zugang, der zum Beispiel die Vererbung von Tabellen ermöglicht Was wir zuvor für Docker und MariaDB gesagt haben, gilt auch für PostgreSQL

  • Viele

PostgreSQL-Container parallel zu betreiben, widerspricht der Konzeption dieser Datenbank

  • Für produktive Umgebungen mit vielen Zugriffen auf die Datenbank ist eine hochverfügbare, dedizierte Datenbankumgebung das Mittel der Wahl

Bei der Entwicklung oder für kleinere Projekte eignet sich PostgreSQL im Docker- Container aber auf jeden Fall

  • Sie profitieren allein schon davon, dass Sie exakt bestimmen können, welche Version von PostgreSQL Sie verwenden möchten, und dass die

Dateien bei der Installation nicht im Betriebssystem Ihrer Entwicklermaschine verteilt werden, sondern mit einem Kommando restlos gelöscht werden können


Die Docker-Images von PostgreSQL auf dem Docker Hub sind sehr gut gewartet und liegen in den letzten fünf Versionen vor, jeweils wahlweise auf Debiander Alpine- Basis

  • Der Größenunterschied ist bei diesen Images beträchtlich (siehe Tabelle 10.2)
Image-Variante       Image-Größe       Basis-Image
postgres:15          412 MByte         Debian Bookworm Slim (12)
postgres:15-alpine   237 MByte         Alpine Linux 3.18

Tabelle 10.2 Der Größenunterschied der PostgreSQL-15-Docker-Images

Wie MariaDB/MySQL berücksichtigt auch PostgreSQL Shell-Scripts (*.sh) oder SQL- Dateien (*.sql, *.sql.gz) im Verzeichnis /docker-entrypoint-initdb.d, die beim Start des Containers ausgeführt beziehungsweise in die Datenbank importiert werden

  • In

Verbindung mit docker compose oder docker stack deploy können Sie so Datenbankbenutzer oder Stored Procedures anlegen, ohne ein eigenes Docker-Image bauen zu müssen

PostgreSQL und pgAdmin mit docker compose Für viele Datenbankprofis ist die Kommandozeile das Mittel der Wahl, um Arbeiten an der Datenbank durchzuführen

  • Für einen schnellen Überblick kann aber eine grafische Benutzeroberfläche sehr hilfreich sein
  • Für PostgreSQL gibt es schon seit längerer Zeit ein Werkzeug namens pgAdmin
  • Was früher eine Desktop-Anwendung war, ist seit Version 4 eine sehr moderne und angenehm zu bedienende Weboberfläche

pgAdmin 4 bietet vieles, was das Herz eines Datenbankadministrators erfreut: Grafiken zur Auslastung, ein Abfragewerkzeug und natürlich eine Übersicht über alle Elemente der Datenbank

Beispieldaten Wir haben einen Beispieldatensatz als PostgreSQL-Dump für Sie auf GitHub hinterlegt

docker4-samples, oder laden Sie den komprimierten Dump aus dem init-Ordner herunter

  • Die Datenbank enthält mehr als 190.000 geografisch referenzierte Objekte in

Deutschland aus dem freien Datensatz von https://www.geonames.org

Die folgende compose.yaml-Datei startet einen Container mit der aktuellen Postgre- SQL-Version und einen weiteren Container mit dem pgAdmin-Web-Frontend (in diesem Fall auf dem lokalen Port 5050)

  1. Datei : db / postgres / compose
  • yaml services

db

image : postgres :15
environm e nt 
POSTGRES_ P A S SW O R D : geheim
POSTGRES_ D B : geonames
volumes 
- ./ init :/ docker - entrypoint - initdb 
  • d
- pgdata :/ var / lib / postgresq l / data pgadmin 
image : dpage / pgadmin4
ports 
- 5050:80
volumes 
- pgadmind a t a :/ var /lib / pgadmin
environm e nt 
PGADMIN_D E F A UL T _ E M AI L : info@dock e r b u ch 
  • info
PGADMIN_D E F A UL T _ P A SS W O R D : geheim volumes 

pgdata pgadmind a t a

Wie bereits erwähnt, unterstützt PostgreSQL eine Datenbankinitialisierung während des Starts im Ordner /docker-entrypoint-initdb.d

  • Wenn Sie die Beispieldatei von

GitHub im init-Verzeichnis abgespeichert haben oder einen anderen PostgreSQL- Dump dort platziert haben, werden Sie beim Start der Container eine ähnliche Ausgabe wie diese sehen (hier gekürzt)

[...] db_1 | server started db_1 | CREATE DATABASE db_1 | /usr / local / bin / docker - entrypoin t

  • sh : running / docker - e

db_1 | SET [...] db_1 | CREATE TABLE db_1 | ALTER TABLE

Nachdem der Datenbankserver gestartet wurde, erstellt PostgreSQL die Datenbank, die Sie als Umgebungsvariable POSTGRES_DB in der compose.yaml-Datei definiert haben Anschließend importiert das docker-entrypoint.sh-Script den Datenbank-Dump

  • Ob mit oder ohne Demodaten, Sie erreichen pgAdmin jetzt unter der Adresse http://

localhost:5050

  • Geben Sie beim ersten Login den Benutzernamen und das Passwort aus den Umgebungsvariablen des pgadmin -Containers ein, und fügen Sie anschlie- ßend einen Server mit dem Link Add New Server im Dashboard hinzu
  • Im folgenden


Dialog stellen Sie den Host-Namen (db), den Benutzernamen (postgres) und das Passwort (geheim) für die Datenbank ein (siehe Abbildung 10.1)

Abbildung 10.1 Die Datenbankverbindung im pgAdmin-Web-Frontend

Wenn Sie die Demodaten importiert haben, können Sie jetzt im linken Teil der Oberfläche zur geonames -Datenbank navigieren

  • Unter Schemas • public • Tables finden

Sie die importierten Daten (siehe Abbildung 10.2)

Abbildung 10.2 Das Web-Frontend »pgAdmin 4« mit der »geonames«-Demo-Datenbank

Backups mit docker compose Für Backups gilt auch bei PostgreSQL das Gleiche wie bei MariaDB: Der einfachste Weg, ohne die Datenbank auszuschalten, führt über docker exec

docker exec postgres - db -1 pg_dump --username = postgres \ geonames > geonames_ b a ck u p

  • sql

Hier möchten wir Ihnen noch eine weitere Möglichkeit zeigen, mit docker compose komfortabel Backups anzulegen

  • Dazu erstellen Sie zusätzlich zu der bestehenden compose.yaml eine weitere Konfigurationsdatei
  • Wir werden sie compose-backup.yaml nennen
  1. Datei : db / postgresq l / compose -backup
  • yaml services

backup image : postgres :15 - alpine depends_ o n - db volumes - backup_v o l :/ backup command : > pg_dump --host db -F c -f / backup / geonames .dump --username = postgres geonames environm e nt PGPASSWOR D : geheim volumes backup_v o l

In dieser Datei befindet sich nur der backup-Service

  • Dieser verwendet das aktuelle

PostgreSQL-Image und zeigt mit der depends_on -Anweisung an, dass der Datenbankserver auch gestartet sein muss

  • Als Kommando für den backup-Service soll nicht die

PostgreSQL-Datenbank gestartet werden, sondern pg_dump (hier in der mehrzeiligen YAML-Schreibweise) Die Backup-Datei wird in /backup/geonames.dump gespeichert

  • In diesem Fall ist das ein von Docker verwaltetes Volume, Sie können hier natürlich auch ein lokales Verzeichnis Ihres Computers einbinden
  • Das pg_dump -Kommando liest aus der Umgebungsvariablen PGPASSWORD das Datenbankpasswort aus, das im environment -Abschnitt definiert ist

Der Trick bei diesem Setup ist, dass docker compose mit beiden Konfigurationsdateien und der run-Anweisung für den backup-Service aufgerufen wird

docker compose -f compose

  • yaml \

-f compose - backup

  • yaml run --rm backup

Damit starten Sie einen Container, der den backup-Service ausführt und mithilfe des pg_dump-Kommandos die Sicherung nach /backup speichert

  • Im Anschluss wird der

Container wieder gelöscht (--rm), das Volume bleibt mit dem Backup erhalten