环境说明描述如下图1所示

docker在阿里云、aws、ESXi上如何跨宿主机互通_第1张图片

图1

node01、node02为阿里云或AWS宿主机,同属1个VPC:172.28.0.0/16。

node01的docker0网段为172.17.0.0/24;

node02的docker0网段为172.18.0.0/24;

实现目标:node01与node02上docker容器实现跨宿主机网络互相访问。

实现步骤:

(1)、在阿里云或AWS安全组添加规则,允许docker0网段访问宿主机,即允许172.17.0.0/24和172.18.0.0/24访问宿主机内网段段(VPC:172.28.0.0/16)。

(2)、在阿里云或AWS路由表中手动添加路由。

阿里云是在控制台-->NAT网关-->路由表 进行操作,将172.17.0.0/16走instance(实例) node01的ens3;将172.18.0.0/16走instance(实例) node02的ens3,如图2所示,添加了node01的docker0,再添加node02的docker0。

docker在阿里云、aws、ESXi上如何跨宿主机互通_第2张图片

图2

aws是在控制台-->服务-->VPC-->路由表,选中对应VPC,在下方的“路由”菜单中点“编辑路由” 进行操作,同理是将172.17.0.0/16走instance(实例) node01的ens3;将172.18.0.0/16走instance(实例) node02的ens3,如图3所示。

docker在阿里云、aws、ESXi上如何跨宿主机互通_第3张图片

图3

需要说明的是,在AWS上除了添加路由,还需要,选中实例,在“操作”-->"联网"-->”更改源目标,检查”,然后点击“禁用”,如图4、图5所示。

docker在阿里云、aws、ESXi上如何跨宿主机互通_第4张图片

图4

docker在阿里云、aws、ESXi上如何跨宿主机互通_第5张图片

图5

(3)、在node01和node02上修改iptables配置,按上述设置后,相同vpc的ECS/EC2只能ping到宿主机的docker0,即docker容器的网关,但还无法访问到具体的容器。

ubuntu 16.04系统使用iptables-save命令保存当前iptables的配置到/etc/network/iptables.up.rules,然后再修改配置如下

# iptables-save > /etc/network/iptables.up.rules

# cat /etc/network/iptables.up.rules
# Generated by iptables-save v1.6.0 on Sat Mar 16 16:47:22 2019
*nat
:PREROUTING ACCEPT [287:18748]
:INPUT ACCEPT [224:13456]
:OUTPUT ACCEPT [362:23448]
:POSTROUTING ACCEPT [362:23448]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
COMMIT
# Completed on Sat Mar 16 16:47:22 2019
# Generated by iptables-save v1.6.0 on Sat Mar 16 16:47:22 2019
*filter
:INPUT ACCEPT [7991:829858]
:FORWARD ACCEPT [63:5292]
:OUTPUT ACCEPT [7823:884204]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Sat Mar 16 16:47:22 2019


最后保存使用iptables-apply使配置生效

# iptables-apply 

或者

# iptables-restore /etc/network/iptables.up.rules

如果是Centos7.x系统,一般使用service命令(前提要先安装initscripts)保存当前iptables配置,然后再修改配置,注意保存的路径以及文件名是与ubuntu有差别的。


# service iptables save

iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

修改完iptables配置后使用service或systemctl重启使配置生效

# service iptables restart

或者

# systemctl restart iptables

完成上述配置后,在阿里云或者AWS不同宿主机间的docker容器就可以互通了。而在Esxi上我们仅需要在vSwitch0的属性中将“混杂模式”设置为“接受”即可,如图6、图7所示。

docker在阿里云、aws、ESXi上如何跨宿主机互通_第6张图片

图6

docker在阿里云、aws、ESXi上如何跨宿主机互通_第7张图片

图7