-
-
Save asoorm/7822cc742831639c93affd734e97ce4f to your computer and use it in GitHub Desktop.
version: "3" | |
services: | |
mongo1: | |
hostname: mongo1 | |
container_name: localmongo1 | |
image: mongo:4.0-xenial | |
expose: | |
- 27017 | |
ports: | |
- 27011:27017 | |
restart: always | |
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ] | |
mongo2: | |
hostname: mongo2 | |
container_name: localmongo2 | |
image: mongo:4.0-xenial | |
expose: | |
- 27017 | |
ports: | |
- 27012:27017 | |
restart: always | |
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ] | |
mongo3: | |
hostname: mongo3 | |
container_name: localmongo3 | |
image: mongo:4.0-xenial | |
expose: | |
- 27017 | |
ports: | |
- 27013:27017 | |
restart: always | |
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ] |
When I tried to connect with string URI mongodb://localhost:27011,localhost:27012,localhost:27013/?replicaSet=rs0
using Compass
I got the following error
getaddrinfo EAI_AGAIN mongo1
By the way, you all would have to expose all Mongo replicaset instances ports in order to get connected to them, so I think It's redundant being exposing ports, It's better to use host network mode.
I was looking for a simple Compose for this and, unfortunately, I didn't find one complete and simple at the same time, because of that I made one as simple as possible where the secondary ones ingress their selfies on the master without any third-party script.
I hope you all find it useful
version: "3"
services:
node0:
image: mongo
restart: always
command: --replSet rs0 --bind_ip_all
network_mode: host
healthcheck:
test: >
mongosh --eval "try{rs.initiate().ok}catch(e){rs.status().ok}"
interval: 3s
node1:
image: mongo
depends_on:
- node0
restart: always
command: --replSet rs0 --bind_ip_all --port 27018
network_mode: host
environment:
PORT: 27018
healthcheck:
test: >
mongosh --host localhost:27017 --eval "var me = '$${HOSTNAME}:$${PORT}'; rs.status().members.some(m => m.name == me) || rs.add({host: me})"
interval: 3s
node2:
image: mongo
depends_on:
- node0
restart: always
command: --replSet rs0 --bind_ip_all --port 27019
network_mode: host
environment:
PORT: 27019
healthcheck:
test: >
mongosh --host localhost:27017 --eval "var me = '$${HOSTNAME}:$${PORT}'; rs.status().members.some(m => m.name == me) || rs.add({host: me})"
interval: 3s
docker exec -it mongodb /bin/bash
This worked perfectly for me to create and start the mongodb set on docker containers. I can also connect to any of the servers using compass. But when I tried to open a connection from another server in the docker network (a php server), using php mongodb client, I got "Authentication failed" using this url:
mongodb://172.24.0.5:27017,172.24.0.3:27017,172.24.0.4:27017?replicaSet=dbrs
I am also sending my username and password, same that I am using in the compass connection url. The internal ips are correct, so that is not the problem.
So, basically, replicaset is up and running, I can connect from MongoDB Compass but I can't connect from my PHP code from a docker container in the same docker network.
I have setup everything in this https://github.com/nguyenduyhust/docker-mongodb-replica-set.
Great if that's what you're looking for.