You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:36:28