这是我一段时间以来一直在尝试解决的问题。我尝试了尽可能多的资源,但对我没有任何帮助。:/
我正在尝试解决的问题如下:
我希望能够部署 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)主机但通过它路由的数据包。FORWARD
filter
然后,需要为 LAN 路由器配置静态路由,以便 Docker 网络通过充当网关的 Docker 主机进行路由。路由器可以利用此信息做三件事:
向发往容器的流量发送 ICMP REDIRECT 数据包。
在 DHCP 租约中分发静态路由(选项 121)
通过 Docker 主机路由数据包,但这会导致路由不对称:客户端 → 路由器 → 主机 → 容器,而响应将转到容器 → 主机 → 客户端。
对我来说,这两个似乎都不是一个真正有吸引力的选择。