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