Docker ist zum gängigsten Tool zum Erstellen, Bereitstellen und Ausführen von Anwendungen mithilfe von Containern geworden. Es ermöglicht uns, eine Anwendung mit allen Teilen zu packen, die sie benötigt, wie Bibliotheken und andere Abhängigkeiten, und alles als ein Paket zu versenden. Docker könnte als virtuelle Maschine betrachtet werden, aber anstatt ein vollständiges virtuelles Betriebssystem zu erstellen, ermöglicht Docker Anwendungen, denselben Linux-Kernel wie das System zu verwenden, auf dem sie ausgeführt werden, und erfordert nur, dass Anwendungen mit Dingen ausgeliefert werden, auf denen sie noch nicht ausgeführt werden dem Host-Rechner. Dies führt zu einer erheblichen Leistungssteigerung und reduziert die Größe der Anwendung.
In diesem Blog werden wir sehen, wie wir ganz einfach ein PostgreSQL-Setup über Docker bereitstellen können und wie wir unser Setup mithilfe von ClusterControl in ein primäres/Standby-Replikations-Setup umwandeln können.
So stellen Sie PostgreSQL mit Docker bereit
Sehen wir uns zunächst an, wie PostgreSQL mit Docker manuell bereitgestellt wird, indem ein PostgreSQL-Docker-Image verwendet wird.
Das Image ist auf Docker Hub verfügbar und Sie können es über die Befehlszeile finden:
$ docker search postgres
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
postgres The PostgreSQL object-relational database sy… 6519 [OK]
Wir nehmen das erste Ergebnis. Der Offizielle. Also müssen wir das Bild ziehen:
$ docker pull postgres
Und führen Sie die Knotencontainer aus, die einen lokalen Port dem Datenbankport im Container zuordnen:
$ docker run -d --name node1 -p 6551:5432 postgres
$ docker run -d --name node2 -p 6552:5432 postgres
$ docker run -d --name node3 -p 6553:5432 postgres
Nachdem Sie diese Befehle ausgeführt haben, sollten Sie diese Docker-Umgebung erstellt haben:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51038dbe21f8 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6553->5432/tcp node3
b7a4211744e3 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6552->5432/tcp node2
229c6bd23ff4 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6551->5432/tcp node1
Jetzt können Sie mit dem folgenden Befehl auf jeden Knoten zugreifen:
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.
postgres=#
Anschließend können Sie einen Datenbankbenutzer erstellen, die Konfiguration Ihren Anforderungen entsprechend ändern oder die Replikation zwischen den Knoten manuell konfigurieren.
So importieren Sie Ihre PostgreSQL-Container in ClusterControl
Verwandte Ressourcen ClusterControl für PostgreSQL Bereitstellen von PostgreSQL in einem Docker-Container Verwenden von Kubernetes zum Bereitstellen von PostgreSQLNachdem Sie Ihren PostgreSQL-Cluster eingerichtet haben, müssen Sie ihn noch überwachen, bei Leistungsproblemen warnen, Backups verwalten, Ausfälle erkennen und automatisch auf einen fehlerfreien Server umschalten.
Wenn Sie bereits einen PostgreSQL-Cluster auf Docker ausführen und ihn von ClusterControl verwalten lassen möchten, können Sie den ClusterControl-Container einfach im selben Docker-Netzwerk wie die Datenbankcontainer ausführen. Die einzige Anforderung besteht darin, sicherzustellen, dass auf den Zielcontainern SSH-bezogene Pakete installiert sind (openssh-server, openssh-clients). Erlauben Sie dann passwortloses SSH von ClusterControl zu den Datenbankcontainern. Wenn Sie fertig sind, verwenden Sie die Funktion „Import Existing Server/Cluster“ und der Cluster sollte in ClusterControl importiert werden.
Lassen Sie uns zuerst OpenSSH-bezogene Pakete in den Datenbankcontainern installieren, die Root-Anmeldung zulassen, sie starten und das Root-Passwort festlegen:
$ docker exec -ti [db-container] apt-get update
$ docker exec -ti [db-container] apt-get install -y openssh-server openssh-client
$ docker exec -it [db-container] sed -i 's|^PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -it [db-container] sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -ti [db-container] service ssh start
$ docker exec -it [db-container] passwd
Starten Sie den ClusterControl-Container (falls er noch nicht gestartet ist) und leiten Sie Port 80 auf dem Container an Port 5000 auf dem Host weiter:
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Stellen Sie sicher, dass der ClusterControl-Container aktiv ist:
$ docker ps | grep clustercontrol
7eadb6bb72fb severalnines/clustercontrol "/entrypoint.sh" 4 hours ago Up 4 hours (healthy) 22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp clustercontrol
Öffnen Sie einen Webbrowser und gehen Sie zu http://[Docker_Host]:5000/clustercontrol und erstellen Sie einen Standard-Admin-Benutzer und ein Passwort. Sie sollten jetzt die Hauptseite von ClusterControl sehen.
Der letzte Schritt besteht darin, das passwortlose SSH für alle Datenbankcontainer einzurichten. Dazu müssen wir die IP-Adresse für jeden Datenbankknoten kennen. Um es zu wissen, können wir den folgenden Befehl für jeden Knoten ausführen:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.6",
Hängen Sie dann an die interaktive Konsole des ClusterControl-Containers an:
$ docker exec -it clustercontrol bash
Kopieren Sie den SSH-Schlüssel in alle Datenbankcontainer:
$ ssh-copy-id 172.17.0.6
$ ssh-copy-id 172.17.0.7
$ ssh-copy-id 172.17.0.8
Jetzt können wir damit beginnen, den Cluster in ClusterControl zu importieren. Öffnen Sie einen Webbrowser und rufen Sie die physische IP-Adresse des Dockers mit dem zugeordneten Port auf, z. B. http://192.168.100.150:5000/clustercontrol , klicken Sie auf „Vorhandenen Server/Cluster importieren“ und fügen Sie dann die folgenden Informationen hinzu.
Wir müssen Benutzer, Schlüssel oder Passwort und Port angeben, um uns per SSH mit unseren Servern zu verbinden. Wir brauchen auch einen Namen für unseren neuen Cluster.
Nach dem Einrichten der SSH-Zugangsinformationen müssen wir den Datenbankbenutzer, die Version, die basedir und die IP-Adresse oder den Hostnamen für jeden Datenbankknoten definieren.
Stellen Sie sicher, dass Sie bei der Eingabe des Hostnamens oder der IP-Adresse das grüne Häkchen sehen, das anzeigt, dass ClusterControl mit dem Knoten kommunizieren kann. Klicken Sie dann auf die Schaltfläche Importieren und warten Sie, bis ClusterControl seine Arbeit beendet hat. Sie können den Prozess im ClusterControl-Aktivitätsabschnitt überwachen.
Der Datenbank-Cluster wird nach dem Import unter dem ClusterControl-Dashboard aufgelistet.
Beachten Sie, dass Sie, wenn Sie nur einen PostgreSQL-Master-Knoten haben, ihn zu ClusterControl hinzufügen können. Anschließend können Sie die Standby-Knoten über die ClusterControl-Benutzeroberfläche hinzufügen, damit ClusterControl sie für Sie konfigurieren kann.
ClusterControlEine Konsole für Ihre gesamte DatenbankinfrastrukturErfahren Sie, was es sonst noch Neues in ClusterControl gibt. Installieren Sie ClusterControl KOSTENLOSSo stellen Sie Ihre PostgreSQL-Container mit ClusterControl bereit
Sehen wir uns nun an, wie Sie PostgreSQL mit Docker bereitstellen, indem Sie ein CentOS-Docker-Image (severalnines/centos-ssh) und ein ClusterControl-Docker-Image (severalnines/clustercontrol) verwenden.
Zuerst stellen wir einen ClusterControl-Docker-Container mit der neuesten Version bereit, also müssen wir das multiplenines/clustercontrol-Docker-Image ziehen.
$ docker pull severalnines/clustercontrol
Dann führen wir den ClusterControl-Container aus und veröffentlichen den Port 5000, um darauf zuzugreifen.
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Jetzt können Sie die ClusterControl-Benutzeroberfläche unter http://[Docker_Host]:5000/clustercontrol öffnen und erstellen Sie einen Standard-Admin-Benutzer und ein Passwort.
Das multiplenines/centos-ssh verfügt zusätzlich zum aktivierten SSH-Dienst über eine Auto-Deployment-Funktion, die jedoch nur für Galera-Cluster gültig ist. PostgreSQL wird noch nicht unterstützt. Also setzen wir die Variable AUTO_DEPLOYMENT im Docker-Ausführungsbefehl auf 0, um die Datenbankknoten zu erstellen.
$ docker run -d --name postgres1 -p 5551:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
$ docker run -d --name postgres2 -p 5552:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
$ docker run -d --name postgres3 -p 5553:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
Nach dem Ausführen dieser Befehle sollten wir die folgende Docker-Umgebung haben:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0df916b918a9 severalnines/centos-ssh "/entrypoint.sh" 4 seconds ago Up 3 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5553->5432/tcp postgres3
4c1829371b5e severalnines/centos-ssh "/entrypoint.sh" 11 seconds ago Up 10 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5552->5432/tcp postgres2
79d4263dd7a1 severalnines/centos-ssh "/entrypoint.sh" 32 seconds ago Up 31 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5551->5432/tcp postgres1
7eadb6bb72fb severalnines/clustercontrol "/entrypoint.sh" 38 minutes ago Up 38 minutes (healthy) 22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp clustercontrol
Wir müssen die IP-Adresse für jeden Datenbankknoten kennen. Um es zu wissen, können wir den folgenden Befehl für jeden Knoten ausführen:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.3",
Nachdem wir die Serverknoten eingerichtet und ausgeführt haben, müssen wir unseren Datenbankcluster bereitstellen. Um es einfach zu machen, verwenden wir ClusterControl.
Um eine Bereitstellung von ClusterControl durchzuführen, öffnen Sie die ClusterControl-Benutzeroberfläche unter http://[Docker_Host]:5000/clustercontrol , wählen Sie dann die Option „Bereitstellen“ und befolgen Sie die angezeigten Anweisungen.
Bei der Auswahl von PostgreSQL müssen wir Benutzer, Schlüssel oder Passwort und Port angeben, um eine Verbindung über SSH zu unseren Servern herzustellen. Wir brauchen auch einen Namen für unseren neuen Cluster und wenn wir möchten, dass ClusterControl die entsprechende Software und Konfigurationen für uns installiert.
Nach dem Einrichten der SSH-Zugangsinformationen müssen wir den Datenbankbenutzer, die Version und das Datadir (optional) definieren. Wir können auch angeben, welches Repository verwendet werden soll.
Im nächsten Schritt müssen wir unsere Server zu dem Cluster hinzufügen, den wir erstellen werden.
Beim Hinzufügen unserer Server können wir die IP oder den Hostnamen eingeben. Hier müssen wir die IP-Adresse verwenden, die wir zuvor von jedem Container erhalten haben.
Im letzten Schritt können wir wählen, ob unsere Replikation synchron oder asynchron sein soll.
Wir können den Status der Erstellung unseres neuen Clusters über den Aktivitätsmonitor von ClusterControl überwachen.
Sobald die Aufgabe abgeschlossen ist, können wir unseren Cluster im Hauptbildschirm von ClusterControl sehen.
Schlussfolgerung
Wie wir sehen konnten, könnte die Bereitstellung von PostgreSQL mit Docker am Anfang einfach sein, aber es erfordert etwas mehr Arbeit, um die Replikation zu konfigurieren. Schließlich sollten Sie Ihren Cluster überwachen, um zu sehen, was passiert. Mit ClusterControl können Sie Ihren PostgreSQL-Cluster mit Docker importieren oder bereitstellen sowie Überwachungs- und Verwaltungsaufgaben wie Sicherung und automatisches Failover/Wiederherstellung automatisieren. Probieren Sie es aus.