Docker学习总结(四)——容器间的通信和数据卷

Docker学习总结(四)——容器间的通信和数据卷

一、容器间的通信

1.容器的虚拟IP

在之前文章中我们创建的容器都是各自独立,没有任何关联的,如果我们需要容器间进行通信那我们需要怎么去实现。首先我们需要知道的是,在我们运行容器时,docker默认会向容器分配一个虚拟的IP地址,这个IP地址是无法从外部进行访问的,只能在容器间进行访问。可以通过

docker inspect containerId命令进行查看,在此之前我们先运行一个名为web1的容器,再使用上述命令进行查看,结果若下图所示:

在这里插入图片描述

图中标注出的就是该容器的虚拟IP。

接着我们通过同一镜像创建一个名为web2的容器,同样使用docker inspect对容器信息进行查看,结果如下:

在这里插入图片描述

紧接着我们进入web1这个容器中,进行测试,看是否能与web2连接成功;

在这里插入图片描述

连接成功,从web2中向web1发送请求也是一样的。按照这样的情况,只要知道目标容器的虚拟IP地址就能够完成容器间的通信,但是当前还有一个问题,这个虚拟IP是在容器运行时随机分配的,也就是说容器如果重启,那么这个虚拟IP地址就可能不同。若是有疑惑可按照以下步骤进行测试:

  1. 停止web1容器;
  2. 重启web2容器;
  3. 启动web1容器;

经过以上步骤后再查看容器信息会发现web1容器的IP由原来的172.17.0.2变成了172.17.0.3,而web2的IP地址由原来的172.17.0.3变成了172.17.0.2,因此,通过设置容器的虚拟IP地址进行通信是不可行的。以下将介绍两种通信方式,一种是用于单向通信的Link,还有一种是用于双向通信的网桥Bridge。

2.容器间的单向访问

其实,要采用单向通信的link非常的简单,我们还是采用上面的例子,我们再创建一个容器web3,命令如下:

docker run -d --name web3 --link web1 tomcat

上述的命令和我们以往用到的运行容器的命令多了--link web1,这个意思就是与web1建立单项连接,下面我们可以进入到web3容器中进行测试,结果如下:

在这里插入图片描述

如上图所示,红色框中,是web3对web1进行访问,无需通过虚拟IP,而是直接通过服务名称进行访问,而访问web2时则会提示失败,但是在web1中访问web3则还是需要通过虚拟IP进行访问,除非对web1也进行设置,下面我们将介绍一种能够使容器进行双向访问的方法。

3.容器间的双向访问

​ 首先我们先进行一项测试,尝试在容器内部ping www.baidu.com,会发现在容器内部是可以与外部相连接的,而连接的基础就在于docker中的一个虚拟组件Bridge(网桥),他起到了一个桥接内部与外部网络的作用,充当着网关的作用,接在同一网桥上的容器可以理解为是在一个局域网内,因此可以通过网关相互访问,而与外部进行数据交换,则需要通过物理网卡进行转换,从外部进来的数据需要先通过物理网卡进行转换,然后再通过网桥进行分发。

​ 接着我们执行一条命令来查看docker的网络服务:

docker network ls

在这里插入图片描述

然后我们通过一条命令创建一个新的网桥

docker network create -d my-bridge

接着我们通过docker network connect bridgeName containerName命令将容器与网桥进行绑定,示例如下:

docker network connect my-bridge web1

只要将容器与该网桥进行逐一绑定,这几个容器就能够直接通过容器名相互访问。

二、容器间的数据共享——Volume(数据卷)

数据卷的概念,简单来说就是在宿主机上开辟一块磁盘空间用于存储容器中需要用到的文件,而所有需要用到该文件的容器都能够对其进行共享,若需要对该文件进行修改,也只需要对宿主机上的文件进行修改,省去了重复修改的繁琐,同时,在容器内部设置好的地址也能看到映射的文件,下面对如何设置容器的Volume进行简要说明:

  1. 第一种方式,是在每一次启动容器时都对Volume的宿主机地址和映射地址进行设置,下面以启动Tomcat容器为例进行说明,命令如下:

docker run --name web1 -p 8080:8080 -v /usr/local/data:/usr/local/tomcat/webapps -d tomcat

  • –name:容器名称;
  • -p:设置端口号,冒号前表示的是宿主机开放的端口8080,冒号后表示的是容器的开放端口;
  • -v:设置数据卷,“:”前表示宿主机地址,也就是文件存放的地址,后面表示的是在容器中的映射地址;

​ 2.第一种方式在容器较少的时候使用起来可能并没有感觉到不方便,如果容器多的话每次都需要以这样的方式输入命令就显得比较繁琐,同时在输入路径时还需要保证不能出错,因此,又有了另外一种更为简单的方法,创建共享容器,还是以tomcat容器为例,命令如下:

  • 首先,创建数据容器
    • docker create --name data -v /usr/local/data:/usr/local/tomcat/webapps tomcat
  • 运行所需容器,并在运行时指定数据卷
    • docker run --volumes-from data --name web1 -d tomcat

这种方式首先需要创建数据容器,只需要创建不需要运行,示例中创建了一个以tomcat为镜像名为data的数据容器,第二步就是运行自己需要的容器,并在运行命令中通过 --volumes-from 数据容器名称来说明挂载的数据容器,不需要对路径进行重新设置。

的数据容器,第二步就是运行自己需要的容器,并在运行命令中通过 --volumes-from 数据容器名称来说明挂载的数据容器,不需要对路径进行重新设置。

总结:其实无论是网桥的设置还是数据卷的设置,都是对原有功能的一个封装,docker容器本身也就能够支持彼此之间通过IP通信,也支持直接在启动容器时声明映射文件路径,但不管是网桥还是数据卷都强化了原有的功能,使之更加便捷、高效。后面我们将介绍一种docker的编排工具——docker-compose,同时之前所有总结的命令以及功能也都会其中进行总结以及综合运用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值