5.1 是什么

将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!
为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!

5.2 作用

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

5.3 特点

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

总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!

5.4 使用数据卷

5.4.1 命令挂载数据卷

挂载容器内指定文件夹到宿主机指定文件夹

5.4.2 命令列表

  1. # 挂在数据卷命令
  2. docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
  3. # 查看数据卷挂载信息命令(important)
  4. docker inspect 容器id

5.4.3 测试文件同步

5.4.3.1 进行挂载

  1. [root@kuangshen ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

5.4.3.2 查看数据卷是否挂在到本地成功(执行 docker inspect 容器id

image.png

  • 红色为宿主机数据卷所在路径
  • 绿色为容器内数据卷所在路径

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

    可以发现,在容器中,创建的会在宿主机中看到

image.png
测试容器停止退出后,主机修改数据是否会同步!
(1)停止容器
(2)在宿主机上修改文件,增加些内容
(3)启动刚才停止的容器
(4)然后查看对应的文件,发现数据依旧同步!ok
image.png

5.4.4 mysql挂载本地

mysql采用数据卷持久化到宿主机,即便容器被删除本地数据卷的数据也不会丢失

  1. # 1、搜索镜像
  2. [root@kuangshen ~]# docker search mysql
  3. NAME DESCRIPTION STARS
  4. mysql MySQL is a widely used, open-source relation 9488
  5. # 2、拉取镜像
  6. [root@kuangshen ~]# docker pull mysql:5.7
  7. 5.7: Pulling from library/mysql
  8. 54fec2fa59d0: Already exists
  9. bcc6c6145912: Pull complete
  10. 951c3d959c9d: Pull complete
  11. 05de4d0e206e: Pull complete
  12. 319f0394ef42: Pull complete
  13. d9185034607b: Pull complete
  14. 013a9c64dadc: Pull complete
  15. e745b3361626: Pull complete
  16. 03145d87b451: Pull complete
  17. 3991a6b182ee: Pull complete
  18. 62335de06f7d: Pull complete
  19. Digest:
  20. sha256:e821ca8cc7a44d354486f30c6a193ec6b70a4eed8c8362aeede4e9b8d74b8ebb
  21. Status: Downloaded newer image for mysql:5.7
  22. docker.io/library/mysql:5.7
  23. # 3、启动容器 -e 环境变量!
  24. # 注意: mysql的数据应该不丢失!先体验下 -v 挂载卷! 参考官方文档(Docker Hub)
  25. [root@kuangshen home]# docker run --name mysql01 -d
  26. -p 3310:3306
  27. -e MYSQL_ROOT_PASSWORD=123456
  28. -v /home/mysql/conf:/etc/mysql/conf.d
  29. -v /home/mysql/data:/var/lib/mysql mysql:5.7
  30. 4763fa5c68c4323688102f57938fb10996a0fb902d2812349286529f9378f16c
  31. # 4、使用本地的sqlyog连接测试一下 3310
  32. # 5、查看本地的 /home/mysql 目录
  33. [root@kuangshen data]# pwd
  34. /home/mysql/data
  35. [root@kuangshen data]# ls
  36. .. ... . test # 可以看到我们刚刚建立的mysql数据库在本地存储着
  37. # 6、删除mysql容器
  38. [root@kuangshen data]# docker rm -f mysql01 # 删除容器,然后发现远程连接失败!
  39. mysql01
  40. [root@kuangshen data]# ls
  41. .. ... . test # 可以看到我们刚刚建立的mysql数据库在本地存储着

5.5 匿名和具名挂载

5.5.1 匿名挂载

不指定宿主机路径:只指定容器路径

5.5.1.1 匿名挂载命令

docker run -v 容器内路径 镜像名:tag

  1. # 匿名挂载nginx
  2. docker run -d -P --name nginx01 -v /etc/nginx nginx
  • 匿名挂载生成的宿主机路径(下面红色部分:宿主机中卷名为随机生成的

image.png

5.5.1.2 匿名挂载的缺点

不好维护,通常使用命令 docker volume 维护。

  1. docker volume ls

5.5.2 具名挂载

不指定宿主机路径:指定卷名和容器内路径

5.5.2.1 具名挂载命令

docker run -v 卷名:/容器内路径 镜像名:tag

  1. # 具名挂载nginx
  2. docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
  • 具名挂载生成的宿主机路径(宿主机中卷名为指定的 nginxconfig

image.png

5.5.3 查看挂载路径

docker volume inspect 卷名

  1. # 查看挂载的路径
  2. [root@kuangshen ~]# docker volume inspect nginxconfig
  3. [
  4. {
  5. "CreatedAt": "2020-05-13T17:23:00+08:00",
  6. "Driver": "local",
  7. "Labels": null,
  8. "Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
  9. "Name": "nginxconfig",
  10. "Options": null,
  11. "Scope": "local"
  12. }
  13. ]

5.5.4 改变文件的读写权限

  1. # ro: readonly ---> 只能在宿主机修改,容器内部只读
  2. # rw: readwrite ---> 宿主机和容器内部都可读写
  3. # 指定容器对我们挂载出来的内容的读写权限
  4. docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
  5. docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx

5.6 数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为 数据卷容器

5.6.1 构建数据卷容器

5.6.1.1 创建 dockerFile 文件,编写如下脚本

  1. FROM centos
  2. # 匿名挂载
  3. VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
  4. CMD echo "-------end------"
  5. CMD /bin/bash

5.6.1.2 构建自己的镜像

  1. docker build -f dockerFile -t kuangshen/centos .

5.6.1.3 构建数据卷容器

  • 构建父容器docker01(采用上面构建的镜像)

image.png

  • 然后在 dataVolumeContainer2 新增文件

image.png

5.6.1.4 创建容器共享数据卷容器的数据

—volumes-from

  • 创建docker02,docker03 让他们继承docker01 ```shell [root@kuangshen docker-test-volume]# docker run -it —name docker02 — volumes-from docker01 kuangshen/centos

[root@ea4c82779077 /]# cd /dataVolumeContainer2 [root@ea4c82779077 dataVolumeContainer2]# ls docker01.txt [root@95164598b306 dataVolumeContainer2]# touch docker02.txt [root@95164598b306 dataVolumeContainer2]# ls docker01.txt docker02.txt

[root@kuangshen docker-test-volume]# docker run -it —name docker03 — volumes-from docker01 kuangshen/centos

[root@ea4c82779077 /]# cd /dataVolumeContainer2 [root@ea4c82779077 dataVolumeContainer2]# ls docker01.txt docker02.txt [root@95164598b306 dataVolumeContainer2]# touch docker03.txt [root@95164598b306 dataVolumeContainer2]# ls docker01.txt docker02.txt docker03.txt ```

  • 容器docker02 和 docker03 目前和父容器 docker01 共享数据

结论:

  • 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
  • 存储在本机的文件则会一直保留!