据我了解,docker 在桥接接口 docker0 上运行具有自己的 IP 和完全开放端口的容器。
假设我启动了一个容器,它有自己的 IP:172.17.0.11,并且我有一个虚拟以太网接口 eth0.1,其公共 IP 为 93.xxx
我如何将 eth0.1 转发到 docker 容器,以便我可以通过 eth0.1 IP 访问该容器?
我可以一次转发所有端口吗?(也许使用脚本)
如何禁用 docker 默认行为,以便每个容器仅在 docker0 接口上获取一个 IP,然后我手动设置转发?
@Xavierlucas
我将其链接起来是因为我认为那里解释得更好。如果您检查 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
这样我就有了一个虚拟接口 (eth0:0),它有一个由我的提供商转发的公共 IP。我认为路由是由提供商完成的,因为我的服务器上没有其他路由或配置
笔记:
有一个后续问题
答案1
首先,您不会想一次性转发所有端口,因为这样您就不一定能访问主机了。这绝对应该是一个手动过程。
我希望您在 Docker 容器中运行一个 Web 服务,因此如果您希望转发,例如将端口 80 从您的 eth0.1 IP 地址转发到 Docker 容器的 IP 地址,您可以使用以下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
然后可以根据需要针对任何其他端口/docker 容器修改这些规则。
答案2
好的,所以我将在这里提出另一个答案,因为我现在明白您指的不是虚拟接口而是 IP 别名。
首先,如果您不必转发所有端口,而只需使用一个端口(显然您需要在 dockerfile 中公开该端口):
docker run -d -p 93.x.x.x:hostPort:containerPort registry/image
在另一种情况下,如果你不使用此 IP 别名进行任何其他操作,除了与你的容器和网络的其余部分进行通信,你可以看看我的一个小项目:docker-flatip并将此 IP 直接分配给从容器插入到专用于平面容器的第二个网桥的虚拟以太网链路。
我在面对一个有点特殊的用例时写了这篇文章。请记住,这是 Docker 容器的边界,如果可以的话,最好找到一个解决方案,以便不将特定的 IP 地址绑定到容器以实现编排和可扩展性。
这样做的主要目的是能够像访问网络上的任何其他主机一样访问容器,并且更易于设置 iptables 规则。在我的案例中,需要部署一堆来自商业解决方案的负载生成代理,这些代理具有特定的 iptables 规则,每个代理都需要一个公共 IP,并且无法自动发现。它在运行容器后/停止容器前充当包装器,因此可以轻松添加/删除 iptables 规则。
使用这个小工具,你最终会像这样启动你的容器(如果你是真的确定要转发所有端口,但不鼓励根本):
cid=$(docker run -d registry/image)
或者
docker start $cid
然后 :
docker-flatip add $cid 93.x.x.x/32 -i tcp:all,udp:all
像这样停止它:
docker-flatip del $cid
docker stop $cid