Ubuntu 18.04下Docker容器连接宿主机本地MS SQL Server失败怎么办?
Ubuntu 平台的Docker服务默认没有内置host.docker.internal域名的解析规则,这是Windows/macOS版Docker的专属特性,这是你首次启动报错的核心原因。
方案1:使用默认桥接网络(推荐,网络隔离性更好)
- 第一步:调整容器启动命令,手动添加宿主机域名映射,修改后的启动命令如下:
docker run -d -p 228:80/tcp --add-host=host.docker.internal:host-gateway myrepos/myproject
这个参数会自动把host.docker.internal解析到Docker网桥对应的宿主机IP,不需要修改现有连接字符串。
- 第二步:确认SQL Server监听配置
检查SQL Server的TCP/IP监听地址,确保不是仅绑定127.0.0.1,需要修改为绑定0.0.0.0或者包含Docker网桥网段(默认是172.17.0.0/16),修改后重启SQL Server服务生效。 - 第三步:放行防火墙端口
执行以下命令开放1433端口的访问权限:
ufw allow 1433/tcp
如果需要更严格的规则,可以只放行Docker网段:
ufw allow in from 172.17.0.0/16 to any port 1433
方案2:使用host网络模式
如果你坚持使用--network=host参数启动容器,按以下步骤检查:
- 连接字符串调整为:
Server=127.0.0.1,1433;User ID=SA;Password=mypass;Database=mydb - 确认SQL Server已开启远程连接权限:登录SQL Server后进入服务器属性,在「连接」选项卡下勾选「允许远程连接到此服务器」,重启服务生效。
- 确认SQL Server的TCP端口固定为1433:SQL Server Express默认会启用动态端口,需要在SQL Server配置管理器的TCP/IP属性中,把IPAll分类下的「TCP动态端口」留空,「TCP端口」填1433,重启后生效。
网络连通性验证
配置完成后可以先通过工具验证网络是否通畅,避免反复重启应用排查:
- 先在宿主机执行以下命令,确认SQL Server端口正常监听:
nc -zv 127.0.0.1 1433
- 再启动临时容器验证容器到宿主机的网络连通性:
# 桥接网络场景验证 docker run --rm --add-host=host.docker.internal:host-gateway alpine sh -c "apk add --no-cache netcat-openbsd && nc -zv host.docker.internal 1433" # host网络场景验证 docker run --rm --network=host alpine sh -c "apk add --no-cache netcat-openbsd && nc -zv 127.0.0.1 1433"
如果验证命令返回连接成功,说明网络层面没有问题,此时再排查连接字符串的账号、密码、数据库名是否配置正确即可。
内容的提问来源于stack exchange,提问作者Иван Брайко
相关产品推荐
相关产品推荐

