我有一台 docker 主机,它有一个物理网络接口(eth0)和使用 IP 别名分配给它的多个 IP 地址(eth0:1、eth0:2、eth0:3)。
我想运行多个 Docker 容器,以便每个容器都使用自己的 IP 地址向互联网发出呼叫。最好在容器之间连接时也可以通过同一个 IP 访问它们。
如何设置 docker 和 iptables 才能使其正常工作?然后我需要使用哪些参数来运行每个容器?
答案1
eth0-> 192.168.0.1
eth0:1-> 192.168.0.2
eth0:2-> 192.168.0.3
eth0:3-> 192.168.0.4
docker run --name=web01 -p 192.168.0.1:80:80 ....
docker run --name=web02 -p 192.168.0.2:80:80 ....
docker run --name=web03 -p 192.168.0.3:80:80 ....
docker run --name=web04 -p 192.168.0.4:80:80 ....
他们将创建 DNAT 规则:
链 DOCKER(2 个引用)pkts 字节目标 prot 选择加入源目标
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.0.1 tcp dpt:80 to:172.17.0.1:80
pkts 字节目标协议选择加入退出源目标
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.0.2 tcp dpt:80 to:172.17.0.2:80
...
产生流量的容器属于以下规则:
链 POSTROUTING(策略接受 430M 数据包,26G 字节)pkts 字节目标 prot opt in out 源目标
0 0 MASQUERADE 全部 -- * !docker0 172.17.0.0/16 0.0.0.0/0
附言
在 Linux 中我们可以使用多个 IP,无需别名
ip aa 192.168.0.1/24 dev eth0
ip aa 192.168.0.2/24 dev eth0 ....
答案2
期望状态
多个 Docker 容器,每个容器都使用来自我们单个网络接口的特定主机 IP,该接口:
- 仅在其主机 IP 上接收流量
- 代表其主机 IP 向互联网发送流量
解决方案
对于(1),我们可以使用docker 端口绑定像这样(这将创建DNAT
用于将流量路由到相关容器的 iptable 规则):
docker run -p 192.168.1.101:80:80
docker run -p 192.168.1.102:80:80
...
对于 (2),我们可以使用SNAT
iptable 规则来更改传出流量的 IP 标头(请参阅此链接更多示例):
iptables -t nat -I POSTROUTING 1 -s 172.18.0.1 -j SNAT --to-source 192.168.1.101
iptables -t nat -I POSTROUTING 1 -s 172.18.0.2 -j SNAT --to-source 192.168.1.102
...
笔记iptables
:请谨慎使用上述命令。另外,请注意这些命令将在POSTROUTING
表链的第一个顺序插入规则nat
。
我尝试总结出目前针对此类问题的解决方案之一。希望它能有所帮助!