pyodbc连接Docker中运行的SQL Server 2019报服务器不可访问错误
问题排查与修复方案
核心错误点
- 连接字符串的
Server参数填写错误:你填的cbbcb967dacb是Docker分配的容器内部ID,仅容器内部网络可解析,宿主机直接访问无法识别该地址,这是触发「服务器不可访问、命名管道连接失败」报错的核心原因。 - 连接字符串存在语法错误与参数冲突:
PWD=Password末尾漏写分号,直接拼接了Trusted_Connection=yes;该参数代表启用Windows系统身份验证,Docker运行的Linux版SQL Server不支持该认证方式,开启后会强制走本地命名管道查找实例,必然连接失败。 - ODBC Driver 18默认强制TLS加密,本地测试环境的自签名证书不受信任,未加跳过证书校验的参数会导致连接阻断。
- 代码中存在无效语句:无参数调用
connector.execute()本身就会抛出运行错误,该行属于冗余代码需删除。 - 更换为ODBC Driver 17时报错的原因是本地未安装对应版本驱动,无需更换驱动,使用已安装的18版本即可。
注:容器终端内可正常执行查询是因为操作发生在容器内部,通过本地套接字直接连数据库,不需要走宿主机到容器的网络链路,和你在宿主机跑Python脚本的网络场景完全不同,不代表连接参数配置正确。
前置检查
先确认容器端口映射配置正确,本地终端执行以下命令查看容器状态:
docker ps
找到对应SQL Server容器,确认PORTS列存在0.0.0.0:1433->1433/tcp的映射规则。如果没有该映射,删除现有容器后重新创建,启动命令必须加端口映射参数:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=你的符合复杂度要求的sa密码" -p 1433:1433 --name mssql2019 -d mcr.microsoft.com/mssql/server:2019-latest
注意:sa密码长度至少8位,需同时包含大小写字母、数字、特殊符号,否则容器会异常退出。
修正后的可运行代码
import pyodbc conn_str = ( "Driver={ODBC Driver 18 for SQL Server};" "Server=localhost,1433;" # 宿主机访问映射端口用localhost+端口即可 "Database=testdb;" "UID=sa;" "PWD=你设置的sa密码;" "TrustServerCertificate=yes;" # 跳过本地自签名证书校验 ) connector = pyodbc.connect(conn_str) cursor = connector.cursor() cursor.execute("SELECT * FROM inventory") for row in cursor: print(row) # 释放资源 cursor.close() connector.close()
常见踩坑提醒
- 不要将容器ID、容器内部主机名作为宿主机访问的服务地址,默认Docker桥接网络下,宿主机访问容器服务必须通过
-p参数映射到宿主机的端口,使用localhost或127.0.0.1访问。 - 非Windows环境连接SQL Server不要添加
Trusted_Connection=yes参数,该参数仅支持Windows平台的系统身份认证,和SQL账号密码认证互斥。 - 连接字符串的每个键值对末尾必须加分号分隔,漏写分号会导致参数解析错乱。
- 报「数据源名找不到、无默认驱动」错误时,直接安装对应名称的ODBC驱动即可,本地安装了哪个版本就用对应版本的驱动名,不要随意切换。
内容的提问来源于stack exchange,提问作者user18495643
相关产品推荐
相关产品推荐

