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

Docker环境下Django无法连接第二个SQL Server数据库(超时错误)

Django Docker容器内无法连接第二个SQL Server数据库的问题

我的Django应用在Docker外部运行正常,能连接两台不同服务器上的两个SQL Server数据库;但在Docker内部,无法连接第二个数据库,出现超时错误。以下是相关配置代码:

settings.py

DATABASES = { 
    'default': {
        'ENGINE'  : config('DB_ENGINE'), 
        'NAME'    : config('DB_DEFAULT_NAME'),
        'USER'    : config('DB_DEFAULT_USERNAME'),
        'PASSWORD': config('DB_DEFAULT_PASS'),
        'HOST'    : config('DB_HOST_DEFAULT'),
        'PORT'    : '',
        'OPTIONS': {
                    'driver': config('DATABASE_DRIVER'),
                },
        },
    'otherbd': {
        'ENGINE'  : 'mssql', 
        'NAME'    : 'serverbd',
        'USER'    : 'user',
        'PASSWORD': 'pw',
        'HOST'    : '192.168.1.165',
        'PORT'    : '63649',
        'OPTIONS': {
                    'driver': 'ODBC Driver 17 for SQL Server',
                },
        },  
}

views.py

def ordens_e_ensaques(request):
    try:
        second_db = connections['otherbd']
        cursor = second_db.cursor()

        # 查询获取订单
        cursor.execute("SELECT * FROM Ordens WHERE ORD_Estado = '1'")
        print('订单SQL查询执行成功!')
        resultados_ordens = cursor.fetchall()

        # 查询获取包装单
        cursor.execute("SELECT * FROM OrdensEnsaqueActivas")
        print('包装单SQL查询执行成功!')
        resultados_ensaques = cursor.fetchall()

        context = {
            'resultados_ordens': resultados_ordens,
            'resultados_ensaques': resultados_ensaques
        }
        return render(request, 'pages/producoes.html', context)
    except Exception as e:
        print("连接数据库错误: ", e)
        return HttpResponse("连接数据库错误: " + str(e))

排查与解决方法

  • 检查Docker网络配置
    Docker默认桥接网络可能无法直接访问局域网内的192.168.1.165,可尝试:

    • 启动容器时添加--network=host参数,让容器共享宿主机网络,直接访问目标数据库服务器。
    • 确认Docker桥接子网与数据库网段互通,同时检查宿主机防火墙是否允许容器IP访问数据库的63649端口。
  • 验证数据库服务器防火墙与SQL Server配置
    确保192.168.1.165服务器的防火墙允许Docker容器所在IP段访问63649端口;同时在SQL Server配置管理器中,确认TCP/IP协议已启用,且监听端口设置为63649。

  • 确保容器内安装了ODBC驱动
    配置中指定的ODBC Driver 17 for SQL Server可能未在Docker镜像中安装,需在Dockerfile中添加安装步骤(以Debian/Ubuntu基础镜像为例):

    RUN apt-get update && apt-get install -y \
        curl apt-transport-https gnupg \
        && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
        && curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
        && apt-get update \
        && ACCEPT_EULA=Y apt-get install -y msodbcsql17
    
  • 测试容器内网络连通性
    进入容器执行以下命令,验证是否能连接目标数据库:

    # 测试IP可达性
    ping 192.168.1.165
    # 测试端口是否开放
    telnet 192.168.1.165 63649
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:12:44