You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:49:57