GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

So stellen Sie PostgreSQL als Docker-Container bereit

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.


Docker
  1. So installieren Sie WordPress mit Docker

  2. So stellen Sie einen Nginx-Container mit Docker auf Linode bereit

  3. So installieren Sie Docker und stellen einen LAMP-Stack bereit

  4. So weisen Sie einem Docker-Container eine statische IP zu

  5. So beenden Sie einen Docker-Container

So führen Sie Grafana in einem Docker-Container aus

So stellen Sie einen Docker-Container in AWS Elastic Beanstalk bereit

So stellen Sie einen Docker-MongoDB-Container bereit und verwalten ihn

So richten Sie einen Apache Docker-Container ein

So führen Sie Docker-Container aus

So stellen Sie Docker-Container in Jelastic Cloud bereit