我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

深入理解Docker容器之间的通信方式

来源:网络 更新时间:2024-05-23 18:31:43

在之前的几篇文章中,我们介绍了Docker的基本概念和基本操作:

https://www.cnblogs.com/jilodream/p/18177695   初识docker
https://www.cnblogs.com/jilodream/p/18184687   基本操作
https://www.cnblogs.com/jilodream/p/18189478   镜像制作

然而,随着分布式多节点的考虑,我们需要容器之间能够进行通信。
容器之间的通信通常分为三种途径:
1、通过虚拟IP直接访问
2、通过链接方式,指定要连接的容器
3、创建bridge网络,实现容器互联

为了满足接下来的学习,我们需要利用官方的tomcat镜像为基础,初始化一些指令,DockerFile 如下:

开始构建镜像,并查看

然后我们回到重点,依次来看看容器的3种通信途径:

1、通过虚拟IP直接访问
安装docker之后,docker会默认搭建一个docker0的网络,后续每个容器就是网络中的一个节点,每个节点因此会有属于网络中的一个虚拟IP。我们可以利用虚拟IP直接进行访问。
如下,我们创建两个容器:

我们可以通过ifconfig或者inspect 查看容器IP, 接着使用 ping 和curl 命令实现两个容器的互相访问,我们发现网络是通着的:

进入8081容器,并查看IP为172.17.0.2

进入8082容器,并查看IP为172.17.0.3

8081 ping 8082,并访问对方tomcat端口

8082 ping 8081,并访问对方tomcat端口

这种情况一般比较简单,而且实际搭建网络集群时,比较复杂,IP地址也不好维护,所以我们一般只是在环境测试时使用。

2、通过link方式,指定要连接的容器
命令描述如下:

docker run  -d --name 容器名称 --link 被连接容器名:被连接容器别名 镜像Id

我们创建两个容器。然后通过ifconfig或者inspect 查看容器IP

我们可以直接通过别名来访问另外一个容器,
以下为8081容器:IP为172.17.0.2:

以下为8082容器,IP为172.17.0.3 :

8082容器通过IP和网络别名访问8081容器:

link方式本质上还是使用docker0网络,修改host文件的IP映射,来实现网络通信。并且随着IP的变化还可以动态的维护这种映射关系。

但是link方式也有自己的局限性,如只能单向请求,两个容器无法互相连接请求对方,因为link配置是在启动容器时就已经生成好的,也就是只能后边的容器单向请求前边的容器,无法形成循环的网络。由于诸多不便,link方式也被抛弃了,更推荐的是bridge网络方式。

3、创建bridge网络,来实现容器互联

(1)首先我们创建一个bridge网络:
docker network create 网络名称

如下,我们创建一个网络名称为mynet的网络

(2)新创建3个容器加入到bridge网络中

命令如下docker run -it --name  容器名 ---network bridge网络名 --network-alias 当前容器在网络中的别名  镜像名

(3)进入到3个容器中,分别访问其它容器

以下为8083容器:8083访问8084

以下为8084容器: 8084访问8083

以下为8085容器: 8085访问8083、8084

我们可以发现第三种(构建bridge网络)的方式,相对来说最为灵活实用,不需要提前规划,并且可以实现网状的网络通信请求。

回到诉求本身,其实我们对容器间的通信需求并没有想象中的那么迫切,我们往往是通过端口映射到宿主机中,通过访问不同的宿主机IP和端口来实现容器间通信。这样也屏蔽了宿主机中容器的概念,并且可以广泛的无差别使用各种中间件,使得开发起来更容易。

但是有时候出于网络安全考虑,不允许请求进行跳转,或者端口进行屏蔽,此时就需要考虑下是否可以使用容器通信的技术来实现需求。