我正在尝试使用 3 个 repilca 节点创建 mongo 的本地设置
我创建了包含 3 个 mongo 节点的 docker compose 文件。
但是当我无法使用指南针连接到 mongo 时,它会抛出 ENOTFOUND 错误。
mongo 连接字符串 -
mongodb://localhost:27017/
mongodb://mongo1:27017/
mongodb://:27017/
version: '3'
services:
mongo1:
image: mongo:4.4
container_name: mongo1
ports:
- "27017:27017"
networks:
- elk-net
volumes:
- ./data/mongo1:/data/db
command: mongod --replSet rs0 --bind_ip_all
mongo2:
image: mongo:4.4
container_name: mongo2
ports:
- "27018:27017"
networks:
- elk-net
volumes:
- ./data/mongo2:/data/db
command: mongod --replSet rs0 --bind_ip_all
mongo3:
image: mongo:4.4
container_name: mongo3
ports:
- "27019:27017"
networks:
- elk-net
volumes:
- ./data/mongo3:/data/db
command: mongod --replSet rs0 --bind_ip_all
networks:
elk-net:
您可以在下面找到 MongoDB 副本集的工作解决方案(它包含 2 个副本)。 docker-compose.yml 有几个有用的注释。
docker-compose.yml:
version: "3.8"
services:
mongo1:
image: mongo:4.4.5
hostname: mongo1
networks:
- mongo_net
# The following variables won't be used due to set entrypoint section
# The replica-set sets automatically, but the admin user has to be set
# only one time when you use new deploy.
# I guess it can be automated, but I didn't have time for it...
# Eg.:
# docker exec -it <docker-container-id> mongo
# use admin
# db.createUser({ user: "admin", pwd: "admin_pwd", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
environment:
- MONGO_INITDB_DATABASE=test_db
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin_pwd
- MONGO_DATA_DIR=/data/db
volumes:
- mongo-1:/data/db
- ./docker-entrypoint-mongo.sh:/data/docker-entrypoint.sh
# Probably the expose is not needed because the services can
# communicate via any port inside Docker Network.
expose:
- 27017
entrypoint:
- bash
- -c
- |
chmod +x /data/docker-entrypoint.sh
exec /data/docker-entrypoint.sh
healthcheck:
test: test $$(echo "rs.initiate({_id:'my-replica-set',members:[{_id:0,host:\"mongo1:27017\"},{_id:1,host:\"mongo2:27017\"}]}).ok || rs.status().ok" | mongo --quiet ) -eq 1
interval: 10s
start_period: 30s
mongo2:
image: mongo:4.4.5
hostname: mongo2
networks:
- mongo_net
environment:
- MONGO_INITDB_DATABASE=test_db
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin_pwd
- MONGO_DATA_DIR=/data/db
volumes:
- mongo-2:/data/db
- ./docker-entrypoint-mongo.sh:/data/docker-entrypoint.sh
expose:
- 27017
entrypoint:
- bash
- -c
- |
chmod +x /data/docker-entrypoint.sh
exec /data/docker-entrypoint.sh
volumes:
mongo-1:
mongo-2:
networks:
mongo_net: {}
docker-entrypoint-mongo.sh:
mongod "--enableMajorityReadConcern" "false" "--journal" "--dbpath" "/data/db" "--replSet" "my-replica-set" "--bind_ip_all"
MongoDB 副本集的连接字符串:
mongodb://mongo1:27017,mongo2:27017/?replicaSet=my-replica-set