vlambda博客
学习文章列表

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




现在提到容器,可能很容易想到的就是Kubernates,确实它很火,也很强大,但是对于规模非常小,容器不多的小环境,Kubernetes 就显得比较累赘了,直接使用Docker Compose拉取一个小环境,这种使用方式,也有不少用户在使用;本篇通过实战,来介绍两种,在不使用类似Kubernetes容器管理平台的下,实现跨主机Docker容器之间互通的方法;

基础环境准备

安装Docker

在能访问公网且DNS正常的情况下,将下面的代码,直接复制并在docker-host-01,docker-host-02上执行,即可完成Docker安装。

#卸载原有docker环境及依赖,并安装必要的包
yum remove docker-latest-logrotate docker-logrotate docker-selinux docker-engine
yum install -y yum-utils   device-mapper-persistent-data   lvm2

#使用阿里云安装源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
rpm --import http://mirrors.aliyun.com/docker-ce/linux/centos/gpg
yum makecache fast
yum -y install docker-ce

#安装完成启动Docker
systemctl start docker
systemctl enable docker
systemctl status docker

下载演示镜像

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

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

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

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

[root@docker-host-01 ~]# docker images
REPOSITORY         TAG                 IMAGE ID           CREATED             SIZE
centos             latest             470671670cac        3 days ago         237MB

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

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


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

主机配置及IP信息

基础环境需要准备两台主机,系统可以是CentOS,Ubuntu;需要能支持安装Docker,本实战文档中使用的主机信息如下;

主机名 IP 配置 容器网段
docker-host-01 192.168.61.132 2核4G内存,50G硬盘 172.16.200.0/24
docker-host-02 192.168.61.135 2核4G内存,50G硬盘 172.16.201.0/24

调整Docker网络配置

在docker-host-01中创建/etc/docker/daemon.json文件,内容如下

[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容器

在docker-host-01中执行下面命令创建容器并查看IP和网关信息。

[root@docker-host-01 ~]# docker run --name host-01-docker -it centos /bin/bash
[root@6cb01044fda8 /]# yum 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 centos /bin/bash
[root@f52ed4088844 /]# yum 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 肯定是不通的。

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

添加互通路由

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

在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 ~]# route add -net 172.16.201.0/24 gw 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 ~]# route add -net 172.16.200.0/24 gw 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

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

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

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

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

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

主机配置及IP信息

基础环境需要准备两台主机,系统可以是CentOS,Ubuntu;需要能支持安装Docker,本实战文档中使用的主机信息如下;

主机名 IP 配置 容器网段
docker-host-01 192.168.61.132 2核4G内存,50G硬盘 192.168.61.64/27
docker-host-02 192.168.61.135 2核4G内存,50G硬盘 192.168.61.96/27

调整Docker宿主机网桥

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

 "bip": "192.168.61.132/24",
 "fixed-cidr": "192.168.61.64/27",
 "default-gateway": "192.168.61.1"
}

重启docker服务,重启完成后,192.168.61.132已经被配置到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.61.132 netmask 255.255.255.0 broadcast 192.168.61.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 ,注意必须两条命令一起执行,否则会断网。

[root@docker-host-01 ~]# brctl addif docker0 ens33&&ifconfig ens33 0.0.0.0

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

检查网桥信息

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

在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.61.135/24",
   "fixed-cidr": "192.168.61.96/27",
   "default-gateway": "192.168.61.1"
}

创建并进入Docker容器

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

[root@docker-host-01 ~]# docker run -it centos /bin/bash
[root@811f01405906 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  link/ether 02:42:c0:a8:3d:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  inet 192.168.61.64/24 brd 192.168.61.255 scope global eth0
      valid_lft forever preferred_lft forever

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

[root@docker-host-02 ~]# docker run -it centos /bin/bash
[root@7940a9efcf6a /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  link/ether 02:42:c0:a8:3d:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  inet 192.168.61.96/24 brd 192.168.61.255 scope global eth0
      valid_lft forever preferred_lft forever

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

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

总结

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



↓↓ 点击"阅读原文" 【加入云技术社区】

相关阅读:



更多文章请关注


文章好看点这里[在看]👇