Docker部署MongoDB实例 容器化Flask连接超时问题咨询
问题根因
报错核心是容器内域名解析失败,直接原因是docker-compose.yml配置存在疏漏:mongodb服务没有加入自定义的backnet桥接网络,和app服务不在同一网络平面,导致app容器内部无法解析mongodb这个服务域名。
你观察到的「宿主机非容器化Flask可以正常连接MongoDB」属于正常现象:该场景走的是Docker端口转发规则(你配置了27017端口映射,实际绑定到宿主机56367端口),和容器内部跨服务通信的域名解析逻辑完全无关。
排查验证步骤
可以通过以下操作确认问题:
- 进入app容器执行
docker exec -it dstudio_app_1 ping mongodb,会直接返回域名解析失败错误 - 执行
docker network inspect dstudio_backnet查看网络成员,会发现列表中仅包含db和app两个容器,没有mongodb容器 - 查看mongodb容器的网络配置,会发现它默认挂载的是compose自动创建的default桥接网络,和backnet网络隔离
修复方案
- 修改
docker-compose.yml中mongodb服务的配置,补充网络声明,和其余服务保持一致:
mongodb: image: mongo:latest container_name: mongodb restart: unless-stopped environment: - MONGO_INITDB_DATABASE=dstudiox volumes: - db-data:/data/db ports: - "27017" # 新增以下网络配置 networks: - backnet
- 保存配置后,在compose文件所在目录执行命令重建mongodb容器:
docker-compose up -d mongodb
- 重建完成后重启app容器即可正常连接:
docker-compose restart app
可选优化
当前depends_on配置仅校验容器是否启动,不会等待MongoDB服务完成初始化,若出现偶发连接超时,可以给mongodb服务添加和mysql类似的健康检查配置,确保服务就绪后再启动app:
mongodb: image: mongo:latest container_name: mongodb restart: unless-stopped healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 3s retries: 5 start_period: 20s environment: - MONGO_INITDB_DATABASE=dstudiox volumes: - db-data:/data/db ports: - "27017" networks: - backnet
内容的提问来源于stack exchange,提问作者Aeva
相关产品推荐
相关产品推荐

