前面我们介绍了镜像容器,通过镜像我们可以启动多个容器,但是我们发现当我们的容器停止获取删除后,我们在容器中的应用的一些数据也丢失了,这时为了解决容器的数据持久化,我们需要通过容器数据卷来解决这个问题,本文我们就来介绍下容器数据卷

1.是什么

  Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。简单来说,容器卷就相当于Redis中持久化方式的RDB和AOF。

2.解决了什么问题

  卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
  卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:

  1. 数据卷可在容器之间共享或重用数据

  2. 卷中的更改可以直接生效

  3. 数据卷中的更改不会包含在镜像的更新

  4. 数据卷的生命周期一直持续到没有容器使用它为止

持久化,容器间继承和共享数据

3.数据卷

  首先我们来看看数据卷的使用方式

3.1 直接命令添加

3.1.1 挂载数据卷

添加的命令

docker run -it -v /宿主机绝对路径:/容器内目录 镜像名 

Docker之快速搞定容器数据卷
我们发现执行了该命令后,在宿主机中会添加mydatavolume文件夹,同时在容器中的根目录中也有了datavolumecontainer文件夹。

Docker之快速搞定容器数据卷

这表示数据卷挂载成功了。同时我们也可以通过前面介绍的 docker inspect 容器名称ID来查看容器的 json数据

Docker之快速搞定容器数据卷

3.1.2 数据共享操作

  数据卷挂载成功后,我们来看看容器和宿主机之间的数据共享,我们先在宿主机的mydatavolume目录中创建一个文件。然后到容器的datavolumecontainer目录中查看是否有相同的文件,然后我们再反过来测试。

Docker之快速搞定容器数据卷
Docker之快速搞定容器数据卷
然后我们发现在容器中也有了相同的文件,而且内容也一致。反过来

Docker之快速搞定容器数据卷
Docker之快速搞定容器数据卷

这就说明容器和宿主机中的数据实现了数据共享

3.3.3 容器停止数据共享

  接下来我们把容器停止掉,然后在宿主机中更新数据,然后启动容器我们看看数据是否还能同步。

Docker之快速搞定容器数据卷
更新宿主机中的数据

Docker之快速搞定容器数据卷

启动原来的容器查看。

Docker之快速搞定容器数据卷

3.3.4 权限管理

  前面我们介绍的共享的权限是在容器中具有读写的权限。通过docker inspect 容器ID 我们也可以看到

Docker之快速搞定容器数据卷

我们可以修改该权限

docker run -it -v /宿主机绝对路径:/容器内目录:ro 镜像名 

Docker之快速搞定容器数据卷
查看状态
Docker之快速搞定容器数据卷

宿主机添加文件

Docker之快速搞定容器数据卷
容器中查看

Docker之快速搞定容器数据卷
创建文件或者修改文件会失败

Docker之快速搞定容器数据卷

3.2 DockerFile添加

  DockerFile下篇文章我们会专门来介绍,此处我们先来使用看看效果。

3.2.1 mydocker文件夹

  在根目录下创建mydocker文件夹
Docker之快速搞定容器数据卷

3.2.2 VOLUM指令

VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"] 

说明:
出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

3.2.3 File构建

  构建File文件

Docker之快速搞定容器数据卷

# volume test  FROM centos  VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]  CMD echo "finished,--------success1"  CMD /bin/bash 

3.2.4 build新镜像

docker build -f /mydocker/dockerfile1 -t bobokaoya/centos . 

Docker之快速搞定容器数据卷

3.2.5 run一个新容器

  根据上面新创建的镜像我们来run一个新容器

Docker之快速搞定容器数据卷

那么如此一来,对应的宿主机的映射地址在哪呢?docker inspect 容器ID来查看

Docker之快速搞定容器数据卷

容器的 共享目录中创建 文件。
Docker之快速搞定容器数据卷
去宿主中的映射目录中查看

Docker之快速搞定容器数据卷

搞定~
注意

Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可

4.数据卷容器

  命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器,我们在前面的案例基础上来介绍

4.1 启动一个父容器

docker run -it --name dc01 bobokaoya/centos 

Docker之快速搞定容器数据卷

然后在共享目录中创建文件

Docker之快速搞定容器数据卷

4.2 创建两个子容器

创建dc02

docker run -it --name dc02 --volumes-from dc01 bobokaoya/centos 

Docker之快速搞定容器数据卷

同时在dc02中修改了文件
我们在创建dc03容器,同时继承dc01

docker run -it --name dc03 --volumes-from dc01 bobokaoya/centos 

Docker之快速搞定容器数据卷

我们发现dc03中也看到dc02修改的数据,说明共享是成功的。

4.3 删除dc01,查看dc02和dc03是否共享

  我们停掉dc01并删除,dc02和dc03之间的数据还是共享的

Docker之快速搞定容器数据卷
dc02修改,然后查看dc03

Docker之快速搞定容器数据卷

Docker之快速搞定容器数据卷

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止.

  • 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。

发表回复

后才能评论