使用您的主机网络作为容器的网络--net=host
或者在 docker-compose 中通过network_mode: host
是一种选择,但这会带来不必要的副作用,即 (a) 您现在公开主机系统中的容器端口,以及 (b) 您无法再连接到那些未映射到主机网络的容器。
在您的情况下,一个快速、更干净的解决方案是让您的 ssh 隧道“可用”到您的 docker 容器(例如,通过将 ssh 绑定到docker0
桥),而不是在主机环境中公开 docker 容器(如已接受的答案中所建议的)。
设置隧道:
为此,请检索您的 IPdocker0
桥接器正在使用via:
ifconfig
你会看到这样的东西:
docker0 Link encap:Ethernet HWaddr 03:41:4a:26:b7:31
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
现在你需要告诉 ssh绑定到这个ip https://man.openbsd.org/ssh通过监听指向端口 9000 的流量
ssh -L 172.17.0.1:9000:host-ip:9999
无需设置绑定地址, :9000
would only https://superuser.com/a/591963/382981可用于主机的环回接口,但本身不可用于 docker 容器。
旁注:您还可以将隧道绑定到0.0.0.0
,这将使 ssh 监听所有接口。
设置您的应用程序:
在您的容器化应用程序中使用相同的docker0
连接服务器的ip:172.17.0.1:9000
。现在流量正在通过您的路由docker0
网桥也将到达您的 ssh 隧道:)
例如,如果您有一个“DOT.NET Core”应用程序需要连接到位于:9000
,你的“ConnectionString”将包含"server=172.17.0.1,9000;
.
转发多个连接:
当处理多个传出连接时(例如,docker 容器需要通过隧道连接到多个远程数据库),存在几种有效的技术,但一种简单直接的方法是简单地创建多个隧道,监听到达不同端口的流量。docker0
桥接端口。
在您的 ssh 隧道命令中(ssh -L [bind_address:]port:host:hostport] [user@]hostname
), the port
的一部分bind_address
不必匹配hostport
of the host
因此,您可以自由选择。因此,在您的 docker 容器中,只需将流量引导到您的不同端口docker0
桥接,然后创建几个 ssh 隧道命令(每个您正在侦听的端口一个),拦截这些端口上的数据,然后将其转发到不同的端口host
s and hostport
您的选择。