Docker环境下Flask连接MongoDB出现超时错误求助
Flask与Docker中MongoDB连接超时问题排查
我在Docker环境中尝试让Flask连接MongoDB,一直遇到超时错误。特意使用了27018端口而非默认的27017,以下是我的代码、配置和报错信息,请帮忙排查问题。
app.py代码
from pymongo import MongoClient client = MongoClient(host="test_mongodb", port = 27018, username = "root", password = "rootpassword", authSource = "admin" ) #db is same as directory created to identify database #default port is 27017 db = client.aNewDB #db is a new database UserNum = db["UserNum"] #UserNum is a new Collection UserNum.insert_one({'num_of_users':0})
docker-compose.yml配置
version: '3' services: web: build: ./Web ports: - "5000:5000" links: - db #Web is dependent on db db: image: mongo:latest hostname: test_mongodb environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password ports: - 27018:27018
docker-compose up时的错误
web_1 | Traceback (most recent call last): web_1 | File "app.py", line 21, in <module> web_1 | UserNum.insert_one({'num_of_users':0}) web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/collection.py", line 628, in insert_one web_1 | comment=comment, web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/collection.py", line 562, in _insert_one web_1 | self.__database.client._retryable_write(acknowledged, _insert_command, session) web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1447, in _retryable_write web_1 | with self._tmp_session(session) as s: web_1 | File "/usr/local/lib/python3.7/contextlib.py", line 112, in __enter__ web_1 | return next(self.gen) web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1729, in _tmp_session web_1 | s = self._ensure_session(session) web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1712, in _ensure_session web_1 | return self.__start_session(True, causal_consistency=False) web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1657, in __start_session web_1 | self._topology._check_implicit_session_support() web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 538, in _check_implicit_session_support web_1 | self._check_session_support() web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 555, in _check_session_support web_1 | readable_server_selector, self.get_server_selection_timeout(), None web_1 | File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 240, in _select_servers_loop web_1 | % (self._error_message(selector), timeout, self.description) web_1 | pymongo.errors.ServerSelectionTimeoutError: test_mongodb:27018: timed out, Timeout: 30s, Topology Description: <TopologyDescription id: 62fa0685c58c2b61f79ea52e, topology_type: Unknown, servers: [<ServerDescription ('test_mongodb', 27018) server_type: Unknown, rtt: None, error=NetworkTimeout('test_mongodb:27018: timed out')>]> flask_project_web_1 exited with code 1
问题排查及修复方案
你的配置存在三个核心问题,逐一修复即可解决连接超时:
1. MongoDB容器端口映射错误
MongoDB默认在容器内部监听27017端口,当前端口映射27018:27018是错误的——外部访问27018端口会转发到容器内的27018端口,但容器内的MongoDB并未在此端口运行。
修复:修改docker-compose中db服务的ports配置:
ports: - "27018:27017"
此配置将宿主机的27018端口映射到容器内部的默认27017端口,既满足你用非默认端口访问的需求,又匹配MongoDB的实际运行端口。
2. Flask连接端口错误
容器间通信无需使用宿主机的映射端口,直接访问MongoDB容器内部的端口即可。当前app.py中指定连接27018端口,与容器内MongoDB的运行端口27017不匹配,导致连接超时。
修复:调整app.py中MongoClient的端口参数:
client = MongoClient(host="test_mongodb", port = 27017, username = "admin", password = "password", authSource = "admin" )
3. 数据库认证信息不匹配
docker-compose中设置的MongoDB root用户名是admin、密码是password,但app.py中使用的是root和rootpassword,认证信息不匹配会导致连接失败。
修复:将app.py中的用户名和密码调整为与docker-compose环境变量一致的值,即上述代码中的admin和password。
额外优化建议
- 移除
links配置:Docker Compose默认会为同一网络的服务创建DNS解析,直接用服务名db即可访问MongoDB容器(或保留hostname: test_mongodb也可正常访问)。 - 添加服务依赖:为web服务配置
depends_on,确保web服务在db服务启动后再启动,避免因数据库未就绪导致的连接问题:
web: build: ./Web ports: - "5000:5000" depends_on: - db
内容的提问来源于stack exchange,提问作者RCane
相关产品推荐
相关产品推荐

