Docker se ha convertido en la herramienta más común para crear, implementar y ejecutar aplicaciones mediante el uso de contenedores. Nos permite empaquetar una aplicación con todas las partes que necesita, como bibliotecas y otras dependencias, y enviarlo todo como un solo paquete. Docker podría considerarse como una máquina virtual, pero en lugar de crear un sistema operativo virtual completo, Docker permite que las aplicaciones usen el mismo kernel de Linux que el sistema en el que se ejecutan y solo requiere que las aplicaciones se envíen con cosas que aún no se ejecutan. la computadora anfitriona. Esto aumenta significativamente el rendimiento y reduce el tamaño de la aplicación.
En este blog, veremos cómo podemos implementar fácilmente una configuración de PostgreSQL a través de Docker y cómo convertir nuestra configuración en una configuración de replicación principal/en espera mediante ClusterControl.
Cómo implementar PostgreSQL con Docker
Primero, veamos cómo implementar PostgreSQL con Docker manualmente usando una imagen de Docker de PostgreSQL.
La imagen está disponible en Docker Hub y puede encontrarla desde la línea de comando:
$ docker search postgres
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
postgres The PostgreSQL object-relational database sy… 6519 [OK]
Tomaremos el primer resultado. El Oficial. Entonces, necesitamos extraer la imagen:
$ docker pull postgres
Y ejecute los contenedores de nodos asignando un puerto local al puerto de la base de datos en el contenedor:
$ 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
Después de ejecutar estos comandos, debería tener este entorno Docker creado:
$ 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
Ahora, puede acceder a cada nodo con el siguiente comando:
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.
postgres=#
Luego, puede crear un usuario de la base de datos, cambiar la configuración según sus requisitos o configurar la replicación entre los nodos manualmente.
Cómo importar sus contenedores de PostgreSQL a ClusterControl
Recursos relacionados ClusterControl para PostgreSQL Implementación de PostgreSQL en un contenedor Docker Uso de Kubernetes para implementar PostgreSQLAhora que configuró su clúster de PostgreSQL, aún necesita monitorearlo, alertar en caso de problemas de rendimiento, administrar copias de seguridad, detectar fallas y conmutar por error automáticamente a un servidor saludable.
Si ya tiene un clúster de PostgreSQL ejecutándose en Docker y quiere que ClusterControl lo administre, simplemente puede ejecutar el contenedor de ClusterControl en la misma red de Docker que los contenedores de la base de datos. El único requisito es asegurarse de que los contenedores de destino tengan paquetes relacionados con SSH instalados (openssh-server, openssh-clients). Luego, permita SSH sin contraseña desde ClusterControl a los contenedores de la base de datos. Una vez hecho esto, use la función "Importar servidor/clúster existente" y el clúster debe importarse a ClusterControl.
Primero, instalemos los paquetes relacionados con OpenSSH en los contenedores de la base de datos, permitamos el inicio de sesión de root, iniciémoslo y configuremos la contraseña de root:
$ 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
Inicie el contenedor ClusterControl (si no se ha iniciado) y reenvíe el puerto 80 del contenedor al puerto 5000 del host:
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Verifique que el contenedor ClusterControl esté activo:
$ 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
Abra un navegador web, vaya a http://[Docker_Host]:5000/clustercontrol y cree un usuario y una contraseña de administrador predeterminados. Ahora debería ver la página principal de ClusterControl.
El último paso es configurar el SSH sin contraseña para todos los contenedores de la base de datos. Para esto, necesitamos saber la dirección IP de cada nodo de la base de datos. Para saberlo, podemos ejecutar el siguiente comando para cada nodo:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.6",
Luego, adjunte a la consola interactiva del contenedor ClusterControl:
$ docker exec -it clustercontrol bash
Copie la clave SSH en todos los contenedores de la base de datos:
$ ssh-copy-id 172.17.0.6
$ ssh-copy-id 172.17.0.7
$ ssh-copy-id 172.17.0.8
Ahora, podemos comenzar a importar el clúster a ClusterControl. Abra un navegador web y vaya a la dirección IP del host físico de Docker con el puerto asignado, por ejemplo, http://192.168.100.150:5000/clustercontrol , haga clic en "Importar servidor/clúster existente" y luego agregue la siguiente información.
Debemos especificar Usuario, Clave o Contraseña y puerto para conectarnos por SSH a nuestros servidores. También necesitamos un nombre para nuestro nuevo clúster.
Después de configurar la información de acceso SSH, debemos definir el usuario de la base de datos, la versión, el directorio base y la dirección IP o el nombre de host para cada nodo de la base de datos.
Asegúrese de obtener la marca verde al ingresar el nombre de host o la dirección IP, lo que indica que ClusterControl puede comunicarse con el nodo. Luego, haga clic en el botón Importar y espere hasta que ClusterControl termine su trabajo. Puede monitorear el proceso en la Sección de Actividad de ClusterControl.
El clúster de la base de datos aparecerá en el panel de control de ClusterControl una vez importado.
Tenga en cuenta que, si solo tiene un nodo maestro de PostgreSQL, puede agregarlo a ClusterControl. Luego puede agregar los nodos en espera desde la interfaz de usuario de ClusterControl para permitir que ClusterControl los configure por usted.
ClusterControlConsola única para toda su infraestructura de base de datosDescubra qué más hay de nuevo en ClusterControlInstale ClusterControl GRATISCómo implementar sus contenedores de PostgreSQL con ClusterControl
Ahora, veamos cómo implementar PostgreSQL con Docker usando una imagen de Docker de CentOS (severalnines/centos-ssh) y una imagen de Docker de ClusterControl (severalnines/clustercontrol).
Primero, implementaremos un contenedor Docker de ClusterControl con la última versión, por lo que debemos extraer la imagen de Docker de varios nueves/clustercontrol.
$ docker pull severalnines/clustercontrol
Luego, ejecutaremos el contenedor ClusterControl y publicaremos el puerto 5000 para acceder a él.
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Ahora puede abrir la interfaz de usuario de ClusterControl en http://[Docker_Host]:5000/clustercontrol y cree un usuario y una contraseña de administrador predeterminados.
El variosnines/centos-ssh viene con, además del servicio SSH habilitado, una función de implementación automática, pero solo es válida para Galera Cluster. PostgreSQL aún no es compatible. Por lo tanto, estableceremos la variable AUTO_DEPLOYMENT en 0 en el comando de ejecución de la ventana acoplable para crear los nodos de bases de datos.
$ 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
Después de ejecutar estos comandos, deberíamos tener el siguiente entorno de Docker:
$ 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
Necesitamos saber la dirección IP de cada nodo de la base de datos. Para saberlo, podemos ejecutar el siguiente comando para cada nodo:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.3",
Ahora que tenemos los nodos del servidor en funcionamiento, necesitamos implementar nuestro clúster de base de datos. Para hacerlo de forma sencilla utilizaremos ClusterControl.
Para realizar una implementación desde ClusterControl, abra la interfaz de usuario de ClusterControl en http://[Docker_Host]:5000/clustercontrol , luego seleccione la opción "Implementar" y siga las instrucciones que aparecen.
Al seleccionar PostgreSQL, debemos especificar Usuario, Clave o Contraseña y puerto para conectarnos por SSH a nuestros servidores. También necesitamos un nombre para nuestro nuevo clúster y si queremos que ClusterControl instale el software y las configuraciones correspondientes por nosotros.
Después de configurar la información de acceso SSH, debemos definir el usuario de la base de datos, la versión y datadir (opcional). También podemos especificar qué repositorio usar.
En el siguiente paso, debemos agregar nuestros servidores al clúster que vamos a crear.
Al agregar nuestros servidores, podemos ingresar IP o nombre de host. Aquí debemos usar la dirección IP que obtuvimos de cada contenedor previamente.
En el último paso, podemos elegir si nuestra replicación será Síncrona o Asíncrona.
Podemos monitorear el estado de la creación de nuestro nuevo clúster desde el monitor de actividad de ClusterControl.
Una vez finalizada la tarea, podemos ver nuestro clúster en la pantalla principal de ClusterControl.
Conclusión
Como pudimos ver, la implementación de PostgreSQL con Docker podría ser fácil al principio, pero requerirá un poco más de trabajo para configurar la replicación. Finalmente, debe monitorear su clúster para ver qué está sucediendo. Con ClusterControl, puede importar o implementar su clúster de PostgreSQL con Docker, así como también automatizar las tareas de monitoreo y administración, como la copia de seguridad y la conmutación por error/recuperación automática. Pruébalo.