Mongo Express容器无法与MongoDB容器稳定通信,如何修复?
问题
执行docker-compose -f mongo-services.yaml up启动容器,配置如下:
services: mongodb: image: mongo ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: supersecret mongo-express: image: mongo-express ports: - 8081:8081 environment: ME_CONFIG_MONGODB_ADMINUSERNAME: admin ME_CONFIG_MONGODB_ADMINPASSWORD: supersecret ME_CONFIG_MONGODB_SERVER: mongo depends_on: - "mongodb"
Mongo Express短暂连接30秒后持续断开,报错信息:
Could not connect to database using connectionString: mongodb://admin:****@mongo:27017/"
mongo-express-1 | /app/node_modules/mongodb/lib/sdam/topology.js:285
mongo-express-1 | const timeoutError = new error_1.MongoServerSelectionError(`Server selection timed out after ${serverSelectionTimeoutMS} ms`, this.description);
MongoDB日志显示正常的 checkpoint 记录:
mongodb-1 | {"t":{"$date":"2024-09-10T16:35:53.056+00:00"},"s":"I", "c":"WTCHKPT", "id":22430, "ctx":"Checkpointer","msg":"WiredTiger message","attr":{"message":{"ts_sec":1725986153,"ts_usec":56936,"thread":"1:0x7ff8cf000640","session_name":"WT_SESSION.checkpoint","category":"WT_VERB_CHECKPOINT_PROGRESS","category_id":6,"verbose_level":"DEBUG_1","verbose_level_id":1,"msg":"saving checkpoint snapshot min: 4, snapshot max: 4 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 7"}}}
解决方法
1. 添加认证源环境变量
MongoDB的root用户默认在admin数据库下完成认证,mongo-express需要明确指定认证源。在mongo-express的environment中新增配置:
ME_CONFIG_MONGODB_AUTHSOURCE: admin
修改后的mongo-express配置片段:
mongo-express: image: mongo-express ports: - 8081:8081 environment: ME_CONFIG_MONGODB_ADMINUSERNAME: admin ME_CONFIG_MONGODB_ADMINPASSWORD: supersecret ME_CONFIG_MONGODB_SERVER: mongo ME_CONFIG_MONGODB_AUTHSOURCE: admin # 新增认证源配置 depends_on: - "mongodb"
2. 增强容器启动依赖,等待MongoDB完全就绪
depends_on仅保证容器启动顺序,不确保MongoDB服务完全可用。通过健康检查+条件启动解决:
- 给mongodb配置健康检查,验证服务就绪状态:
mongodb: image: mongo ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: supersecret healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')", "--username", "admin", "--password", "supersecret", "--authenticationDatabase", "admin"] interval: 5s timeout: 5s retries: 5
- 修改mongo-express的
depends_on,等待mongodb进入健康状态:
mongo-express: # 其他配置不变 depends_on: mongodb: condition: service_healthy
3. 匹配MongoDB与Mongo-Express版本兼容性
部分新版本mongo-express与最新版MongoDB存在兼容问题,可指定经过测试的兼容版本:
mongodb: image: mongo:5 # 指定稳定版本 # 其他配置不变 mongo-express: image: mongo-express:0.54 # 与mongo:5兼容的版本 # 其他配置不变
4. 排查网络连通性(调试用)
若以上方法无效,进入mongo-express容器测试与mongodb的网络连通:
# 测试ICMP连通性 docker exec -it <mongo-express-container-name> ping mongo # 测试27017端口连通性 docker exec -it <mongo-express-container-name> nc -zv mongo 27017
如果ping不通,检查Docker Compose默认网络是否正常;如果nc不通,验证MongoDB是否正确监听27017端口。
内容的提问来源于stack exchange,提问作者cheebi
相关产品推荐
相关产品推荐

