运行Gunicorn的Flask Docker容器连接MongoDB Docker容器时出现pymongo.errors.ServerSelectionTimeoutError问题求助
看起来你遇到的问题主要来自三个核心点:Docker网络隔离、连接字符串的端口错误,还有密码中特殊字符的转义问题。我来一步步帮你解决:
1. 解决Docker网络隔离问题
你现在用了两个独立的docker-compose.yml文件,Docker默认会为每个compose项目创建一个专属网络,这就导致你的Flask容器(xyz)和MongoDB容器(transactionsDB)处于完全隔离的网络环境,自然无法互相访问。
最优解决方案:把两个服务合并到同一个docker-compose.yml文件中,这样它们会自动加入同一个默认网络,就能通过服务名/容器名直接通信。修改后的完整配置如下:
version: '3.7' services: web: build: . image: 'flask/flask_docker' container_name: 'xyz' ports: - 4444:4444 # 确保MongoDB先启动再启动Flask服务 depends_on: - database networks: - app-network database: image: 'mongo:3.6.8' container_name: 'transactionsDB' environment: - MONGO_INITDB_DATABASE=abc - MONGO_INITDB_ROOT_USERNAME=abc - MONGO_INITDB_ROOT_PASSWORD=abc@v_1 ports: - '5555:27017' volumes: - /home/ubuntu/abc/:/data/db networks: - app-network networks: app-network: driver: bridge
2. 修正MongoDB连接字符串
你的原连接字符串存在两个关键错误:
- 端口用了主机映射的
5555,但容器之间访问应该用Mongo容器内部的默认端口27017(端口映射只用于主机和容器的通信) - 密码里的
@没有转义,它会被解析成用户名与主机地址的分隔符,导致连接字符串格式失效,需要把@转义成URL编码的%40 - 额外注意:因为你用的是Mongo的root用户(
MONGO_INITDB_ROOT_USERNAME),需要指定authSource=admin来从管理员数据库认证
修正后的连接字符串应该是:
mongodb://abc:abc%40v_1@transactionsDB:27017/abc?authSource=admin
3. 验证与启动步骤
- 先清理之前运行的容器:
# 如果之前分别启动了两个compose,各自执行docker-compose down;或者直接删除容器 docker rm -f xyz transactionsDB
- 使用合并后的
docker-compose.yml重新构建并启动服务:
docker-compose up -d --build
- 查看日志确认服务状态:
# 检查Flask应用日志,看是否有连接成功的信息 docker logs xyz # 检查MongoDB日志,确认数据库正常启动 docker logs transactionsDB
- (可选)进入Flask容器内部直接测试连接:
docker exec -it xyz bash # 在容器内运行Python代码测试连接 python -c "import pymongo; client = pymongo.MongoClient('mongodb://abc:abc%40v_1@transactionsDB:27017/abc?authSource=admin'); print('Connected successfully! Databases:', client.list_database_names())"
这样应该就能彻底解决pymongo.errors.ServerSelectionTimeoutError的问题了。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

