将 docker 网络暴露给本地网络

将 docker 网络暴露给本地网络

这是我一段时间以来一直在尝试解决的问题。我尝试了尽可能多的资源,但对我没有任何帮助。:/

我正在尝试解决的问题如下:
我希望能够部署 Docker 容器并从位于同一本地网络中的计算机访问它们。这意味着 Docker 分发给容器的 IP 地址必须可以从与托管 Docker 的计算机位于同一 LAN 上的客户端计算机访问。

理想情况下,人们只需添加一条指向 Docker 主机的路由作为 Docker 网络的网关,例如:

client@lan$ sudo route add -net <docker-network>/<mask> gw <docker-host>

好了,他们只需输入 IP 即可访问容器。当然,此路由也可以从路由器设置。

我已经看到网络桥可以帮助做到这一点,但我无法让它以这种方式工作。

如何让这一切发挥作用?

答案1

如果您想要做的只是确保 Docker 容器中的应用程序可以被网络上的其他主机访问,那么最简单的方法是将 Docker 网络模式设置为主机:

docker run --net=host image/toRun:1.0

这将在主机的 IP 地址上公开图像中的端口(确保避免端口冲突)

答案2

只要您在 Docker 主机上启用 IPv4 转发,就可以在客户端上添加通过主机到达容器的路由:

sysctl -w net.ipv4.ip_forward=1

但是请注意安全隐患,因为如果没有适当的防火墙,这会将流量从任何接口路由到任何接口。

答案3

如果您将DOCKER-USER链配置为接受从“非桥接适配器”到“桥接适配器”的流量,则此方法有效,可选地限制为协议和端口,如 tcp 端口 80( )。此链从表中的链-p tcp --dport 80调用,它控制不是发往(Docker)主机但通过它路由的数据包。FORWARDfilter

然后,需要为 LAN 路由器配置静态路由,以便 Docker 网络通过充当网关的 Docker 主机进行路由。路由器可以利用此信息做三件事:

  • 向发往容器的流量发送 ICMP REDIRECT 数据包。

  • 在 DHCP 租约中分发静态路由(选项 121)

  • 通过 Docker 主机路由数据包,但这会导致路由不对称:客户端 → 路由器 → 主机 → 容器,而响应将转到容器 → 主机 → 客户端。

对我来说,这两个似乎都不是一个真正有吸引力的选择。

相关内容