Docker Compose部署Mongo副本集:mongosetup连接失败求助
问题解决:Docker Compose中MongoDB副本集初始化失败(连接被拒绝)
问题根源
你的mongodb服务启动时指定了--bind_ip localhost,这会让MongoDB仅监听容器内部的localhost接口。而mongosetup容器是通过Docker Compose内部网络,用服务名mongodb发起连接,该请求属于mongodb容器的外部请求,因此被拒绝。
手动进入mongodb容器能成功初始化,是因为你在容器内部使用localhost访问,符合bind_ip的限制规则。
修复方案
1. 修改MongoDB的绑定地址
更新docker-compose.yml中mongodb服务的command参数,将--bind_ip localhost改为--bind_ip 0.0.0.0(允许所有地址访问),或者直接去掉该参数(MongoDB默认会绑定所有可用地址):
services: mongodb: # ... 其他配置保持不变 command: mongod --replSet testRs --keyFile /test/keyfile --bind_ip 0.0.0.0;
2. 优化初始化脚本(可选,提升可靠性)
原有的sleep 10是固定等待,可能在MongoDB未完全就绪时就尝试连接。可以替换成循环等待MongoDB启动的脚本,确保服务就绪后再执行初始化:
mongosetup: image: mongo depends_on: - mongodb restart: 'no' entrypoint: [ 'bash', '-c', "until mongosh admin --host mongodb:27017 -u root -p example --eval 'db.runCommand({ ping: 1 })'; do echo '等待MongoDB启动...'; sleep 2; done; mongosh admin --host mongodb:27017 -u root -p example --eval 'rs.initiate()'", ]
验证步骤
- 停止并清理现有容器:
docker-compose down -v - 重新启动服务:
docker-compose up -d - 查看mongosetup容器日志:
docker-compose logs mongosetup,确认初始化成功 - 进入mongodb容器验证副本集状态:
docker exec -it mongodb mongosh -u root -p example --eval 'rs.status()'
内容的提问来源于stack exchange,提问作者LIIT
相关产品推荐
相关产品推荐

