docker 实践十一:docker 跨主机通讯

在上一篇了解了关于 docker 的网络模型后,本篇就基于上一篇的基础来实现 docker 的跨主机通信。

注:环境为 CentOS7,docker 19.03。

本篇会尝试使用几种不同的方式来实现跨主机方式,在这之前我们需要先准备好实验相关的环境。

环境准备

准备两台或以上的主机或者虚拟机,相关环境如下:

  • 主机1:配置两张网卡 ens33 192.168.10.10,ens37(不需要IP),docker环境
  • 主机2:配置两张网卡 ens33 192.168.10.11,ens37(不需要IP),docker环境

桥接方式

网络拓扑图如图

ens33 作为外部网卡,使 docker 容器可以和外部通信,ens37 作为内部网卡,和 docker0 桥接(所以不需要IP)让不同的主机间的容器可以相互通信。配置如下:

主机1上的配置

1.修改 docker 的启动参数文件 /etc/docker/daemon.json 并重启 docker daemon

# vim /etc/docker/daemon.json 
{
  "bip": "172.17.0.1/16",
  "fixed-cidr": "172.17.18.1/24"
}
# systemctl restart docker

2.将 ehs33 网卡接入到 docker0 网桥中

# brctl addif docker0 ens37

3.添加容器con1

# docker run -it --rm --name con1 buysbox sh

主机2上的配置

1.修改 docker 的启动参数文件 /etc/docker/daemon.json 并重启 docker daemon

# vim /etc/docker/daemon.json 
{
  "bip": "172.17.0.2/16",
  "fixed-cidr": "172.17.19.1/24"
}
# systemctl restart docker

2.将 ehs33 网卡接入到 docker0 网桥中

# brctl addif docker0 ens37

3.添加容器con2

# docker run -it --rm --name con1 busybox sh

这时容器 con1 和 con2 既能彼此通信,也可以访问外部IP。
容器con1向容器con2发送数据的过程是这样的:首先,通过查看本身的路由表发现目的地址和自己处于同一网段,那么就不需要将数据发往网关,可以直接发给con2,con1通过ARP广播获取到con2的MAC地址;然后,构造以太网帧发往con2即可。此过程数据中docker0网桥充当普通的交换机转发数据帧。

直接路由

直接路由方式是通过在主机中添加静态路由实现。例如有两台主机host1和host2,两主机上的Docker容器是独立的二层网络,将con1发往con2的数据流先转发到主机host2上,再由host2转发到其上的Docker容器中,反之亦然。

注:这个实现失败!!!

直接路由的网络拓扑图如下:

host1上

1.配置 docker0 ip

# vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"],
  "bip": "172.17.1.254/24"
}
# systemctl restart docker

2.添加路由,将目的地址为172.17.2.0/24的包转发到host2

# route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.10.11

3.配置iptables规则

# iptables -t nat -F POSTROUTING
# iptables -t nat -A POSTROUTING s 172.17.1.0/24 ! -d 172.17.0.0/16 -j MASQUERADE

4.打开端口转发

# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

5.启动容器con1

# docker run -it --name --rm --name con1 busybox sh

host2上

# vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"],
  "bip": "172.17.2.254/24"
}
# systemctl restart docker

2.添加路由,将目的地址为172.17.1.0/24的包转发到host1

# route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.10.10

3.配置iptables规则

# iptables -t nat -F POSTROUTING
# iptables -t nat -A POSTROUTING s 172.17.2.0/24 ! -d 172.17.0.0/16 -j MASQUERADE

4.打开端口转发

# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

5.启动容器con2

# docker run -it --name --rm --name con2 busybox sh

猜你喜欢

转载自www.cnblogs.com/xingyys/p/11517656.html