容器化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
相关产品推荐
相关产品推荐

