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

Docker容器内无法连接MSSQL数据库:OperationalError(20009)求助

解决Docker容器内连接MSSQL的OperationalError问题

核心问题排查与修复步骤

1. 修正数据库端口配置

你的代码中默认端口设为5432,这是PostgreSQL的默认端口,而MSSQL的默认端口是1433,这很可能是容器内连接失败的关键原因:

  • 检查容器运行时的PORT环境变量是否正确设置为1433
  • 若使用默认值,直接修改代码中的默认端口:
    port = os.getenv('PORT', 1433)  # 将5432改为1433
    

2. 确认数据库主机地址

你要连接的是宿主机上的MSSQL,而非Docker Compose中定义的database服务(该服务绑定5432端口,看起来是PostgreSQL服务):

  • 确保容器的HOST环境变量设置为host.docker.internal(对应宿主机地址)
  • 不要使用默认值DB,这个值指向的是Docker Compose里的PostgreSQL服务,和你要连接的MSSQL无关

3. 排查宿主机MSSQL的远程连接权限

容器无法连接宿主机MSSQL,可能是宿主机侧的限制:

  • 打开MSSQL配置管理器,确保TCP/IP协议已启用
  • 在防火墙中开放1433端口,允许容器所在的Docker网络访问
  • 确认MSSQL登录账号允许远程连接(检查账号的SERVER ROLES和USER MAPPINGS权限)

4. 确保容器内安装pymssql依赖库

pymssql依赖FreeTDS库,部分基础镜像(如python:alpine)默认没有安装,需要在Dockerfile中添加安装步骤:

  • 基于Debian/Ubuntu镜像的Dockerfile:
    RUN apt-get update && apt-get install -y freetds-dev gcc
    RUN pip install pymssql sqlalchemy
    
  • 基于Alpine镜像的Dockerfile:
    RUN apk add --no-cache freetds-dev gcc musl-dev
    RUN pip install pymssql sqlalchemy
    

5. 验证Docker网络配置

虽然你添加了extra_hosts,但仍需确认容器是否能正常访问宿主机:

  • 进入容器内部执行ping host.docker.internal,检查是否能连通宿主机
  • 若使用自定义网络(如test),确保你的应用服务也加入了该网络(当前Docker Compose只给database服务配置了test网络)

内容的提问来源于stack exchange,提问作者anonymousbird

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 23:22:40