【Docker】Docker容器数据卷(Data Volume)

docker容器数据卷简介

  docker在运行的时候我们可能会修改一些数据,比如在docker某个容器里修改了文件信息,或者新增了一些文件,如果不去docker commit去生成一个新的镜像,随着容器的关闭这些文件及修改的信息会消失。所以当我们希望在关闭容器的时候可以保留这些信息,以及容器之间可以共享数据 。为了数据能够保存,我们使用容器数据卷。

数据卷特点

  1.数据卷持久化数据,数据卷可以在容器之间共享或者重用数据,容器和宿主机之间可以互相拷贝数据。

    2.数据卷中的内容更改后直接生效。宿主机和容器内数据修改依然会同步。

    3.数据卷中的更改不会包含在镜像的更新中,也就是不回影响镜像的本身。

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

数据卷的操作

  一.添加数据卷

    1.直接命令添加方式

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

     执行下面命令

       docker run -it -v /myDataVolume:/dockerDataVolume centos

     如果发现有下面错误,是因为mac系统内所指定的路径不对。

     

     根据docker官网提示,https://docs.docker.com/docker-for-mac/osxfs/#namespaces

       

     修改路径后,执行成功,新生成的docker容器中多了一个dockerDataVolume目录,而我mac系统桌面上也多了一个myDataVolume目录,因为我讲路径映射到mac桌面上。

     

    

    通过命令验证

docker inspect 19bc98eca20d <--这个是刚刚生成容器的ID

    

     根据返回的json数据中看到上面信息,说明已经关联成功。

     

    上个命令后面添加ro参数表示是添加只读目录,只能同步,不能编辑,就是只允许主机单向传递数据,但是容器只能查看。

docker run -it -v ~/Desktop/myDataVolume:/opt/dockerDataVolume:ro centos

       2.通过Dockerfile添加

      通过Dockerfile创建的带有volumes的镜像创建的容器会自动将volumes的目录挂载到宿主机的指定目录,可通过docker inspect查看volumes属性查看。

      在Dockerfile文件中使用VOLUME命令可以给镜像添加一个或者多个数据卷。

      命令:

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

     说明:

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

songguojundeMBP:Desktop songguojun$ mkdir mydocker
songguojundeMBP:Desktop songguojun$ cd my
myDataVolume/ mydocker/     
songguojundeMBP:Desktop songguojun$ cd mydocker/
songguojundeMBP:mydocker songguojun$ pwd
/Users/songguojun/Desktop/mydocker
songguojundeMBP:mydocker songguojun$ vi Dockerfile
songguojundeMBP:mydocker songguojun$ docker build -f /Users/songguojun/Desktop/mydocker/Dockerfile -t song/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 470671670cac
Step 2/4 : VOLUME ["/opt/dataVolumeContainer1","/opt/dataVolumeContainer2"]
 ---> Running in 92429e5c0597
Removing intermediate container 92429e5c0597
 ---> 8597e1c67270
Step 3/4 : CMD echo "finished,--------success1"
 ---> Running in 210cd21ebd1b
Removing intermediate container 210cd21ebd1b
 ---> c4fbf443e419
Step 4/4 : CMD /bin/bash
 ---> Running in 1dc2c05e4437
Removing intermediate container 1dc2c05e4437
 ---> 45bb13cd1ef1
Successfully built 45bb13cd1ef1
Successfully tagged song/centos:latest
songguojundeMBP:mydocker songguojun$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
song/centos         latest              45bb13cd1ef1        About a minute ago   237MB
centos              latest              470671670cac        8 weeks ago          237MB

运行刚刚生成的新的容器

songguojundeMBP:mydocker songguojun$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
song/centos         latest              45bb13cd1ef1        About a minute ago   237MB
centos              latest              470671670cac        8 weeks ago          237MB
songguojundeMBP:mydocker songguojun$ docker run -it song/centos
[root@6b38aa0e0b7e /]# ls /opt/
dataVolumeContainer1  dataVolumeContainer2

数据卷容器

      命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,用于容器之间数据的传递。挂载数据卷的容器,称之为数据卷容器。

     

    下面一个案例

         操作流程

    1.先启动一个父容器dc1。

原文地址:https://www.cnblogs.com/songgj/p/11135547.html