参考链接
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 ~]# ls
1.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 ~]# ls
anaconda-ks.cfg anaconda-post.log original-ks.cfg test
[root@1f1d063fa78b ~]# cd test/
[root@1f1d063fa78b test]# ls
[root@1f1d063fa78b test]# touch 1.txt
1.txt
[root@1f1d063fa78b test]# vi 1.txt
[root@1f1d063fa78b test]# [root@localhost ~]# pwd
/root
[root@localhost ~]# ls
1.txt 2.txt anaconda-ks.cfg test
[root@localhost ~]# cd test/
[root@localhost test]# ls
1 1.txt
[root@localhost test]# cat 1.txt
123
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f1d063fa78b centos "/bin/bash" 2 minutes ago Exited (0) 28 seconds ago quizzical_haslett
[root@localhost test]# docker rm 1f1d063fa78b
1f1d063fa78b
[root@localhost test]# ls
1 1.txt
[root@localhost test]# cat 1.txt
123
查看挂载是否成功
docker inspect 容器ID
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jginx 1.0 99250f27e4f7 41 hours ago 133MB
redis latest 7faaec683238 10 days ago 113MB
nginx latest 87a94228f133 11 days ago 133MB
centos latest 5d0da3dc9764 5 weeks ago 231MB
[root@localhost ~]# docker run -it -v /root/test1:/root/test1 centos
[root@768e56a3f1a7 /]# [root@localhost ~]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
768e56a3f1a7 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 nginx
15532ed2511c41f16cf0b9dad94397468c40d60978662ceb0b21b23265f99491
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15532ed2511c nginx "/docker-entrypoint.…" 22 seconds ago Up 18 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp m1ynginx
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 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]# ls
buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
[root@localhost docker]# cd volumes/
[root@localhost volumes]# ls
backingFsBlockDev 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 ls
docker volume inspect 卷名
#查看所有volume的状况
#前面说的volume默认路径:/var/lib/docker/volumes
#该命令只能查看具名和匿名volume
权限控制
[root@localhost ~]# docker run -d -v nginx01:/usr:[ro/rw] -p 8888:80 --name m1ynginx nginx
ro = readonly => 在容器内没有修改权限
rw = read wirte => 在容器内可以读写