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

