参考链接

https://www.jianshu.com/p/9c45a6d4496a

容器卷是什么

docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一部分保存下来,那么当容器被删除之后,数据也就没了,为了能够保存数据,在docker容器中使用卷卷就是目录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点

为什么需要容器卷

上文中提到,我们需要持久化数据,一但删除删除了容器,里头的数据就一同被销毁了。

容器卷的作用

卷的设计目的就是数据的持久化,完全独立与容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1. 数据卷可以在容器之间共享和重用数据。
2. 卷的更改可以直接生效。
3. 数据卷的更改不会包含在镜像的更新中。
4. 数据卷的生命周期一直持续到没有容器使用它为止。
容器的持久化
容器间继承+共享数据

如何操作

通过 -v 参数挂载

docker run -it -v /宿主机目录:/容器内目录 容器名

  1. [root@localhost ~]# ls
  2. 1.txt 2.txt anaconda-ks.cfg
  3. [root@localhost ~]# pwd
  4. /root
  5. [root@localhost ~]# docker run -it -v /root/test:/root/test centos /bin/bash
  6. [root@1f1d063fa78b /]# cd
  7. [root@1f1d063fa78b ~]# pwd
  8. /root
  9. [root@1f1d063fa78b ~]# ls
  10. anaconda-ks.cfg anaconda-post.log original-ks.cfg test
  11. [root@1f1d063fa78b ~]# cd test/
  12. [root@1f1d063fa78b test]# ls
  13. [root@1f1d063fa78b test]# touch 1.txt
  14. 1.txt
  15. [root@1f1d063fa78b test]# vi 1.txt
  16. [root@1f1d063fa78b test]# [root@localhost ~]# pwd
  17. /root
  18. [root@localhost ~]# ls
  19. 1.txt 2.txt anaconda-ks.cfg test
  20. [root@localhost ~]# cd test/
  21. [root@localhost test]# ls
  22. 1 1.txt
  23. [root@localhost test]# cat 1.txt
  24. 123
  25. [root@localhost test]# docker ps -a
  26. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  27. 1f1d063fa78b centos "/bin/bash" 2 minutes ago Exited (0) 28 seconds ago quizzical_haslett
  28. [root@localhost test]# docker rm 1f1d063fa78b
  29. 1f1d063fa78b
  30. [root@localhost test]# ls
  31. 1 1.txt
  32. [root@localhost test]# cat 1.txt
  33. 123

查看挂载是否成功

docker inspect 容器ID

  1. [root@localhost ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. jginx 1.0 99250f27e4f7 41 hours ago 133MB
  4. redis latest 7faaec683238 10 days ago 113MB
  5. nginx latest 87a94228f133 11 days ago 133MB
  6. centos latest 5d0da3dc9764 5 weeks ago 231MB
  7. [root@localhost ~]# docker run -it -v /root/test1:/root/test1 centos
  8. [root@768e56a3f1a7 /]# [root@localhost ~]#
  9. [root@localhost ~]# docker ps
  10. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  11. 768e56a3f1a7 centos "/bin/bash" 18 seconds ago Up 18 seconds intelligent_shaw
  12. [root@localhost ~]# docker inspect 768e56a3f1a7

image.png
容器关闭之后,在宿主机修改挂载目录中的文件,依然会同步到容器中

带权限的挂载

  1. 命令(带权限)
  2.   docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名  (read only)
  3.   此时主机能对数据卷进行更改,但是容器不能对其更改,只允许读。

通过docker file build 一个新镜像

在docker file中详细说明

具名挂载和匿名挂载

docker的挂载

Docker的挂载是将容器内的目录和宿主机的目录进行绑定。修改任意一个目录,另一个目录也会发生改变。可以理解为双向绑定,类似vue,小程序的双向数据绑定

挂载的方式

Docker的挂载方式包括指定目录挂载、具名挂载、匿名挂载。
指定目录挂载
 就是指定容器内的某个目录和宿主机的某个目录绑定。例如:

  1. #-v /宿主机路径:容器内路径
  2. #指定挂载,完整路径,要以/开头,这是和具名挂载的区别
  3. docker run -d -p=3310:8080 -v /home/tomcat/Test:/webapps --name tomcat01 tomcat

具名挂载
 就是指定容器内的某个目录和宿主机的默认目录+具名组成的目录进行绑定。例如:

  1. -v 卷名:容器内路径
  2. #具名挂载,开头没有/
  3. docker run -d -p=3311:8080 -v TestTomcat:/webapps --name tomcat02 tomcat
  4. [root@localhost ~]# docker run -d -v nginx01:/usr -p 8888:80 --name m1ynginx nginx
  5. 15532ed2511c41f16cf0b9dad94397468c40d60978662ceb0b21b23265f99491
  6. [root@localhost ~]# docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. 15532ed2511c nginx "/docker-entrypoint.…" 22 seconds ago Up 18 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp m1ynginx
  9. [root@localhost ~]# docker volume ls
  10. DRIVER VOLUME NAME
  11. local nginx01
  12. [root@localhost ~]# docker volume inspect nginx01
  13. [
  14. {
  15. "CreatedAt": "2021-10-27T20:35:58+08:00",
  16. "Driver": "local",
  17. "Labels": null,
  18. "Mountpoint": "/var/lib/docker/volumes/nginx01/_data",
  19. "Name": "nginx01",
  20. "Options": null,
  21. "Scope": "local"
  22. }
  23. ]
  24. [root@localhost ~]# cd /var/lib/docker/
  25. [root@localhost docker]# ls
  26. buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
  27. [root@localhost docker]# cd volumes/
  28. [root@localhost volumes]# ls
  29. backingFsBlockDev metadata.db nginx01
  30. [root@localhost volumes]# cd nginx01/
  31. [root@localhost nginx01]# ls
  32. _data

匿名挂载

  1. -v 容器内路径
  2. #匿名挂载,直接写容器内路径
  3. docker run -d -p=3312:8080 -v /webapps --name tomcat03 tomcat

查看挂载情况

  1. #可以使用docker volume --help查看帮助
  2. docker volume ls
  3. docker volume inspect 卷名
  4. #查看所有volume的状况
  5. #前面说的volume默认路径:/var/lib/docker/volumes
  6. #该命令只能查看具名和匿名volume

权限控制

  1. [root@localhost ~]# docker run -d -v nginx01:/usr:[ro/rw] -p 8888:80 --name m1ynginx nginx
  2. ro = readonly => 在容器内没有修改权限
  3. rw = read wirte => 在容器内可以读写