将一个 IP 转发到 docker 容器

Mas*_*one 4 networking iptables docker

据我了解,docker 在桥接接口 docker0 上使用自己的 IP 和完全开放的端口运行容器。

假设我启动了一个容器,它有自己的 IP:172.17.0.11,我有一个虚拟以太网接口 eth0.1,公共 IP 为 93.xxx

如何将 eth0.1 转发到 docker 容器,以便我可以通过 eth0.1 IP 访问容器?

我可以一次转发所有端口吗?(也许有脚本)

如何禁用 docker 默认行为,以便每个容器仅在 docker0 接口上获得一个 IP,并且我手动设置转发?

@泽维尔卢卡斯

我链接它是因为我认为那里的解释更好。如果您检查 debian 配置,我会在 /etc/net/interfaces 文件中添加以下内容:

post-up /sbin/ifconfig eth0:X IP.OF.FAIL.OVER netmask 255.255.255.255 broadcast IP.OF.FAIL.OVER
post-down /sbin/ifconfig eth0:X down
Run Code Online (Sandbox Code Playgroud)

这样我就有了一个虚拟接口 (eth0:0),它有一个由我的提供商转发的公共 IP。我认为路由是由提供商完成的,因为我的服务器上没有其他路由或配置

笔记:

有一个后续问题

为什么端口转发在此设置中不起作用?

小智 7

首先,您不想一次转发所有端口,因为这样您就不一定仍然可以访问主机。这绝对应该是一个手动过程。

我希望您在 Docker 容器中运行一个 Web 服务,因此如果您希望转发,例如从 eth0.1 IP 地址到 Docker 容器的 IP 地址的端口 80,您可以使用以下iptables规则;

iptables -A PREROUTING -t nat -i eth0.1 -p tcp --dport 80 -j DNAT --to 172.17.0.11:80
iptables -A FORWARD -p tcp -d 172.17.0.11 --dport 80 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

然后可以根据需要为任何其他端口/docker 容器修改这些规则。


Xav*_*cas 6

好的,所以我将在这里抛出一个替代答案,因为我现在明白您不是指虚拟接口而是 IP 别名。

首先,如果您不必转发所有端口而只需使用一个(您显然需要在 dockerfile 中公开端口):

docker run -d -p 93.x.x.x:hostPort:containerPort registry/image
Run Code Online (Sandbox Code Playgroud)

在另一种情况下,如果您不将此 IP 别名用于与您的容器与网络的其余部分通信之外的任何其他用途,您可以查看我的适度项目:docker-flatip并直接将此 IP 分配给从容器插入到专用于扁平容器的第二个网桥的虚拟以太网链接。

我在面对一个有点特殊的用例时写了它。请记住,这是 docker 容器的边界,如果可以,最好找到一个解决方案,以便不将特定 IP 地址绑定到容器以用于编排和可扩展性目的。

这样做的要点是能够访问容器,因为它是网络上的任何其他主机,并且具有更简单的 iptables 规则设置。在我的情况下,有必要从具有特定 iptables 规则的商业解决方案中部署一堆负载生成代理,其中每个代理都需要一个公共 IP 并且无法自动发现。它在运行/停止容器之前充当包装器,因此可以轻松添加/删除 iptables 规则。

有了这个小工具,你最终会启动你的容器像这样(如果你真的确定要转发的所有端口,不鼓励在所有):

cid=$(docker run -d registry/image)
Run Code Online (Sandbox Code Playgroud)

或者

docker start $cid
Run Code Online (Sandbox Code Playgroud)

然后 :

docker-flatip add $cid 93.x.x.x/32 -i tcp:all,udp:all
Run Code Online (Sandbox Code Playgroud)

并像这样停止它:

docker-flatip del $cid

docker stop $cid
Run Code Online (Sandbox Code Playgroud)