Docker容器跨主机通信之:直接路由方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器跨主机通信之:直接路由方式相关的知识,希望对你有一定的参考价值。

参考技术A

就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要。再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题。本文就来尝试一下。

如下图所示,我们有两个物理主机1和主机2,我们在各自宿主机上启动一个centos容器,启动成功之后,两个容器分别运行在两个宿主机之上,默认的IP地址分配如图所示,这也是Docker自身默认的网络。

此时两台主机上的Docker容器如何直接通过IP地址进行通信?

一种直接想到的方案便是通过分别在各自主机中 添加路由 来实现两个centos容器之间的直接通信。我们来试试吧

由于使用容器的IP进行路由,就需要避免不同主机上的容器使用了相同的IP,为此我们应该为不同的主机分配不同的子网来保证。于是我们构造一下两个容器之间通信的路由方案,如下图所示。

各项配置如下:

这样配置之后,两个主机上的Docker容器就肯定不会使用相同的IP地址从而避免了IP冲突。

我们接下来 定义两条路由规则 即可:

综上所述,数据包在两个容器间的传递过程如下:

我们心里方案想的是这样,接下来实践一下看看是否可行。

编辑主机1上的 /etc/docker/daemon.json 文件,添加内容: "bip" : "ip/netmask"

编辑主机2上的 /etc/docker/daemon.json 文件,添加内容: "bip" : "ip/netmask"

主机1和主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效

主机1上添加路由规则如下:

主机2上添加路由规则如下:

主机1上添加如下规则:

主机2上添加如下规则:

主机1上启动centos容器:

主机2上启动centos容器:

好了,现在两容器可以互ping了

docker实现跨主机通信(使用静态路由方式)

背景

为了合理分配资源,需要将多个服务器的docker容器里面的网络实现互通,如a服务器的docker中启动了服务a,b服务器的docker容器中的b服务需要调用a服务里面的接口。同时要保证不占用宿主机端口,就有了跨主机容器网络互通的需求。

准备

虚拟机a

ip: 192.168.101.150

虚拟机b

ip: 192.168.101.170

docker网卡初始化

分别对两台服务器中的docker创建网卡,分配ip地址范围为 10.20.0.0/16 10.21.0.0/16
虚拟机a

docker network create test --driver bridge --ipam-driver default --subnet 10.20.0.0/16

虚拟机b

docker network create test --driver bridge --ipam-driver default --subnet 10.21.0.0/16

设置静态路由

分别对虚拟机a,虚拟机b设置静态路由,实现虚拟机a可以直接访问虚拟机b的docker test网卡里面的容器,虚拟机b可以直接访问虚拟机a的docker test网卡里面的容器
虚拟机a

route add -net 10.21.0.0 netmask 255.255.0.0 gw 192.168.101.150
#开启路由转发
iptables -P FORWARD ACCEPT

虚拟机b

route add -net 10.20.0.0 netmask 255.255.0.0 gw 192.168.101.170
#开启路由转发
iptables -P FORWARD ACCEPT

测试网络互通

虚拟机a

虚拟机a启动nginx容器

docker run --name nginx --net=test -d nginx:alpine
docker exec -ti nginx sh

ip如下

虚拟机b

虚拟机b启动nginx容器

docker run --name nginx --net=test -d nginx:alpine
docker exec -ti nginx sh

ip如下

测试网络

虚拟机a-容器

ping虚拟机b的宿主机ip

ping虚拟机b的docker容器中nginx的ip

curl虚拟机b的docker容器中nginx

ping同虚拟机的docker容器中其他容器的ip

虚拟机b-容器

ping虚拟机a的宿主机ip

ping虚拟机a的docker容器中nginx的ip

curl虚拟机a的docker容器中nginx

清除测试数据

删除路由配置

服务器a

route del -net 10.21.0.0 netmask 255.255.0.0 gw 192.168.101.150

服务器b

route del -net 10.20.0.0 netmask 255.255.0.0 gw 192.168.101.170

删除docker网卡

服务器a

# 停掉启动的容器
docker rm -f nginx 
docker rm -f nginx1
docker network rm test

服务器b

docker rm -f nginx 
docker network rm test

写在后面

通过以上场景,就可以实现我们的局域网内的docker容器网络互通。如我们实现docker的cnm规范,然后将路由映射管理起来,则可以实现docker集群化,资源合理使用

以上是关于Docker容器跨主机通信之:直接路由方式的主要内容,如果未能解决你的问题,请参考以下文章

docker实现跨主机通信(使用静态路由方式)

docker之docker容器flannel模式多网段跨主机通信

基于路由转发+iptables方式实现docker容器跨节点通信

Docker容器跨主机通信之:OVS+GRE

Docker:跨主机容器间通信之overlay [十五]

docker之docker容器flannel模式多网段跨主机通信所遇问题集