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

MongoDB Docker复制集配置问题:非直连方式MongoCompass连接失败

Docker环境MongoDB复制集非直连连接失败问题

问题情况

复制集服务可正常运行,但使用MongoCompass通过非直连方式(URI如mongodb://localhost:27020/?readPreference=primary或mongodb://localhost:27020/?readPreference=secondary)连接时,持续加载后报错getaddrinfo ENOTFOUND dbrepmongotr。启用directConnection可成功连接,但该方式会跳过密码验证,必须禁用直连。

相关配置文件

Dockerfile

FROM mongo:5.0.5

COPY mongod.conf /etc/mongod.conf
COPY keyfile.txt /etc/keyfile.txt

EXPOSE 27017

CMD ["mongod", "--config", "/etc/mongod.conf","--keyfile", "/etc/keyfile.txt"]

mongod.conf

# mongod.conf

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,dbRepMongoTR2
#replication:
replication:
  replSet: "myRs0"
#snmp:
security:
  keyFile: /etc/keyfile.txt

docker-compose.yml

version: '3.5'
services:
  dbRepMongoTR:
    container_name: dbRepMongoTR
    image: mongorep:3.3
    ports:
      - 27020:27017
    restart: always
    # volumes:
    #   - ./databdGR:/data/db
    command: bin/sh -c "mongod --port 27017 --replSet myRs0 --bind_ip 127.0.0.1,dbRepMongoTR"
  dbRepMongoTR2:
    container_name: dbRepMongoTR2
    image: mongorep:1.3
    ports:
      - 27021:27017
    restart: always
    # volumes:
    #   - ./databdGR:/data/db
    command: bin/sh -c "mongod --port 27017 --replSet myRs0 --bind_ip 127.0.0.1,dbRepMongoTR2"

初始化操作

进入dbRepMongoTR容器的mongosh执行以下命令:

rs.initiate( { _id: "myRs0", members: [{ _id: 0, host: "dbRepMongoTR" }, { _id: 1, host: "dbRepMongoTR2" }] })
rs.status()

解决办法

问题根源

  1. 复制集初始化使用了Docker内部服务名(dbRepMongoTR、dbRepMongoTR2),本地MongoCompass无法解析这些域名,导致非直连模式下找不到节点。
  2. dbRepMongoTR的mongod.conf中bindIp配置错误(写为dbRepMongoTR2),且docker-compose的command参数覆盖了配置文件设置,造成节点绑定地址混乱。
  3. keyfile权限未正确配置,可能影响认证机制生效。

修复步骤

  1. 修正节点绑定地址
    每个节点的bindIp需包含自身容器名和0.0.0.0(允许外部访问,需确保环境安全),可统一使用配置文件或修正docker-compose的command。例如将dbRepMongoTR的command修改为:

    mongod --config /etc/mongod.conf --replSet myRs0 --bind_ip 0.0.0.0,dbRepMongoTR
    

    同时将该节点mongod.conf中的bindIp改为127.0.0.1,dbRepMongoTR,保证配置一致性。

  2. 让本地可解析复制集节点地址
    二选一执行即可:

    • 修改初始化命令:使用本地映射端口与localhost地址,初始化命令改为:
      rs.initiate( {
        _id: "myRs0",
        members: [
          { _id: 0, host: "localhost:27020" },
          { _id: 1, host: "localhost:27021" }
        ]
      })
      
    • 修改本地hosts文件:在本地hosts文件(Windows为C:\Windows\System32\drivers\etc\hosts,Linux/macOS为/etc/hosts)中添加两行:
      127.0.0.1 dbRepMongoTR
      127.0.0.1 dbRepMongoTR2
      
      使本地能识别Docker内部服务名。
  3. 配置keyfile正确权限
    在Dockerfile中添加权限设置:

    RUN chmod 600 /etc/keyfile.txt && chown mongodb:mongodb /etc/keyfile.txt
    

    避免因权限错误导致认证失效或直连跳过验证的情况。

  4. 重启服务重新初始化
    停止所有容器,重新构建镜像并启动服务,执行修改后的初始化命令,最后用MongoCompass不带directConnection的URI测试连接。


内容的提问来源于stack exchange,提问作者Juan Castañeda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:05:38