Docker容器内如何利用主机SSH转发访问MS SQL Server?
我太懂你现在的头疼点了:主机上的SSH隧道已经把MS SQL的1433端口转发到本地127.0.0.1,本地用SquirrelSQL能正常连,但容器里死活访问不通——核心问题其实是容器里的127.0.0.1指向的是容器自身的回环接口,不是主机的。你之前用--expose 1433 -p 127.0.0.1:1433:1433其实搞反了方向,那是把容器的1433端口映射到主机,完全不是你要的效果。下面给你几个靠谱的解决办法:
方法一:用主机的Docker网关IP访问
Ubuntu主机上,Docker默认会创建一个内部网关(通常是172.17.0.1,你可以用ip addr show docker0命令确认这个地址)。在容器里直接用这个IP代替127.0.0.1连接MS SQL就行,比如:
sqlcmd -S 172.17.0.1,1433 -U your_username -P your_password
这个方法简单直接,因为172.17.0.1是容器和主机之间的默认通信入口,容器能直接访问到主机的这个接口。
方法二:修改SSH隧道的绑定地址
你现在的SSH隧道是绑定到主机的127.0.0.1,只有主机本地能访问。可以把隧道改成绑定到0.0.0.0,让整个Docker内部网络都能访问:
ssh -L 0.0.0.0:1433:mssql-server-ip:1433 your-ssh-user@ssh-server-host
之后在容器里用主机的网关IP或者局域网IP连接1433端口即可。注意:绑定0.0.0.0会让端口暴露给整个网络,公共环境下要做好防火墙限制。
方法三:用Docker的host网络模式启动容器
启动容器时加上--network host参数,容器会直接复用主机的网络栈,此时容器里的127.0.0.1就和主机的127.0.0.1完全一致了:
docker run --network host -d your-container-image
这个方法最省事,但缺点是容器会失去网络隔离性,容器内的端口会直接暴露在主机网络上,适合测试或信任的内部环境。
方法四:自定义网络+主机别名(推荐生产环境)
创建一个自定义Docker网络,然后启动容器时用--add-host host.docker.internal:host-gateway参数,在容器里就能用host.docker.internal直接访问主机:
# 创建自定义网络 docker network create my-mssql-network # 启动容器并绑定主机别名 docker run --network my-mssql-network --add-host host.docker.internal:host-gateway -d your-container-image
之后在容器里连接MS SQL时用host.docker.internal:1433即可。这个方法既保留了容器的网络隔离性,又能方便访问主机资源,Docker 20.10+版本都支持host-gateway参数。
试试上面的方法,应该能顺利解决你的问题。
内容的提问来源于stack exchange,提问作者R. Suarez

