跨主机的两个docker容器通信

avatar 2022年12月8日18:01:48 评论 561 次浏览

容器时代,使用两个容器之间的通信最常用的方式就是通过端口映射的方式,把容器中服务的端口映射到宿主机上的任意端口,然后通过宿主机端口映射的方式实现两个容器之间的通信,但是这样如果容器过多,端口映射是一个麻烦问题,那么有没有方式可以实现容器之间的通信和宿主机之间通信一样,答案是有的,这里简单介绍一下。

环境准备

我这里有两个虚拟机,并且在两个虚拟机上都安装了docker,并且起了容器,这里要实现,两个容器之间可以直接通信。

#虚拟机A,计算机名:wulaoer.org
宿主机ip:10.211.55.14
docker网段: 10.88.0.0
#虚拟机B,计算机名:www.wulaoer.org
宿主机ip:10.211.55.19
docker网段: 172.17.0.0

先创建两个容器,分别在两个虚拟机上,安装方法就不说了,直接下载镜像并启动容器。

#虚拟机A
[root@wulaoer.org ~]# docker pull centos
[root@wulaoer.org ~]# docker images
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY             TAG         IMAGE ID      CREATED        SIZE
quay.io/centos/centos  latest      300e315adb2f  24 months ago  217 MB
[root@wulaoer.org ~]# docker run -itd 300e315adb2f /bin/bash
[root@wulaoer.org ~]# docker ps -a
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE                         COMMAND     CREATED      STATUS          PORTS       NAMES
f36832e7606e  quay.io/centos/centos:latest  /bin/bash   7 weeks ago  Up 7 weeks ago              gallant_mahavira
#虚拟机B
[root@www.wulaoer.org ~]# docker pull centos
[root@www.wulaoer.org ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   14 months ago   231MB
[root@www.wulaoer.org ~]# docker run -itd 5d0da3dc9764 /bin/bash
[root@www.wulaoer.org ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
d80b5a834802   5d0da3dc9764   "/bin/bash"   6 minutes ago   Up 6 minutes             sharp_davinci

环境已经准备好了,两个虚拟机上已经启动容器了,下面我们需要给宿主机加路由表,在A虚拟机上把B虚拟机上的docker网段加到自己的路有表中,然后在B虚拟机上把A虚拟机上容器的网段加入到B虚拟机的路由表中。

#先查看网段
[root@wulaoer ~]# docker inspect f36832e7606e  | grep  IPAddress
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
               "IPAddress": "10.88.0.2",
                         "IPAddress": "10.88.0.2",
[root@www.wulaoer.org ~]# docker inspect d80b5a834802  | grep  IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
#添加路有表
[root@wulaoer.org ~]# sudo route add -net 172.17.0.0 netmask 255.255.0.0 gw 10.211.55.19
[root@www.wulaoer.org ~]# sudo route add -net 10.88.0.0 netmask 255.255.0.0 gw 10.211.55.14
#如果添加错误了可以删除
route del -net 172.17.0.0 netmask 255.255.0.0

如果想修改docker的网段可以在/etc/docker/daemon.json文件中修改,上面已经天际路有表了,下面测试一下两个容器之间是否可以通信,我们这里直接使用ping命令即可。

#虚拟机A进行测试
[root@wulaoer ~]# docker exec -it f36832e7606e /bin/bash
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
[root@f36832e7606e /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=62 time=0.835 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=62 time=0.453 ms
#虚拟机B进行测试
[root@www.wulaoer.org ~]# docker exec -it d80b5a834802 /bin/bash
[root@d80b5a834802 /]# ping 10.88.0.2
PING 10.88.0.2 (10.88.0.2) 56(84) bytes of data.
64 bytes from 10.88.0.2: icmp_seq=1 ttl=62 time=0.764 ms
64 bytes from 10.88.0.2: icmp_seq=2 ttl=62 time=0.883 ms

两个容器之间直接通信实现了,说明通过路有的方式可以实现两个容器之间的通信的,如果使用iptables也是可以实现的,这里就不做过多的描述了,后期如有时间会更新一下使用iptables实现两个容器之间的通信。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: