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

容器化Django应用连接SQL Server(ODBC Driver17)登录超时

容器化Django应用连接SQL Server超时问题排查

我正尝试将容器化的Django应用连接到SQL Server,查了不少相关话题但现有方案都不生效,求可行的排查思路或解决办法。

本地运行Django应用完全正常,但容器化版本抛出以下错误:

('HYT00', '[HYT00] [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

非容器化环境下可正常工作的数据库配置:

'secondary': {
    "ENGINE": "mssql",
    "HOST":"0.0.0.0,1433",
    "NAME": "db_name",
    "USER":  "sa",
    "PASSWORD": "pwd",
    "PORT": "",
    "OPTIONS": {
        'driver': 'ODBC Driver 17 for SQL Server',
    }
}

我使用的Dockerfile:

# Use an official Python runtime as a parent image
FROM python:3.9

# Install ODBC Driver 17 for SQL Server
RUN apt-get update && \
    apt-get install -y curl && \
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
    curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
    apt-get update && \
    ACCEPT_EULA=Y apt-get install -y msodbcsql17

# Set the working directory
WORKDIR /app

# Install Python dependencies
COPY requirements.txt .
RUN pip install -r requirements.txt

# Copy the rest of your application code into the container
COPY . .

EXPOSE 8000

# Run your Django application
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

排查方向及解决方案

1. 修正数据库主机地址

容器内的0.0.0.0无法指向宿主机的SQL Server(容器有独立网络栈),需根据SQL Server部署位置调整:

  • 若SQL Server在宿主机:将HOST改为宿主机内网IP;Windows/macOS环境可直接用host.docker.internal,Linux环境启动容器时需加参数--add-host host.docker.internal:host-gateway。
  • 若SQL Server在另一个容器:确保两个容器处于同一Docker网络,然后用SQL Server容器的名称作为HOST地址,端口保持1433。

2. 测试网络连通性

进入容器内部,直接测试与SQL Server的连通性:

# 先安装telnet工具
apt-get install -y telnet
# 替换为你的SQL Server地址
telnet <SQL_SERVER_ADDRESS> 1433

如果连接失败,检查:

  • SQL Server是否开启了TCP/IP远程连接
  • 宿主机或SQL Server所在服务器的防火墙是否开放1433端口
  • 容器网络是否能访问SQL Server所在网段

3. 补全ODBC依赖

Dockerfile仅安装了msodbcsql17,缺少unixODBC开发包,建议修改安装命令:

RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17 unixodbc-dev

同时确认requirements.txt中包含django-mssql-backend或pyodbc(Django连接SQL Server必需的Python库)。

4. 调整数据库配置格式

将HOST和PORT分开配置,避免格式冲突:

'secondary': {
    "ENGINE": "mssql",
    "HOST": "<正确的SQL Server地址>",
    "NAME": "db_name",
    "USER":  "sa",
    "PASSWORD": "pwd",
    "PORT": "1433",
    "OPTIONS": {
        'driver': 'ODBC Driver 17 for SQL Server',
    }
}

5. 验证SQL Server登录配置

确认:

  • sa账号已启用
  • sa密码正确
  • SQL Server允许SQL Server身份验证(而非仅Windows身份验证)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:07:47