参考链接
https://www.jianshu.com/p/9c45a6d4496a
容器卷是什么
docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一部分保存下来,那么当容器被删除之后,数据也就没了,为了能够保存数据,在docker容器中使用卷。卷就是目录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点
为什么需要容器卷
上文中提到,我们需要持久化数据,一但删除删除了容器,里头的数据就一同被销毁了。
容器卷的作用
卷的设计目的就是数据的持久化,完全独立与容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1. 数据卷可以在容器之间共享和重用数据。
2. 卷的更改可以直接生效。
3. 数据卷的更改不会包含在镜像的更新中。
4. 数据卷的生命周期一直持续到没有容器使用它为止。
容器的持久化
容器间继承+共享数据
如何操作
通过 -v 参数挂载
docker run -it -v /宿主机目录:/容器内目录 容器名
[root@localhost ~]# ls1.txt 2.txt anaconda-ks.cfg[root@localhost ~]# pwd/root[root@localhost ~]# docker run -it -v /root/test:/root/test centos /bin/bash[root@1f1d063fa78b /]# cd[root@1f1d063fa78b ~]# pwd/root[root@1f1d063fa78b ~]# lsanaconda-ks.cfg anaconda-post.log original-ks.cfg test[root@1f1d063fa78b ~]# cd test/[root@1f1d063fa78b test]# ls[root@1f1d063fa78b test]# touch 1.txt1.txt[root@1f1d063fa78b test]# vi 1.txt[root@1f1d063fa78b test]# [root@localhost ~]# pwd/root[root@localhost ~]# ls1.txt 2.txt anaconda-ks.cfg test[root@localhost ~]# cd test/[root@localhost test]# ls1 1.txt[root@localhost test]# cat 1.txt123[root@localhost test]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1f1d063fa78b centos "/bin/bash" 2 minutes ago Exited (0) 28 seconds ago quizzical_haslett[root@localhost test]# docker rm 1f1d063fa78b1f1d063fa78b[root@localhost test]# ls1 1.txt[root@localhost test]# cat 1.txt123
查看挂载是否成功
docker inspect 容器ID
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEjginx 1.0 99250f27e4f7 41 hours ago 133MBredis latest 7faaec683238 10 days ago 113MBnginx latest 87a94228f133 11 days ago 133MBcentos latest 5d0da3dc9764 5 weeks ago 231MB[root@localhost ~]# docker run -it -v /root/test1:/root/test1 centos[root@768e56a3f1a7 /]# [root@localhost ~]#[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES768e56a3f1a7 centos "/bin/bash" 18 seconds ago Up 18 seconds intelligent_shaw[root@localhost ~]# docker inspect 768e56a3f1a7

容器关闭之后,在宿主机修改挂载目录中的文件,依然会同步到容器中
带权限的挂载
命令(带权限)docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (read only)此时主机能对数据卷进行更改,但是容器不能对其更改,只允许读。
通过docker file build 一个新镜像
在docker file中详细说明
具名挂载和匿名挂载
docker的挂载
Docker的挂载是将容器内的目录和宿主机的目录进行绑定。修改任意一个目录,另一个目录也会发生改变。可以理解为双向绑定,类似vue,小程序的双向数据绑定
挂载的方式
Docker的挂载方式包括指定目录挂载、具名挂载、匿名挂载。
指定目录挂载
就是指定容器内的某个目录和宿主机的某个目录绑定。例如:
#-v /宿主机路径:容器内路径#指定挂载,完整路径,要以/开头,这是和具名挂载的区别docker run -d -p=3310:8080 -v /home/tomcat/Test:/webapps --name tomcat01 tomcat
具名挂载
就是指定容器内的某个目录和宿主机的默认目录+具名组成的目录进行绑定。例如:
-v 卷名:容器内路径#具名挂载,开头没有/docker run -d -p=3311:8080 -v TestTomcat:/webapps --name tomcat02 tomcat[root@localhost ~]# docker run -d -v nginx01:/usr -p 8888:80 --name m1ynginx nginx15532ed2511c41f16cf0b9dad94397468c40d60978662ceb0b21b23265f99491[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES15532ed2511c nginx "/docker-entrypoint.…" 22 seconds ago Up 18 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp m1ynginx[root@localhost ~]# docker volume lsDRIVER VOLUME NAMElocal nginx01[root@localhost ~]# docker volume inspect nginx01[{"CreatedAt": "2021-10-27T20:35:58+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/nginx01/_data","Name": "nginx01","Options": null,"Scope": "local"}][root@localhost ~]# cd /var/lib/docker/[root@localhost docker]# lsbuildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes[root@localhost docker]# cd volumes/[root@localhost volumes]# lsbackingFsBlockDev metadata.db nginx01[root@localhost volumes]# cd nginx01/[root@localhost nginx01]# ls_data
匿名挂载
-v 容器内路径#匿名挂载,直接写容器内路径docker run -d -p=3312:8080 -v /webapps --name tomcat03 tomcat
查看挂载情况
#可以使用docker volume --help查看帮助docker volume lsdocker volume inspect 卷名#查看所有volume的状况#前面说的volume默认路径:/var/lib/docker/volumes#该命令只能查看具名和匿名volume
权限控制
[root@localhost ~]# docker run -d -v nginx01:/usr:[ro/rw] -p 8888:80 --name m1ynginx nginxro = readonly => 在容器内没有修改权限rw = read wirte => 在容器内可以读写
