PostgreSQL, auch Postgres genannt, ist das führende objektrelationale Datenbanksystem. Es ist beliebt wegen seiner hohen Konformität mit dem SQL-Standard und der Einbeziehung zusätzlicher Funktionen, die das Arbeiten mit komplexen Datensätzen in großem Umfang vereinfachen.
PostgreSQL verwendet eine herkömmliche Client-Server-Architektur, sodass Sie es unabhängig vom Code Ihrer Anwendung ausführen müssen. In diesem Leitfaden stellen Sie eine PostgreSQL-Serverinstanz als Docker-Container bereit. Dies vermeidet das Hinzufügen von Paketen zu Ihrem Hostcomputer und hilft, Ihre Datenbank von den anderen Teilen Ihres Stacks zu isolieren. Stellen Sie sicher, dass Docker installiert ist, bevor Sie fortfahren.
Erste Schritte
PostgreSQL hat ein offizielles Image auf Docker Hub, das in mehreren verschiedenen Varianten verfügbar ist. Mithilfe von Tags können Sie zwischen den wichtigsten PostgreSQL-Versionen von v9 bis v14 wählen und das Betriebssystem auswählen, das als Basisimage verwendet wird. Alpine, Debian Stretch und Debian Bullseye werden angeboten.
Für die Zwecke dieses Tutorials verwenden wir postgres:14
-Tag, das PostgreSQL 14 auf Bullseye bereitstellt. Es steht Ihnen frei, eine andere Version auszuwählen, die Ihren Anforderungen entspricht.
Starten Sie einen PostgreSQL-Container mit docker run
Befehl:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Sie müssen Geben Sie einen Wert für POSTGRES_PASSWORD
an Umgebungsvariable. Dies definiert das Passwort, das dem Standard-Superuser-Konto von Postgres zugewiesen wird. Der Benutzername lautet standardmäßig postgres
kann aber durch Setzen des POSTGRES_USER
geändert werden Umgebungsvariable.
Das -v
Flag wird verwendet, um ein Docker-Volume in das Datenverzeichnis des PostgreSQL-Containers einzuhängen. Ein benanntes Volume namens postgres
wird verwiesen; Docker erstellt es entweder oder fügt das Volume erneut hinzu, falls es bereits vorhanden ist. Sie sollten ein Volume verwenden, um Ihre Datenbank außerhalb des Containers zu speichern. Ohne einen verwenden Sie Ihre Daten, wenn der Container stoppt.
PostgreSQL lauscht standardmäßig auf Port 5432. Der Container-Port wird durch -p
an Port 5432 auf Ihrem Docker-Host gebunden Flagge. Das -d
Flag wird verwendet, um den Container im getrennten Modus zu starten, wodurch er effektiv zu einem Hintergrunddienst wird, der weiterläuft, bis er mit docker stop
gestoppt wird .
Bereitstellung des Passworts als Datei
Wenn es Ihnen unangenehm ist, Ihr Superuser-Passwort als Klartext-CLI-Flag anzugeben, können Sie es stattdessen als Datei über ein Volume einfügen. Dann sollten Sie POSTGRES_PASSWORD_FILE
setzen Umgebungsvariable, um Postgres den Pfad zu dieser Datei zu geben:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-password -v ./postgres-password.txt:/run/secrets/postgres-password -v postgres:/var/lib/postgresql/data postgres:14
Diese Technik funktioniert auch für POSTGRES_USER
und andere unterstützte Umgebungsvariablen.
Herstellen einer Verbindung zu Ihrer Datenbank
Da PostgreSQL oben an Port 5432 gebunden war, konnten Sie sich mit Ihrer Datenbank auf localhost:5432
verbinden von jedem kompatiblen Client. Verwenden Sie die Anmeldeinformationen, die Sie beim Starten des Containers als Umgebungsvariablen zugewiesen haben.
Das Docker-Image enthält auch das psql
binär, die Sie mit docker exec
aufrufen können . Verwenden Sie dies, um von einer PostgreSQL-Shell innerhalb des Containers aus schnell mit Ihrer Datenbank zu interagieren.
docker exec -it postgres psql -U postgres
Von anderen Docker-Containern verbinden
Das Erstellen eines Docker-Netzwerks ist die bevorzugte Methode, um von anderen Containern auf demselben Host auf PostgreSQL zuzugreifen. Dadurch wird vermieden, dass der Port des Postgres-Servers gebunden wird und der Dienst möglicherweise dem breiteren Netzwerk Ihres Hosts ausgesetzt wird.
Erstellen Sie ein Docker-Netzwerk:
docker network create my-app
Starten Sie Ihren Postgres-Container mit einer Verbindung zum Netzwerk, indem Sie --network
verwenden Flag mit docker run
:
docker run -d --name postgres --network my-app -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Verbinden Sie nun Ihren Anwendungscontainer mit demselben Netzwerk:
docker run -d --name api --network my-app my-api:latest
Die Container im Netzwerk können Postgres mit dem postgres
erreichen Hostname, da dies der name
ist dem Postgres-Container zugewiesen. Verwenden Sie Port 5432, um die Verbindung herzustellen.
PostgreSQL konfigurieren
Sie können PostgreSQL-Serveroptionen mit -c
übergeben -Flags nach dem Bildnamen in Ihrem docker run
Befehl:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14 -c max_connections=100
Alles nach dem Bildnamen wird an den im Container gestarteten Befehl übergeben. Dieser Befehl ist im Falle des Postgres-Images die PostgreSQL-Server-Binärdatei.
Sie können eine benutzerdefinierte Konfigurationsdatei verwenden, wenn Sie die Werte mehrerer Optionen festlegen. Sie müssen ein anderes Docker-Volume verwenden, um Ihre Datei in den Container einzuhängen, und dann ein -c
angeben Flag, um Postgres anzuweisen, wo es suchen soll:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v ./postgres.conf:/etc/postgresql/postgresql.conf -v postgres:/var/lib/postgresql/data postgres:14 -c config_file=/etc/postgresql/postgresql.conf
In diesem Beispiel wird ein Docker-Bind-Mount verwendet, um die postgres.conf
abzurufen Datei in Ihrem Arbeitsverzeichnis, gemountet in /etc/postgresql
des Containers Verzeichnis. Eine Referenz der Optionen, die Sie mit binären Flags oder Konfigurationsdatei-Direktiven setzen können, finden Sie in der PostgreSQL-Dokumentation.
Seeding der Datenbank
Das Docker-Image unterstützt Seed-Dateien, die in /docker-entrypoint-initdb.d
abgelegt werden Verzeichnis. Jede .sql
oder .sql.gz
Dateien werden ausgeführt, um die Datenbank zu initialisieren. Dies geschieht nach dem Standardbenutzerkonto und postgres
Datenbank erstellt wurden. Sie können auch .sh
hinzufügen Dateien, um beliebige Shell-Skripte auszuführen. Alle Skripte werden in alphabetischer Reihenfolge ausgeführt.
Dieser Mechanismus bedeutet, dass Sie zum Seeding Ihrer Datenbank lediglich eine Reihe von SQL- oder Shell-Skripten benötigen, die in der richtigen sequenziellen Reihenfolge benannt sind. Hängen Sie diese mit -v
in Ihren neuen Container ein Flag mit docker run
:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v ./db-seed-files/:/etc/docker-entrypoint-initdb.d -v postgres:/var/lib/postgresql/data postgres:14
Die Initialisierungsskripte werden nur verwendet, wenn das Postgres-Datenverzeichnis leer ist. Aus praktischen Gründen bedeutet dies, dass sie beim ersten Start des Containers mit einem neuen angehängten leeren Volume ausgeführt werden.
Erstellen eines benutzerdefinierten Datenbank-Image
Sie können Ihre Konfigurationsdatei und Initialisierungsskripts in Ihrem eigenen Docker-Image kapseln. Dadurch könnte jeder mit Zugriff auf das Image eine neue PostgreSQL-Instanz starten, die für Ihre Anwendung vorkonfiguriert ist. Hier ist eine einfache Docker-Datei, die Sie verwenden könnten:
FROM postgres:14 COPY postgres.conf /etc/postgresql/postgresql.conf COPY db-seed-files/ /etc/docker-entrypoint-initdb.d/ CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]
Erstellen Sie Ihr benutzerdefiniertes Image:
docker build -t custom-postgres:latest .
Die Build-Anweisungen in der Docker-Datei kopieren die PostgreSQL-Konfigurationsdatei und die Initialisierungsskripts aus Ihrem Arbeitsverzeichnis und betten sie in das Container-Image ein. Jetzt können Sie einen Datenbankcontainer starten, ohne die Ressourcen manuell bereitzustellen:
docker run -d --name custom-postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data custom-postgres:latest
Sollten Sie Ihre Produktionsdatenbank containerisieren?
Es kann schwierig sein zu entscheiden, ob eine Datenbank in Docker ausgeführt werden soll. Die Containerisierung von PostgreSQL erleichtert die Einrichtung, ist aber manchmal schwieriger zu warten. Sie müssen bei der Verwaltung Ihres Containers vorsichtig vorgehen, um Datenverluste in Zukunft zu vermeiden. Docker fügt auch einen bescheidenen Leistungsmehraufwand hinzu, der eine Überlegung wert ist, wenn Sie davon ausgehen, dass die Tourdatenbank mit sehr großen Datenmengen arbeiten wird.
Die Vorteile von Docker sind erhöhte Portabilität, einfache Skalierung und Entwicklereffizienz. Durch die Containerisierung Ihrer Datenbank kann jeder mithilfe von Docker eine neue Instanz erstellen, ohne PostgreSQL zuerst manuell installieren und konfigurieren zu müssen. Das Schreiben einer Docker-Datei für Ihre PostgreSQL-Datenbank, die Ihre Konfigurationsdatei und SQL-Seed-Skripte hinzufügt, ist daher eine gute Möglichkeit, Entwicklern zu helfen, schnell neue Umgebungen zu starten.
Zusammenfassung
PostgreSQL ist eine erweiterte SQL-basierte Datenbank-Engine, die objektrelationale Funktionen hinzufügt. Während Sie sich für eine herkömmliche Bereitstellung in der Produktion entscheiden können, vereinfacht die Verwendung einer containerisierten Instanz die Einrichtung und hilft Entwicklern, ihre eigene Infrastruktur schnell aufzubauen.
Der wichtigste Aspekt einer Docker-basierten Bereitstellung besteht darin, sicherzustellen, dass Sie ein Volume zum Speichern Ihrer Daten verwenden. Auf diese Weise können Sie Ihren Container anhalten, ersetzen und auf eine neuere Image-Version aktualisieren, ohne Ihre Datenbank zu verlieren. Über die Speicherung hinaus sollten Sie abwägen, wie Sie eine Verbindung zu Postgres herstellen, und vermeiden, Ports an Ihren Host zu binden, sofern dies nicht erforderlich ist. Wenn Sie sich von einem anderen Container aus verbinden, verwenden Sie am besten ein freigegebenes Docker-Netzwerk, um den Zugriff zu erleichtern.