Docker is de meest gebruikte tool geworden voor het maken, implementeren en uitvoeren van applicaties met behulp van containers. Het stelt ons in staat om een applicatie te verpakken met alle onderdelen die het nodig heeft, zoals bibliotheken en andere afhankelijkheden, en het allemaal als één pakket te verzenden. Docker kan worden beschouwd als een virtuele machine, maar in plaats van een heel virtueel besturingssysteem te creëren, stelt Docker applicaties in staat om dezelfde Linux-kernel te gebruiken als het systeem waarop ze draaien en vereist alleen dat applicaties worden geleverd met dingen die nog niet draaien op de hostcomputer. Dit geeft een aanzienlijke prestatieverbetering en verkleint de applicatie.
In deze blog laten we zien hoe we eenvoudig een PostgreSQL-setup kunnen implementeren via Docker en hoe we onze setup kunnen omzetten in een primaire/standby-replicatie-setup met behulp van ClusterControl.
Hoe PostgreSQL te implementeren met Docker
Laten we eerst eens kijken hoe u PostgreSQL met Docker handmatig kunt implementeren met behulp van een PostgreSQL Docker-image.
De afbeelding is beschikbaar op Docker Hub en u kunt deze vinden vanaf de opdrachtregel:
$ docker search postgres
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
postgres The PostgreSQL object-relational database sy… 6519 [OK]
We nemen het eerste resultaat. De officiële. Dus we moeten de afbeelding eruit halen:
$ docker pull postgres
En voer de nodecontainers uit die een lokale poort toewijzen aan de databasepoort in de container:
$ 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
Nadat u deze opdrachten hebt uitgevoerd, zou u deze Docker-omgeving moeten hebben gemaakt:
$ 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
Nu heb je toegang tot elk knooppunt met het volgende commando:
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.
postgres=#
Vervolgens kunt u een databasegebruiker maken, de configuratie wijzigen volgens uw vereisten of de replicatie tussen de knooppunten handmatig configureren.
Hoe u uw PostgreSQL-containers in ClusterControl kunt importeren
Gerelateerde bronnen ClusterControl voor PostgreSQL PostgreSQL implementeren op een Docker-container Kubernetes gebruiken om PostgreSQL te implementerenNu u uw PostgreSQL-cluster heeft ingesteld, moet u deze nog steeds bewaken, waarschuwen in geval van prestatieproblemen, back-ups beheren, fouten detecteren en automatisch een failover naar een gezonde server uitvoeren.
Als u al een PostgreSQL-cluster op Docker hebt draaien en u wilt dat ClusterControl dit beheert, kunt u de ClusterControl-container eenvoudig in hetzelfde Docker-netwerk uitvoeren als de databasecontainers. De enige vereiste is om ervoor te zorgen dat de doelcontainers SSH-gerelateerde pakketten hebben geïnstalleerd (openssh-server, openssh-clients). Sta vervolgens wachtwoordloze SSH van ClusterControl toe aan de databasecontainers. Als u klaar bent, gebruikt u de functie "Bestaande server/cluster importeren" en moet het cluster worden geïmporteerd in ClusterControl.
Laten we eerst OpenSSH-gerelateerde pakketten op de databasecontainers installeren, de root-login toestaan, opstarten en het root-wachtwoord instellen:
$ 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
Start de ClusterControl-container (als deze niet is gestart) en stuur poort 80 op de container door naar poort 5000 op de host:
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Controleer of de ClusterControl-container up is:
$ 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
Open een webbrowser, ga naar http://[Docker_Host]:5000/clustercontrol en maak een standaard admin-gebruiker en wachtwoord aan. U zou nu de hoofdpagina van ClusterControl moeten zien.
De laatste stap is het instellen van de wachtwoordloze SSH voor alle databasecontainers. Hiervoor moeten we het IP-adres voor elk databaseknooppunt weten. Om dit te weten, kunnen we de volgende opdracht uitvoeren voor elk knooppunt:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.6",
Koppel vervolgens aan de interactieve ClusterControl-containerconsole:
$ docker exec -it clustercontrol bash
Kopieer de SSH-sleutel naar alle databasecontainers:
$ ssh-copy-id 172.17.0.6
$ ssh-copy-id 172.17.0.7
$ ssh-copy-id 172.17.0.8
Nu kunnen we beginnen met het importeren van het cluster in ClusterControl. Open een webbrowser en ga naar Docker's fysieke host-IP-adres met de toegewezen poort, bijvoorbeeld http://192.168.100.150:5000/clustercontrol , klik op "Bestaande server/cluster importeren" en voeg vervolgens de volgende informatie toe.
We moeten Gebruiker, Sleutel of Wachtwoord en poort specificeren om via SSH verbinding te maken met onze servers. We hebben ook een naam nodig voor ons nieuwe cluster.
Na het instellen van de SSH-toegangsinformatie, moeten we de databasegebruiker, versie, basedir en het IP-adres of de hostnaam voor elk databaseknooppunt definiëren.
Zorg ervoor dat u het groene vinkje krijgt bij het invoeren van de hostnaam of het IP-adres, wat aangeeft dat ClusterControl kan communiceren met het knooppunt. Klik vervolgens op de knop Importeren en wacht tot ClusterControl klaar is met zijn taak. U kunt het proces volgen in de sectie ClusterControl-activiteiten.
Het databasecluster wordt weergegeven onder het ClusterControl-dashboard zodra het is geïmporteerd.
Merk op dat, als u alleen een PostgreSQL-hoofdknooppunt heeft, u dit aan ClusterControl kunt toevoegen. Vervolgens kunt u de stand-by-knooppunten toevoegen vanuit de gebruikersinterface van ClusterControl zodat ClusterControl ze voor u kan configureren.
ClusterControlSingle Console voor uw gehele database-infrastructuurOntdek wat er nog meer nieuw is in ClusterControlInstalleer ClusterControl GRATISHoe u uw PostgreSQL-containers kunt implementeren met ClusterControl
Laten we nu eens kijken hoe PostgreSQL met Docker kan worden geïmplementeerd met behulp van een CentOS Docker-image (severalnines/centos-ssh) en een ClusterControl Docker-image (severalnines/clustercontrol).
Eerst zullen we een ClusterControl Docker-container implementeren met de nieuwste versie, dus we moeten de Docker Image met verschillende negens/clustercontrol ophalen.
$ docker pull severalnines/clustercontrol
Vervolgens zullen we de ClusterControl-container uitvoeren en de poort 5000 publiceren om er toegang toe te krijgen.
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Nu kunt u de gebruikersinterface van ClusterControl openen op http://[Docker_Host]:5000/clustercontrol en maak een standaard admin-gebruiker en wachtwoord aan.
De meerdere negens/centos-ssh wordt geleverd met, naast de ingeschakelde SSH-service, een Auto Deployment-functie, maar deze is alleen geldig voor Galera Cluster. PostgreSQL wordt nog niet ondersteund. We zullen dus de variabele AUTO_DEPLOYMENT op 0 zetten in de opdracht docker run om de databaseknooppunten te maken.
$ 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
Na het uitvoeren van deze commando's zouden we de volgende Docker-omgeving moeten hebben:
$ 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
We moeten het IP-adres voor elk databaseknooppunt weten. Om dit te weten, kunnen we de volgende opdracht uitvoeren voor elk knooppunt:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.3",
Nu we de serverknooppunten in gebruik hebben, moeten we ons databasecluster implementeren. Om het op een makkelijke manier te doen gebruiken we ClusterControl.
Om een implementatie uit te voeren vanuit ClusterControl, opent u de ClusterControl UI op http://[Docker_Host]:5000/clustercontrol , selecteer vervolgens de optie "Deploy" en volg de instructies die verschijnen.
Bij het selecteren van PostgreSQL moeten we Gebruiker, Sleutel of Wachtwoord en poort specificeren om via SSH verbinding te maken met onze servers. We hebben ook een naam nodig voor ons nieuwe cluster en als we willen dat ClusterControl de bijbehorende software en configuraties voor ons installeert.
Na het instellen van de SSH-toegangsinformatie, moeten we de databasegebruiker, -versie en datadir (optioneel) definiëren. We kunnen ook specificeren welke repository we moeten gebruiken.
In de volgende stap moeten we onze servers toevoegen aan het cluster dat we gaan maken.
Bij het toevoegen van onze servers kunnen we IP of hostnaam invoeren. Hier moeten we het IP-adres gebruiken dat we eerder van elke container hebben gekregen.
In de laatste stap kunnen we kiezen of onze replicatie synchroon of asynchroon zal zijn.
We kunnen de status van het maken van ons nieuwe cluster volgen via de ClusterControl-activiteitenmonitor.
Zodra de taak is voltooid, kunnen we onze cluster zien in het hoofdscherm van ClusterControl.
Conclusie
Zoals we konden zien, zou de implementatie van PostgreSQL met Docker in het begin eenvoudig kunnen zijn, maar het zal wat meer werk vergen om replicatie te configureren. Ten slotte moet u uw cluster controleren om te zien wat er gebeurt. Met ClusterControl kunt u uw PostgreSQL-cluster importeren of implementeren met Docker, evenals de bewakings- en beheertaken zoals back-up en automatische failover/recovery automatiseren. Probeer het uit.