1.什么是匿名挂载和具名挂载?
所谓匿名挂载(匿名卷),即在进行数据卷挂载的时候不指定卷的名称,仅指定容器内的挂载路径。Docker会自动为其分配一个随机的卷名。
而具名挂载(命名卷)则是在创建数据卷时显式指定卷的名称和容器内的挂载路径。
先通过下面这种命令的方式感受一下两者的区别:
#匿名挂载(匿名卷)
docker run -d -p 6379:6379 --name mycentos -v /src/volume01
#具名挂载(命名卷) -v 宿主机数据卷所在路径:容器数据卷所在路径
docker run -d -p 6379:6379 --name mycentos -v /home/docker_volume:/src/volume01
除此种方式之外,我们也可以在在dockerfile构建docker镜像的时候使用VOLUME保留字来对数据卷进行挂载,此种挂载方式会创建匿名卷,我们可以指定一个或多个数据卷路径:
VOLUME ["容器内数据卷路径1","容器内数据卷路径2"……]
由于匿名挂载的时候只是指定了容器内数据卷的路径
,要查看该数据卷在宿主机上的实际位置,可以使用以下命令
# 查看当前正在运行的镜像容器id
docker ps
# 使用 inspect 查看镜像信息
docker inspect <container_id>
# 在输出信息中找到 "Mounts" 部分:
"Mounts": [
{
"Type": "volume",
"Name": "随机生成的卷名",
"Source": "/var/lib/docker/volumes/xxx/_data",
"Destination": "/container/path",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
从上面的 Mounts 中可以看到 Destination 和 Source 分别就是 容器内的数据卷 和 宿主机内的容器卷
2.匿名卷和命名卷的区别?
命名卷的主要优势在于可以方便地在多个容器间共享和重用,并且便于管理和维护。由于有明确的名称,可以很容易地找到并管理这些数据卷。下面通过示例来展示具名卷的使用:
例:具名挂载示例
#1.查看目前的镜像
[root@privateCloud / ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
#2.启动centos镜像并且使用具名挂载的方式进行数据卷挂载
[root@privateCloud / ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac
48dece440eb377a466d72327895c5ed24a75823e70ffebf40fee0e2fe9e4c66e
#3.查看刚刚启动的容器id
[root@privateCloud / ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48dece440eb3 470671670cac "/bin/bash" 4 minutes ago Up 4 minutes mycentos
#4.进入容器内部
[root@privateCloud / ]# docker exec -it 48dece440eb3 /bin/bash
#5.查看/usr/local/,发现多了一个 volume01文件夹
[root@48dece440eb3 /]# cd /usr/local/
[root@48dece440eb3 local]# ls
bin etc games include lib lib64 libexec sbin share src volume01
#6.创建一个测试文件
[root@48dece440eb3 local]# cd volume01/
[root@48dece440eb3 volume01]# touch file01.txt
[root@48dece440eb3 volume01]# echo "this file create in container" > file01.txt
#7.使用 ctrl+p+q 不停止容器退出
#8.进入宿主机挂载目录查看
[root@privateCloud ]# cd /home/centos_volume/
[root@privateCloud /home/centos_volume ]# cat file01.txt
this file create in container
匿名挂载示例:
#1.使用匿名挂载方式启动容器
[root@privateCloud /]# docker run -it -d --name mycentos2 -v /usr/local/data centos
175034d3759bb678877fcaaba6db2b9cd50aa9e61a7cb5770a48370032f07d1f
#2.进入容器
[root@privateCloud /]# docker exec -it 175034d3759b /bin/bash
#3.在挂载目录创建测试文件
[root@175034d3759b /]# cd /usr/local/data/
[root@175034d3759b data]# echo "test anonymous volume" > file02.txt
#4.查看挂载信息
[root@privateCloud /]# docker inspect 175034d3759b
#5.在"Mounts"部分可以看到Docker自动分配的卷位置:
"Mounts": [
{
"Type": "volume",
"Name": "随机生成的卷名",
"Source": "/var/lib/docker/volumes/xxx/_data",
"Destination": "/usr/local/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
需要注意的重要事项:
-
数据卷的生命周期:
- 容器停止(stop)不会导致数据卷被删除
- 容器删除(rm)默认也不会删除数据中
- 只有显式使用 docker volume rm 命令或在创建容器时使用 --rm 参数,相应的数据卷才会被删除
-
常用的数据管理命令:
# 查看所有数据卷 docker volume ls # 查看数据卷详细信息 docker volume inspect volume_name # 删除指定数据卷 docker volume rm volume_name # 删除所有未使用的数据卷 docker volume prune
-
数据卷的权限设置:
# 只读挂载
docker run -v volume_name:/container/path:ro
# 读写挂载(默认)
docker run -v volume_name:/container/path:rw