总结:

-v 容器内路径 #匿名挂载

-v 卷名:容器内路径 #具名挂载

-v /宿主机路径:容器内路径 #指定路径挂载

使用数据卷挂载时通常要指定主机目录和容器内目录。

而匿名挂载是不指定主机目录,让Docker在主机生成一个目录用来完成主机目录和容器目录之间的挂载。

匿名挂载示例:

-v 后面只用写容器内的目录

1
$ docker run -d -P --name nginx01 -v /etc/nginx nginx

查看已挂载的卷:

1
2
3
4
5
6
$ docker volume ls
DRIVER VOLUME NAME
local b3b5c49a7b70d051d7e6016315802e0e76e2fcf51c6f063154e6003ea4bacc64
local c2e4e840333c3822a97c72237aa193a5c86117814d3d650b784a4ebde775dafc
local cout-test-vol

具名挂载示例:

-v后面的格式是主机卷名称:容器内目录 

1
$ docker run -d -P --name nginx02 -v test-nginx:/etc/nginx nginx

再次查看已挂载的卷:

1
2
3
4
5
6
$ docker volume ls 
DRIVER VOLUME NAME
local b3b5c49a7b70d051d7e6016315802e0e76e2fcf51c6f063154e6003ea4bacc64
local c2e4e840333c3822a97c72237aa193a5c86117814d3d650b784a4ebde775dafc
local cout-test-vol
local test-nginx

多出一个名为test-nginx 的卷。

查看这个卷的详细信息:

1
2
3
4
5
6
7
8
9
10
11
12
$ docker volume inspect test-nginx
[
{
"CreatedAt": "2021-01-08T22:01:26+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/test-nginx/_data",
"Name": "test-nginx",
"Options": null,
"Scope": "local"
}
]

可见,Docker将主机上生成了/var/lib/docker/volumes/test-nginx/_data目录,并将该目录与容器内指定目录进行了双向绑定。

拓展:

1
2
3
4
5
6
7
8
9
# 通过 -v 容器内路径: ro rw 改变读写权限
ro read only # 只读
rw read write # 可读可写

# 一旦设置了容器权限,容器对我们挂在出来的内容就有限定了
$ docker run -d -P --name nginx02 -v test-nginx:/etc/nginx:ro nginx
$ docker run -d -P --name nginx02 -v test-nginx:/etc/nginx:rw nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作,而容器内部无法操作