实战|两种常用的跨主机Docker容器互通方法

基础环境准备

安装Docker

点击链接安装Docker

下载演示镜像

Docker官方在https://hub.docker.com/中提供了很多镜像,你可以根据自己的需要选择并下载,也可以自行安装Docker镜像仓库,此处我就直接下载使用docker hub中提供的ubuntu官方镜像进行后续演示;

[root@docker-host-01 ~]# docker pull ubuntu

镜像在两台Docker主机中都下载,当然如果网速慢的话,可以下载一个,然后使用docker save 打包镜像,将镜像传到第二台机器上,在用docker load导入镜像。方法很多,适合你的才是最好的。

镜像下载完成,使用docker images命令查看。

[root@docker-host-01 ~]# docker images

1.通过直接路由方式实现跨主机Docker容器通信

img

直接路由这种方式操作起来比较简单,对Docker原生网络改变最小,只需要互相指定对方的路由即可完成跨主机Docker容器之间的互通;

主机配置及IP信息

基础环境需要准备两台主机(可以是两台工控机安装原生ubuntu或者是两台运行在windows下面的虚拟机),系统可以是CentOS,Ubuntu;需要能支持安装Docker,本实战文档中使用的主机信息如下;

主机名IP配置容器网段
docker-host-01192.168.61.13216核32G内存,50G硬盘172.16.200.0/24
docker-host-02192.168.61.13516核32G内存,50G硬盘172.16.201.0/24
调整Docker网络配置

Docker安装完之后,默认会创建一个docker0的网桥,启动的Docker容器网段是172.17.0.1/16,如果不做调整,两台Docker主机上的容器,就可能出现IP地址冲突,所以我们先将默认docker0网桥的地址按【主机配置及IP信息】中规划的进行调整。

在docker-host-01中创建/etc/docker/daemon.json文件(一般来说主机里面会有这个文件,没有的话就自己创建,用root权限创建),内容如下

[root@docker-host-01 ~]# cat /etc/docker/daemon.json
{
  "bip": "172.16.200.1/24"
}

重启docker服务

[root@docker-host-01 ~]# systemctl restart docker

完成重启后,再看docker0的IP,已经调整完成了

[root@docker-host-01 ~]# ifconfig  docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.16.200.1  netmask 255.255.255.0  broadcast 172.16.200.255
        inet6 fe80::42:b3ff:fef9:1cc1  prefixlen 64  scopeid 0x20<link>
        ether 02:42:b3:f9:1c:c1  txqueuelen 0  (Ethernet)
        RX packets 2916  bytes 121276 (118.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3115  bytes 10870567 (10.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

使用同样的方法,调整docker-host-02主机上的的docker网络。

创建并进入Docker容器
[root@docker-host-01 ~]# docker run  --name host-01-docker -it ubuntu /bin/bash
[root@6cb01044fda8 /]# apt update  #更新
[root@6cb01044fda8 /]# apt install -y net-tools  #安装工具查看ip和网关
[root@6cb01044fda8 /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.200.2  netmask 255.255.255.0  broadcast 172.16.200.255
        ether 02:42:ac:10:c8:02  txqueuelen 0  (Ethernet)
        RX packets 3168  bytes 10876332 (10.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2970  bytes 165058 (161.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@6cb01044fda8 /]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.200.1    0.0.0.0         UG    0      0        0 eth0
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

如上,创建了一个名为host-01-docker 的容器,容器的ip是172.16.200.2/24,网关是172.16.200.1;同理在docker-host-02中也执行上述命令;

[root@docker-host-02 ~]# docker run  --name host-02-docker -it ubuntu /bin/bash
[root@f52ed4088844 /]# apt update
[root@f52ed4088844 /]# apt install -y net-tools
[root@f52ed4088844 /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.201.2  netmask 255.255.255.0  broadcast 172.16.201.255
        ether 02:42:ac:10:c9:02  txqueuelen 0  (Ethernet)
        RX packets 3436  bytes 10890638 (10.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3159  bytes 175122 (171.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
[root@f52ed4088844 /]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.201.1    0.0.0.0         UG    0      0        0 eth0
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

host-02-docker容器的ip是172.16.201.2/24,网关是172.16.201.1;此时我们直接在host-01-docker容器里面去ping host-02-docker容器的IP 172.16.201.2 肯定是不通的。

img

添加互通路由

原理非常简单,就是通过互相指定到达对方容器的路由;

同时需要提醒的是,需要把本机的路由转发打开

  • ubuntu的话:

    修改 /etc/sysctl.conf,把ip_forward = 1 的注释去掉即可(把ip_forward = 1前面的#去掉)

  • centos的话:

    修改 /etc/sysctl.d/99-sysctl.conf

    添加net.ipv4.ip_forward = 1,然后试试sysctl -p

    很简单的方式,其实很像flannel网络的Host-Gateway的原理

在docker-host-01主机添加到172.16.201.0/24网段的路由,指向docker-host-02的IP:192.168.61.135;
在docker-host-02主机添加到172.16.200.0/24网段的路由,指向docker-host-01的IP:192.168.61.132;

docker-host-01主机上的操作如下

[root@docker-host-01 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33
[root@docker-host-01 ~]# ip route add 172.16.201.0/24 via 192.168.61.135
[root@docker-host-01 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.16.201.0    192.168.61.135  255.255.255.0   UG    0      0        0 ens33
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33

docker-host-02主机上的操作如下

[root@docker-host-02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33
[root@docker-host-02 ~]# ip route add 172.16.200.0/24 via 192.168.61.132
[root@docker-host-02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
172.16.200.0    192.168.61.132  255.255.255.0   UG    0      0        0 ens33
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33

验证在docker-host-01主机上的Docker容器中,ping docker-host-02中的Docker容器IP:172.16.201.2,发现能ping通

最后,需要注意一点,通过路由打通跨主机Docker容器之间的 网络,必须确保Docker宿主机是在相同的网段;

2.通过桥接到Docker宿主机网络实现跨主机Docker容器通信

img

将Docker容器网络直接桥接到Docker宿主机网络里面,

容器通信过程中不在需要NAT的转换,优点是性能提升,容器及Docker宿主机IP统一管理;缺点是,容器及Docker宿主机IP统一管理之后带来的IP地址分配变复杂了;下面就来实战一下这种场景。

预告:在没进行这个实验之前,分别在电脑里面创建一个容器,创建好之后在两台主机的容器里面分别执行下面的命令

  1. 在容器里面执行下面的命令

    apt update
    apt install net-tools
    apt install iputils-ping
    
  2. 之后可以把这两个容器通过命令关闭

    docker stop 容器id或者容器名字
    
  3. 把两台工控机通过华为交换机进行连接

    • 登录华为交换机

下面的实验是按照链接里面进行设置的,有不一样的地方会进行说明!

主机配置及IP信息

基础环境需要准备两台主机(可以是两台工控机安装原生ubuntu或者是两台运行在windows下面的虚拟机),系统可以是CentOS,Ubuntu;需要能支持安装Docker,本实战文档中使用的主机信息如下;

主机名IP配置容器网段
docker-host-01192.168.3.10016核32G内存,50G硬盘(工控机)192.168.3.50/24
docker-host-02192.168.3.20016核32G内存,50G硬盘(工控机)192.168.3.150/24
调整Docker宿主机网桥

默认情况下docker0,是不与物理接口连接了,Docker宿主机的IP地址也是配置在物理接口上的,现在需要把物理接口添加到docker0网桥中,并把IP地址配置到docker0上;具体操作如下

在docker-host-01上,创建并编辑docker配置文件,bip表示网桥接口的地址,配置为Docker宿主机 IP,fixed-cidr配置的是分配给docker容器的IP地址,这个地方需要注意,每台宿主机上不能重复,否则会IP地址冲突。

[root@docker-host-01 ~]# cat /etc/docker/daemon.json
{

  "bip": "192.168.3.100/24",
  "fixed-cidr": "192.168.3.50/24",
  "default-gateway": "192.168.3.1"
}

重启docker服务,重启完成后,192.168.3.100已经被配置到docker0上了

[root@docker-host-01 ~]# systemctl restart docker
[root@docker-host-01 ~]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.100  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::42:b3ff:fef9:1cc1  prefixlen 64  scopeid 0x20<link>
        ether 02:42:b3:f9:1c:c1  txqueuelen 0  (Ethernet)
        RX packets 6420  bytes 308080 (300.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6373  bytes 21761327 (20.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

将物理接口添加到docker0网桥中,同时清空物理网卡上的IP ,注意必须两条命令一起执行,否则会断网。

# 这个ens33要根据自己的电脑实际的网络接口名称来设置,工控机上面的是ens3f0np0(工控机是双网卡,设置其中一个网卡就行了)
[root@docker-host-01 ~]# brctl addif docker0 ens3f0np0&&ifconfig ens3f0np0 0.0.0.0

**注意:**网桥配置,如果需要永久保存,需要通过配置文件的方式配置

检查网桥信息

[root@docker-host-01 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242b3f91cc1       no              ens3f0np0

在docker-host-02上配置与 docker-host-01上基本一样,只是docker配置文件略有不同,fixed-cidr分配给docker容器的ip段不能与docker-host-01中配置的相同。

[root@docker-host-02 ~]# cat /etc/docker/daemon.json
{
    "bip": "192.168.3.200/24",
    "fixed-cidr": "192.168.3.150/24",
    "default-gateway": "192.168.3.1"
}

注意:

因为本实验要求容器和docker0的ip地址要在同一网段,所以设置起来就有点不一样,当按照上面的设置进行的时候

在docker-host-01主机里

  • 创建好的docker0的ip地址是192.168.3.100,创建好的容器ip是从192.168.3.2开始递增的,就是第一个容器的ip地址是192.168.3.2,第二个是192.168.3.3,,以此类推

在docker-host-02主机里

  • 创建好的docker0的ip地址是192.168.3.200,创建好的容器ip是从192.168.3.2开始递增的,就是第一个容器的ip地址是192.168.3.2,第二个是192.168.3.3,,以此类推

因此要保证两个主机里面的容器IP地址不一样

  • docker-host-01主机里面创建一个容器,IP地址为192.168.3.2
  • docker-host-02主机里面创建两个容器,第一个容器的IP地址是192.168.3.2,第二个是192.168.3.3,创建好了之后,把第一个容器删除,此时就只留下了第二个容器,IP地址为192.168.3.3
  • 这样就保证在docker-host-01和docker-host-02里面容器的IP地址不一样了
  • 但是这里面还有一个问题,在工控机里面创建容器,容器不能联网(我觉得应该是上面把网卡挂到docker0导致的),那这里就用之前创建好的能用ifconfigping命令的容器来进行实验就行。(在实验刚开始时创建好了能进行联网的容器),如果在你的电脑里面进行下面的操作创建容器时,能进行联网,那就直接执行下面的操作。
创建并进入Docker容器

docker-host-01中创建容器并查看容器ip是192.168.3.2

[root@docker-host-01 ~]# docker run -it --name docker_host1 ubuntu /bin/bash
[root@5a6402cc78cb /]# apt update
[root@5a6402cc78cb /]# apt install net-tools
[root@5a6402cc78cb /]# apt install iputils-ping
[root@5a6402cc78cb:/]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500inet 192.168.3.2 netmask 255.255.255.0 broadcast 192.168.3.255ether 02:42:c0:a8:03:02 txqueuelen 0(Ethernet)
RX packets 42 bytes 6448 (6.4 KB)frame 0RX errors 日 dropped @ overruns 0TX packets 12 bytes 896 (896.0 B)TX errors 0 dropped  overruns 0carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 1 bytes 78 (78.0 B)
RX errors 0 dropped o overruns o frame 0
TX packets 1 bytes 78 (78.0 B)TX errors 日dropped 0 overruns o carrter 0collisions 0

docker-host-02中创建容器并查看容器ip是192.168.3.2192.168.3.3

# 创建容器1
[root@docker-host-02 ~]# docker run -it --name docker_host1 ubuntu /bin/bash
[root@docker-host-02 ~]# apt update
[root@docker-host-02 ~]# apt install net-tools
[root@docker-host-02 ~]# apt install iputils-ping
   
# 创建容器2
[root@docker-host-02 ~]# docker run -it --name docker_host2 ubuntu /bin/bash
[rootce8bb2sa2a13:/]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.3.3 netmask 255.255.255.0 broadcast 192.168.3.255ether 02:42:c:a8:03:03 txqueuelen 日(Ethernet)RX packets 93 bytes 15655 (15.6 KB)RX errors 日 dropped 日 overruns 日frame 0TX packets 47 bytes 3150 (3.1 KB)TX errors 日 dropped  overruns 日carrier e collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536tnet 127.0.0.1 netmask 255.0..0loop txqueuelen 100(Local Loopback)RX packets 13 bytes 1342 (1.3 KB)RX errors 0 dropped e overruns 日frame
TX packets 13 bytes 1342 (1.3 KB)
TX errors 0 dropped  overruns 日carrler 0collisions 6

# 把容器1删除
[root@docker-host-02 ~]# docker stop docker_host1
[root@docker-host-02 ~]# docker rm docker_host1

此时在主机2里面只有一个容器,IP地址为,192.168.3.3,这样就可以跟主机1进行ping

  1. 主机1ping主机2

    [root@5a6402cc78cb /]# ping 192.168.3.3
    

    image-20240104104142761

  2. 主机2ping主机1

    [root@C08bb25a2af3 /]# ping 192.168.3.2
    

    image-20240104105002961

  3. 可以看到主机1的容器MAC地址为:02:42:c0:a8:03:02,主机2的容器MAC地址为:02:42:ce:a8:03:03

  4. 接下面看一下华为交换机学习到的MAC地址

    image-20240104105302636

    能看到交换机已经学习到了主机1和主机2的容器MAC地址了。

验证在docker-node-01宿主机的容器IP 192.168.3.2,ping docker-node-02宿主机上的容器IP 192.168.3.3,可以ping通验证没问题。

直接桥接到Docker宿主机网络这种方式,打通不通宿主机上的Docker容器,在IP,网段划分上会比较麻烦,

总结:

路由方式和网桥方式,都可以使跨主机之间的Docker容器互通,操作起来也比较简单;再结合docker-compose,可以非常迅速的拉起一套环境;

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐