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

