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

Docker Compose配置MongoDB副本集连接失败问题求助

问题

为本地开发环境配置MongoDB副本集,编写了docker-compose.yml文件,所有容器初始化看似正常,但mongo-init-replica容器无法通过连接字符串建立连接。已知Docker Compose会将所有容器置于同一网络,理论上应能互相访问。

docker-compose.yml内容

version: '3'
services:
  redis:
    image: redis:latest
    container_name: redis
    ports:
      - "6379:6379"

  mongodb1:
    image: mongo:latest
    container_name: mongodb1
    ports:
      - "27017:27017"
    volumes:
      - ./data/db1:/data/db
    environment:
      - MONGO_INITDB_DATABASE=tennis
      - MONGO_REPLICA_SET_NAME=rs0
      - MONGO_PORT=27017
      - MONGO_PRIORITY=1
    command: ["mongod", "--replSet", "rs0", "--bind_ip_all"]

  mongodb2:
    image: mongo:latest
    container_name: mongodb2
    ports:
      - "27018:27017"
    volumes:
      - ./data/db2:/data/db
    environment:
      - MONGO_INITDB_DATABASE=tennis
      - MONGO_REPLICA_SET_NAME=rs0
      - MONGO_PORT=27017
      - MONGO_PRIORITY=0
    command: ["mongod", "--replSet", "rs0", "--bind_ip_all"]

  mongodb3:
    image: mongo:latest
    container_name: mongodb3
    ports:
      - "27019:27017"
    volumes:
      - ./data/db3:/data/db
    environment:
      - MONGO_INITDB_DATABASE=tennis
      - MONGO_REPLICA_SET_NAME=rs0
      - MONGO_PORT=27017
      - MONGO_PRIORITY=0
    command: ["mongod", "--replSet", "rs0", "--bind_ip_all"]

  mongo-init-replica:
    image: mongo:latest
    depends_on:
      - mongodb1
      - mongodb2
      - mongodb3
    volumes:
      - ./scripts:/scripts
    command: ["mongosh", "mongodb://mongodb1:27017,mongodb2:27017,mongodb3:27017/admin", "/scripts/init-replica.js"]

错误日志

启动mongo-init-replica容器时,日志显示:

Current Mongosh Log ID: 65c6bbfee1b8e4ee1e55263f
Connecting to:          mongodb://mongodb1:27017,mongodb2:27017,mongodb3:27017/admin?appName=mongosh+1.6.0
MongoServerSelectionError: Server selection timed out after 30000 ms

停止任意MongoDB容器(如mongodb3)时,会出现:

MongoServerSelectionError: getaddrinfo ENOTFOUND mongodb3

地址能被解析但无法建立连接,需要排查思路。


排查思路与解决方案

  • 确认MongoDB服务就绪状态:depends_on仅保证容器启动顺序,不确保MongoDB服务已完成初始化。可以给mongo-init-replica添加启动延迟,或用脚本检测端口就绪:
    修改command为:

    ["bash", "-c", "sleep 15 && mongosh mongodb://mongodb1:27017,mongodb2:27017,mongodb3:27017/admin /scripts/init-replica.js"]
    

    更可靠的方式是使用wait-for-it工具,避免固定延迟的不确定性。

  • 检查MongoDB容器内部服务状态:进入任意MongoDB容器,执行mongosh localhost:27017,验证服务是否正常启动。如果连接失败,查看容器日志(docker logs mongodb1),排查mongod进程启动报错(如权限、绑定IP问题)。

  • 验证副本集初始化脚本:确保init-replica.js中成员地址使用容器名称,配置符合预期,示例脚本如下:

    rs.initiate({
      _id: "rs0",
      members: [
        { _id: 0, host: "mongodb1:27017", priority: 1 },
        { _id: 1, host: "mongodb2:27017", priority: 0 },
        { _id: 2, host: "mongodb3:27017", priority: 0 }
      ]
    });
    rs.status();
    
  • 测试容器间网络连通性:进入mongo-init-replica容器,执行ping mongodb1和telnet mongodb1 27017,确认端口是否可访问。如果telnet失败,检查MongoDB容器的--bind_ip_all参数是否生效,是否有网络策略阻止连接。

  • 检查Docker网络配置:执行docker network inspect <compose-project-name>_default,确认所有MongoDB容器和mongo-init-replica容器处于同一网络,且IP地址正常分配。

内容的提问来源于stack exchange,提问作者Neniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:01:01