1. 简介

先来看看Docker的理念:

  • 将应用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。

为了能保存数据在docker中我们使用卷。

总结:实际就是建立一个通道,让宿主机和容器内的目录/文件互通,有点类似Redis里面的rdb和aof文件

2. 作用

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

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

总结:

  • 容器的持久化
  • 容器间继承+共享数据

3. 数据卷

容器和宿主机之间的数据共享

3.1 命令添加

  1. # -v 代表指定数据卷参数
  2. # 容器内可读可写
  3. docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
  4. # 容器内只读,read only
  5. docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
  6. # 备注:
  7. # 如果Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
  8. # 解决办法:在挂载目录后多加一个--privileged=true参数即可

image.png

  • 容器和宿主机之间数据共享,容器停止退出后,主机修改后数据也会同步,在下一次启动时会加载,类似Redis的持久化文件

image.png

3.2 DockerFile添加

  1. # docker file中命令
  2. # 容器数据卷测试dockerfile
  3. FROM centos:7
  4. # 可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
  5. VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
  6. CMD echo "finished,--------success1"
  7. CMD /bin/bash
  8. # 说明:
  9. # 出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
  10. # 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
  11. # 对应的宿主机有默认路径:/var/lib/docker/volumes/xxxxxx/_data
  • 案例演示
    • 根目录下新建mydocker文件夹并进入
    • dockerfile构建

image.png

  • build执行构建 ```bash docker build -f /mydocker/dockerfile -t jshawn/centos .

参数解释

-f 指明dockerfile路径 -t 指明镜像的命名空间和名称 . 代表在当前目录下生成,可以自定义

  1. - build后生成一个新镜像jshawn/centos
  2. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1639548149875-1f6180a6-3077-4c41-af0e-357aa329233e.png#clientId=u4a64b895-c42a-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ud3c8888b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=235&originWidth=1327&originalType=binary&ratio=1&rotation=0&showTitle=false&size=44483&status=done&style=none&taskId=ucd6f2f7f-858c-4450-ab85-03d3e3b4b1a&title=)
  3. - run执行,看是否生成容器数据卷
  4. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1639548315983-5278c641-f4f9-4c3e-b1df-e528e09f2d44.png#clientId=u86c08425-c6b7-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ua19db95c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=292&originWidth=932&originalType=binary&ratio=1&rotation=0&showTitle=false&size=45850&status=done&style=none&taskId=u6796de37-44c0-4b05-8a3b-f32847c4c20&title=)
  5. - 通过`**docker inspect 容器ID**`查看宿主机对应的默认地址
  6. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1639548575562-47cbedb1-1487-405f-a3c6-37dd9910548b.png#clientId=u86c08425-c6b7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=140&id=ua86d9f49&margin=%5Bobject%20Object%5D&name=image.png&originHeight=279&originWidth=1796&originalType=binary&ratio=1&rotation=0&showTitle=false&size=43599&status=done&style=none&taskId=u33a23c53-158e-4b27-bebe-627124003ad&title=&width=898)
  7. - 测试容器和宿主机之间数据共享
  8. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1639548850833-013dccb7-7ea5-4aab-aed8-c5459475dc11.png#clientId=u86c08425-c6b7-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u3bc36b52&margin=%5Bobject%20Object%5D&name=image.png&originHeight=132&originWidth=1699&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33688&status=done&style=none&taskId=u0e69e200-fb50-483b-9e45-13890da782f&title=)
  9. <a name="w6w4x"></a>
  10. # 4. 数据卷容器
  11. > 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
  12. > **一句话:容器间继承+共享数据,容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止**
  13. ```bash
  14. docker run -it --name="dc02" --volumes-from dc01 c899766476ac
  15. # 参数解释
  16. --volumes-from:新容器继承于哪个父容器,那么新容器就具有和父容器一样的数据卷,并且两个容器间数据共享,
  17. 哪怕删除其中一个容器,另外一个的数据卷也会继续存在,并且可以继续被其他容器继承,可以无限延伸
  • 案例演示
    • 以上一步已配置好数据卷的镜像jshawn/centos为模板新建并运行容器dc01

image.png

  • 同样创建dc02/dc03,但需加入**--volumes-from**,让dc02和dc03的数据卷继承于dc01

    1. docker run -it --name="dc02" --volumes-from dc01 c899766476ac
    2. docker run -it --name="dc03" --volumes-from dc01 c899766476ac
  • 在dc01中的/dataVolumeContainer1目录下新增文件,查看dc02和dc03中相同目录也出现该文件(图略)

  • 此时删除容器dc01,而dc02和dc03还可以继续互通数据,证明数据卷之间的继承与共享,并且可以继续被其他容器继承

image.png