Docker har blivit det vanligaste verktyget för att skapa, distribuera och köra applikationer med hjälp av behållare. Det tillåter oss att paketera en applikation med alla delar den behöver, såsom bibliotek och andra beroenden, och skicka ut allt som ett paket. Docker kan betraktas som en virtuell maskin, men istället för att skapa ett helt virtuellt operativsystem tillåter Docker applikationer att använda samma Linux-kärna som systemet de körs på och kräver bara att applikationer skickas med saker som inte redan körs på värddatorn. Detta ger en betydande prestandaökning och minskar storleken på applikationen.
I den här bloggen kommer vi att se hur vi enkelt kan distribuera en PostgreSQL-installation via Docker, och hur vi vänder vår installation till en primär/standby-replikeringsinställning med hjälp av ClusterControl.
Hur man distribuerar PostgreSQL med Docker
Låt oss först se hur du distribuerar PostgreSQL med Docker manuellt genom att använda en PostgreSQL Docker Image.
Bilden är tillgänglig på Docker Hub och du kan hitta den från kommandoraden:
$ docker search postgres
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
postgres The PostgreSQL object-relational database sy… 6519 [OK]
Vi tar det första resultatet. Den officiella. Så vi måste dra bilden:
$ docker pull postgres
Och kör nodbehållarna som mappar en lokal port till databasporten i behållaren:
$ 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
Efter att ha kört dessa kommandon bör du skapa denna Docker-miljö:
$ 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 kan du komma åt varje nod med följande kommando:
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.
postgres=#
Sedan kan du skapa en databasanvändare, ändra konfigurationen enligt dina krav eller konfigurera replikering mellan noderna manuellt.
Hur du importerar dina PostgreSQL-behållare till ClusterControl
Relaterade resurser ClusterControl for PostgreSQL Distribuera PostgreSQL på en Docker Container Använda Kubernetes för att distribuera PostgreSQLNu när du har ställt in ditt PostgreSQL-kluster behöver du fortfarande övervaka det, varna vid prestandaproblem, hantera säkerhetskopior, upptäcka fel och automatiskt failover till en frisk server.
Om du redan har ett PostgreSQL-kluster som körs på Docker och du vill att ClusterControl ska hantera det, kan du helt enkelt köra ClusterControl-behållaren i samma Docker-nätverk som databasbehållarna. Det enda kravet är att säkerställa att målbehållarna har SSH-relaterade paket installerade (openssh-server, openssh-clients). Tillåt sedan lösenordslös SSH från ClusterControl till databasbehållarna. När du är klar använder du funktionen "Importera befintlig server/kluster" och klustret bör importeras till ClusterControl.
Låt oss först installera OpenSSH-relaterade paket på databasbehållarna, tillåta rotinloggningen, starta den och ställa in root-lösenordet:
$ 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
Starta ClusterControl-behållaren (om den inte har startat) och vidarebefordra port 80 på behållaren till port 5000 på värden:
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Kontrollera att ClusterControl-behållaren är uppe:
$ 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
Öppna en webbläsare, gå till http://[Docker_Host]:5000/clustercontrol och skapa en standardadminanvändare och ett lösenord. Du bör nu se ClusterControls huvudsida.
Det sista steget är att ställa in den lösenordslösa SSH för alla databasbehållare. För detta behöver vi veta IP-adressen för varje databasnod. För att veta det kan vi köra följande kommando för varje nod:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.6",
Fäst sedan till ClusterControl-behållarens interaktiva konsol:
$ docker exec -it clustercontrol bash
Kopiera SSH-nyckeln till alla databasbehållare:
$ ssh-copy-id 172.17.0.6
$ ssh-copy-id 172.17.0.7
$ ssh-copy-id 172.17.0.8
Nu kan vi börja importera klustret till ClusterControl. Öppna en webbläsare och gå till Dockers fysiska värd-IP-adress med den mappade porten, t.ex. http://192.168.100.150:5000/clustercontrol , klicka på "Importera befintlig server/kluster" och lägg sedan till följande information.
Vi måste ange användare, nyckel eller lösenord och port för att ansluta med SSH till våra servrar. Vi behöver också ett namn för vårt nya kluster.
Efter att ha ställt in SSH-åtkomstinformationen måste vi definiera databasanvändare, version, baseir och IP-adress eller värdnamn för varje databasnod.
Se till att du får den gröna bocken när du anger värdnamnet eller IP-adressen, vilket indikerar att ClusterControl kan kommunicera med noden. Klicka sedan på knappen Importera och vänta tills ClusterControl slutför sitt jobb. Du kan övervaka processen i ClusterControl Activity Section.
Databasklustret kommer att listas under ClusterControl-instrumentpanelen när det har importerats.
Observera att om du bara har en PostgreSQL-masternod kan du lägga till den i ClusterControl. Sedan kan du lägga till standbynoderna från ClusterControl UI så att ClusterControl kan konfigurera dem åt dig.
ClusterControlSingle Console för hela din databasinfrastrukturTa reda på vad mer som är nytt i ClusterControlInstallera ClusterControl GRATISHur du distribuerar dina PostgreSQL-behållare med ClusterControl
Låt oss nu se hur du distribuerar PostgreSQL med Docker genom att använda en CentOS Docker Image (severalnines/centos-ssh) och en ClusterControl Docker Image (severalnines/clustercontrol).
Först kommer vi att distribuera en ClusterControl Docker Container med den senaste versionen, så vi måste dra fleranines/clustercontrol Docker Image.
$ docker pull severalnines/clustercontrol
Sedan kör vi ClusterControl-behållaren och publicerar port 5000 för att komma åt den.
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Nu kan du öppna ClusterControl UI på http://[Docker_Host]:5000/clustercontrol och skapa en standardadminanvändare och ett lösenord.
Flera nines/centos-ssh kommer med, förutom SSH-tjänsten aktiverad, en automatisk distributionsfunktion, men den är bara giltig för Galera Cluster. PostgreSQL stöds inte ännu. Så vi sätter variabeln AUTO_DEPLOYMENT i 0 i docker run-kommandot för att skapa databasens noder.
$ 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
Efter att ha kört dessa kommandon bör vi ha följande Docker-miljö:
$ 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
Vi behöver veta IP-adressen för varje databasnod. För att veta det kan vi köra följande kommando för varje nod:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.3",
Nu har vi servernoderna igång, vi måste distribuera vårt databaskluster. För att göra det på ett enkelt sätt använder vi ClusterControl.
För att utföra en distribution från ClusterControl, öppna ClusterControl UI på http://[Docker_Host]:5000/clustercontrol , välj sedan alternativet "Distribuera" och följ instruktionerna som visas.
När vi väljer PostgreSQL måste vi ange Användare, Nyckel eller Lösenord och port för att ansluta med SSH till våra servrar. Vi behöver också ett namn för vårt nya kluster och om vi vill att ClusterControl ska installera motsvarande programvara och konfigurationer åt oss.
Efter att ha ställt in SSH-åtkomstinformationen måste vi definiera databasanvändare, version och datadir (valfritt). Vi kan också specificera vilket arkiv som ska användas.
I nästa steg måste vi lägga till våra servrar i klustret som vi ska skapa.
När vi lägger till våra servrar kan vi ange IP eller värdnamn. Här måste vi använda IP-adressen som vi fick från varje container tidigare.
I det sista steget kan vi välja om vår replikering ska vara Synchronous eller Asynchronous.
Vi kan övervaka statusen för skapandet av vårt nya kluster från ClusterControl-aktivitetsmonitorn.
När uppgiften är klar kan vi se vårt kluster på huvudskärmen för ClusterControl.
Slutsats
Som vi kunde se kan distributionen av PostgreSQL med Docker vara lätt i början men det kommer att kräva lite mer arbete att konfigurera replikering. Slutligen bör du övervaka ditt kluster för att se vad som händer. Med ClusterControl kan du importera eller distribuera ditt PostgreSQL-kluster med Docker, samt automatisera övervaknings- och hanteringsuppgifter som säkerhetskopiering och automatisk failover/återställning. Prova det.