Tudo deve estar dentro da mesma Docker Network, então vamos criá-la aqui:
docker network create mongoNet
docker network ls
Antes de subir as aplicações deverão ser criado os container com uma instancia do Mongo em execução. Sendo assim deixo disponibilizado o Dockerfile e docker-compose para configurar. Também abaixo temos o arquivo mongod.env que será responsável em definir o usuário e senha de acesso ao cluster. Todos os arquivos devem constar na mesma pasta que será responsável somente pela criação das imagens do MongoDb.
No link temos um exemplo de como deverá ficar a pasta para criação do cluster:
https://github.com/GustavoLeck/MongoReplicaSet
mongod.env
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=password
docker-compose.yaml
version: "3.3"
volumes:
mongo-keys:
m1:
m2:
m3:
networks:
mongoNet:
name: mongoNet
driver: bridge
mongo-keys:
image: depop/openssl-bats
container_name: mongo-keys
volumes:
- mongo-keys:/mongo-conf
command: 'bash -c "openssl rand -base64 741 > /mongo-conf/mongodb-keyfile; chmod 600 /mongo-conf/mongodb-keyfile; chown 999 /mongo-conf/mongodb-keyfile"'
m1:
build: .
networks:
- mongoNet
restart: always
container_name: m1
image: m1
volumes:
- mongo-keys:/opt/keyfile
- m1:/data/db
env_file: ./mongod.env
ports:
- "30001:27017"
command: 'mongod --auth --keyFile /opt/keyfile/mongodb-keyfile --replSet mongoSet'
depends_on:
- mongo-keys
m2:
build: .
networks:
- mongoNet
restart: always
container_name: m2
image: m2
volumes:
- mongo-keys:/opt/keyfile
- m2:/data/db
env_file: ./mongod.env
ports:
- "30002:27017"
command: 'mongod --auth --keyFile /opt/keyfile/mongodb-keyfile --replSet mongoSet'
depends_on:
- mongo-keys
m3:
build: .
networks:
- mongoNet
restart: always
container_name: m3
image: m3
volumes:
- mongo-keys:/opt/keyfile
- m3:/data/db
env_file: ./mongod.env
ports:
- "30003:27017"
command: 'mongod --auth --keyFile /opt/keyfile/mongodb-keyfile --replSet mongoSet'
depends_on:
- mongo-keys
Dockerfile
FROM mongo:7.0
CMD ["mongod", "--bind_ip_all", "--replSet", "mongoSet"]
Os arquivos devem ser criados em uma pasta diferente dos projetos
Para criar o replicaSet deve ser executado os comandos abaixo
docker exec -it m1 mongosh -u root -p password
rs.initiate({ "_id": "mongoSet", "members": [{ "_id": 0, "host": "m1:27017","priority": 1 }, { "_id": 1, "host": "m2:27017", "priority": 2 }, { "_id": 2, "host": "m3:27017", "priority": 3 }]})
rs.status()
Para trocar senha do usuáio
use admin
db.changeUserPassword("root", passwordPrompt())