Docker环境下容器无法连接MongoDB副本集问题求助
Docker Compose配置MongoDB副本集的容器内连接问题
问题现象
通过Docker Compose配置MongoDB副本集后,本地环境(Docker外)用localhost:27017访问正常,但同Docker网络内的容器(如mongodb-express、自定义Python测试容器)无法连接,报错:
- mongodb-express错误:
MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017 - Python测试容器错误:
Could not reach any servers in [('127.0.0.1', 27017)]. Replica set is configured with internal hostnames or IPs?, Timeout: 30s, Topology Description: <TopologyDescription id: 6601e73756219d127e813dcd, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('127.0.0.1', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('127.0.0.1:27017: [Errno 111] Connection refused')>]>
当前配置
Docker Compose文件
version: "3.9" services: mongodb: image: mongo:7.0.7 hostname: mongodb restart: always volumes: - ./scripts/mongodb/rs-initiate.js:/docker-entrypoint-initdb.d/rs-initiate.js ports: - 27017:27017 networks: - default command: ["--replSet", "dbrs", "--bind_ip", "0.0.0.0"] mongodb-express: image: mongo-express restart: always depends_on: - mongodb environment: ME_CONFIG_MONGODB_URL: mongodb://mongodb:27017/?replicaSet=dbrs ports: - 8081:8081 networks: - default
副本集初始化脚本rs-initiate.js
rs.initiate();
Python测试代码
from pymongo import MongoClient client = MongoClient("mongodb://mongodb:27017/?replicaSet=dbrs") db = client["users"] collection = db["messages"] result = collection.find() for i in result: print(i)
解决思路及步骤
核心问题是副本集初始化时默认使用了127.0.0.1作为节点地址,但Docker容器内的客户端会尝试连接自身的127.0.0.1,而非MongoDB容器的地址。需要修改副本集配置,使用Docker网络内可解析的hostname(即mongodb)作为节点地址。
1. 修改副本集初始化脚本
更新rs-initiate.js,指定副本集成员的地址为容器的hostname,确保Docker网络内的客户端能正确解析:
rs.initiate({ _id: "dbrs", members: [ { _id: 0, host: "mongodb:27017" } ] });
2. 重置MongoDB数据(若已初始化过副本集)
如果之前已经启动过MongoDB容器并完成副本集初始化,需要清理旧的Volume数据,确保新的初始化脚本生效:
# 停止并删除容器及关联数据卷 docker-compose down -v # 重新启动容器 docker-compose up -d
3. 验证副本集配置
进入MongoDB容器,检查副本集成员地址是否正确:
# 进入MongoDB容器(替换为实际容器ID或名称) docker exec -it mongodb mongosh # 查看副本集配置 rs.conf()
确认members[0].host的值为mongodb:27017,而非127.0.0.1:27017。
4. 验证容器内连接
重新启动mongodb-express和测试容器,此时应该能正常连接MongoDB副本集。
内容的提问来源于stack exchange,提问作者Devid Mercer
相关产品推荐
相关产品推荐

