(07)Docker容器之数据卷

  1、数据卷及其作用

  Docker理念是将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的,容器之间希望有可能共享数据。Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷,一句话:有点类似我们Redis里面的rdb和aof文件。

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

  特点:
  1、数据卷可以在容器之间共享或重用数据
  2、卷中的更改可以直接生效
  3、数据卷中的更改不会包含在镜像的更新中
  4、数据卷的生命周期一直持续到没有容器使用它为止

  2、容器内添加数据卷

  有两种方式:直接命令添加;DockerFile添加

  (1)直接命令添加

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

[root@localhost ~]# docker run -it -v /myDataVolume:/dataVoContainer cento

  2)查看数据卷是否挂载成功,看到宿主机和容器内部都成功创建了对应目录,宿主机和容器可以共享数据了

  使用docker inspect命令也可以查看

docker inspect 92afd4685d89

  3)容器和宿主机之间数据共享:在宿主机内创建test.txt在容器内可以读取到并修改,在容器内新建的test2.txt在宿主机中可以读到。

  4)容器停止退出后,主机修改后数据是否同步。此时容器内和宿主机的文件如下:

  在宿主机内新增、修改文件,然后启动容器,发现数据已经同步

  5)命令(带权限)

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

  作用:宿主机可以写文件,但是容器内的目录中只能读文件,不能修改,也不能写

  演示:首先清空宿主机和容器内相关目录的文件,然后exit容器。

[root@localhost myDataVolume]# docker run -it -v /myDataVolume:/dataVoContainer:ro centos

  (2) DockerFile添加

  DockerFile理解为镜像模板的描述文件。去https://github.com/看一下tomcat的部分DockerFile,用到了jdk:

  创建数据卷使用:VOLUME ["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]。由于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。因为宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

  1)根目录下新建mydocker文件夹并进入

[root@localhost /]# mkdir mydocker
[root@localhost /]# cd mydocker
[root@localhost mydocker]# pwd
/mydocker

  2)可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。构建File文件

[root@localhost mydocker]# vim Dockerfile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------successl"
CMD /bin/bash

  FROM centos:来自于父类的镜像

  VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]:新建两个数据卷

  整个文件类似于:docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash

  3)build后生成镜像

docker build -f /mydocker/Dockerfile -t sl/centos .

  -f:指明dockerfile路径

  -t:指明命令空间和镜像名字

  .:当前目录

  4) run容器

[root@localhost mydocker]# docker run -it sl/centos

  容器内已经创建了两个数据卷,可使用docker inspect image查看宿主机对应目录,同样具有数据共享、读写权限 。 

[root@localhost mydocker]# docker inspect e042513c1a91

  备注 :Docker挂载主机目录,Docker访问出现cannot open directory .:Permission denied

  解决办法:在挂载目录后多加一个--privileged=true参数即可

  如:docker run -it -v /myDataVolume:/dataVolumeContainer --privileged=true 镜像名

原文地址:https://www.cnblogs.com/javasl/p/12734373.html