Desplegar un Clúster de MongoDB con Docker Compose
Table of Contents
De un artículo previo, si quieres desplegar un clúster de MongoDB en un entorno de desarrollo local, tienes que seguir los pasos a continuación:
- Crear una red de Docker
$ docker network create mongodbCluster
- Crear un nodo primario y agregarlo a la red que se creó anteriormente
$ docker run -d -p 27017:27017 --name mongo1 --network mongodbCluster mongo:6 mongod --replSet myReplicaSet --bind_ip localhost,mongo1
- Una vez que se crea el nodo primario, los nodos secundarios del conjunto de réplica deben crearse
$ docker run -d -p 27018:27017 --name mongo2 --network mongodbCluster mongo:6 mongod --replSet myReplicaSet --bind_ip localhost,mongo2
$ docker run -d -p 27019:27017 --name mongo3 --network mongodbCluster mongo:6 mongod --replSet myReplicaSet --bind_ip localhost,mongo3
- Y finalmente, iniciar el conjunto de réplica
$ docker exec -it mongo1 mongosh --eval "rs.initiate({
_id: \"myReplicaSet\",
members: [
{_id: 0, host: \"mongo1\"},
{_id: 1, host: \"mongo2\"},
{_id: 2, host: \"mongo3\"}
]
})"
También puedes usar Docker Compose para desplegar el clúster, sin tener que escribir todos los comandos anteriores.
A través de este artículo, aprenderás a usar Docker Compose para deplegar un clúster de MongoDB con replicación habilitada.
Docker Compose#
Primero, crea el directorio del proyecto
$ mkdir mongodb-cluster
En seguida, crea el archivo compose.yaml
con el siguiente contenido:
services:
mongo1:
image: mongo:6
hostname: mongo1
container_name: mongo1
ports:
- 27017:27017
entrypoint: ["mongod", "--replSet", "myReplicaSet", "--bind_ip", "localhost,mongo1"]
mongo2:
image: mongo:6
hostname: mongo2
container_name: mongo2
ports:
- 27018:27017
entrypoint: ["mongod", "--replSet", "myReplicaSet", "--bind_ip", "localhost,mongo2"]
mongo3:
image: mongo:6
hostname: mongo3
container_name: mongo3
ports:
- 27019:27017
entrypoint: ["mongod", "--replSet", "myReplicaSet", "--bind_ip", "localhost,mongo3"]
mongosetup:
image: mongo:6
depends_on:
- mongo1
- mongo2
- mongo3
volumes:
- .:/scripts
restart: "no"
entrypoint: [ "bash", "/scripts/mongo_setup.sh"]
- Tres servicios son desplegados,
mongo1
,monogo2
,mongo3
, ymongosetup
- La imagen
mongo:6
se usa como base para crear los contenedores - Los nombres de host se asignan a los contenedores que serán parte del clúster,
mongo1
,monogo2
, ymongo3
- Se asigna nombre a los contenedores,
mongo1
,monogo2
, ymongo3
- Se definen los puertos en el host, y se encargarán de redirigir todas las peticiones a los puertos en los contenedores
- La opción
entrypoint
se usa para especificar el comando que se ejecutará una vez que se inicie el contenedor - El servicio
mongosetup
creará el contenedor que se usa para iniciar el conjunto de réplica
Una vez que el archivo compose.yaml
se ha creado, crea el directorio scripts
, y un script de BASH (mongo_setup.sh
), dentro de ese directorio, con el siguiente contenido:
$ mkdir scripts
$ touch scripts/mongo_setup.sh
#!/bin/bash
sleep 10
mongosh --host mongo1:27017 <<EOF
var cfg = {
"_id": "myReplicaSet",
"version": 1,
"members": [
{
"_id": 0,
"host": "mongo1:27017",
"priority": 2
},
{
"_id": 1,
"host": "mongo2:27017",
"priority": 0
},
{
"_id": 2,
"host": "mongo3:27017",
"priority": 0
}
]
};
rs.initiate(cfg);
EOF
El script anterior iniciará el conjunto de réplica.
Ahora ejecuta el siguiente comando para desplegar el clúster:
$ docker compose up --wait
Tu clúster de MongoDB se ha desplegado, y está listo para usarse. Si por alguna razón necesitas eliminar el clúster, ejecuta:
$ docker compose down
Conclusión#
A través de este artículo, aprendiste a desplegar un clúster de MongoDB con replicación habilitada, usando Docker Compose.