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()
解决办法
问题根源
- 复制集初始化使用了Docker内部服务名(
dbRepMongoTR、dbRepMongoTR2),本地MongoCompass无法解析这些域名,导致非直连模式下找不到节点。 - dbRepMongoTR的
mongod.conf中bindIp配置错误(写为dbRepMongoTR2),且docker-compose的command参数覆盖了配置文件设置,造成节点绑定地址混乱。 - keyfile权限未正确配置,可能影响认证机制生效。
修复步骤
修正节点绑定地址
每个节点的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,保证配置一致性。让本地可解析复制集节点地址
二选一执行即可:- 修改初始化命令:使用本地映射端口与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)中添加两行:
使本地能识别Docker内部服务名。127.0.0.1 dbRepMongoTR 127.0.0.1 dbRepMongoTR2
- 修改初始化命令:使用本地映射端口与localhost地址,初始化命令改为:
配置keyfile正确权限
在Dockerfile中添加权限设置:RUN chmod 600 /etc/keyfile.txt && chown mongodb:mongodb /etc/keyfile.txt避免因权限错误导致认证失效或直连跳过验证的情况。
重启服务重新初始化
停止所有容器,重新构建镜像并启动服务,执行修改后的初始化命令,最后用MongoCompass不带directConnection的URI测试连接。
内容的提问来源于stack exchange,提问作者Juan Castañeda
相关产品推荐
相关产品推荐

