-v灵活的挂载方式

-v 等价于 –volume,可以实现三种类型的挂载,匿名挂载、具名挂载、指定路径挂载

1
2
3
docker run -v 容器内目录  镜像名             #匿名挂载,volume类型
docker run -v 卷名:容器内目录 镜像名 #具名挂载,volume类型
docker run -v 宿主机路径:容器内路径 镜像名 #指定路径挂载,bind类型

匿名挂载,volume类型

  • docker run -v 容器内目录 镜像名
  • 自动创建卷,容器文件夹覆盖宿主机文件夹
匿名挂载演示
自动创建卷,容器文件夹覆盖宿主机文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#查看已有的卷
[root@localhost nginx_b1]# docker volume ls
DRIVER VOLUME NAME
local nginx_v1
local nginx_v3

#运行容器,-v匿名挂载
[root@localhost nginx_b1]# docker run -d --name nginx_c_v1 -p 8591:80 -v /usr/share/nginx/html nginx
5a2f59d8b4619e229ca4aeed31c15d98b9da0e54a666790c2a7f556d64f7b7b0

#自动生成新的卷
[root@localhost nginx_b1]# docker volume ls
DRIVER VOLUME NAME
local 25e37107425180f45d3ea8182ee738eb4e7434717bf0f4d7ef05aeef4ecb2c04
local nginx_v1
local nginx_v3

#查看容器详情,类型volume
[root@localhost nginx_b1]# docker inspect nginx_c_v1
[
{
...
"Mounts": [
{
"Type": "volume",
"Name": "25e37107425180f45d3ea8182ee738eb4e7434717bf0f4d7ef05aeef4ecb2c04",
"Source": "/var/lib/docker/volumes/25e37107425180f45d3ea8182ee738eb4e7434717bf0f4d7ef05aeef4ecb2c04/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
}
]

#进入卷文件夹,容器文件夹覆盖宿主机文件夹
[root@localhost nginx_b1]# cd /var/lib/docker/volumes/25e37107425180f45d3ea8182ee738eb4e7434717bf0f4d7ef05aeef4ecb2c04/_data
[root@localhost _data]# ls
50x.html index.html

具名挂载,volume类型

  • docker run -v 卷名:容器内目录 镜像名
  • 手动创建卷,宿主机文件夹为空,容器文件夹覆盖宿主机文件夹
  • 手动创建卷,宿主机文件夹非空,宿主机文件夹覆盖容器文件夹
  • 不存在的卷会自动创建,容器文件夹覆盖宿主机文件夹
具名挂载演示
手动创建卷,宿主机文件夹为空,容器文件夹覆盖宿主机文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#创建新卷
[root@localhost _data]# docker volume create nginx_v_v2
nginx_v_v2
[root@localhost _data]# docker volume ls
DRIVER VOLUME NAME
local 25e37107425180f45d3ea8182ee738eb4e7434717bf0f4d7ef05aeef4ecb2c04
local nginx_v1
local nginx_v3
local nginx_v_v2

#运行容器,-v 具名挂载
[root@localhost _data]# docker run -d --name nginx_c_v2 -p 8592:80 -v nginx_v_v2:/usr/share/nginx/html nginx
7697a36778b7503028401eb8e175330353577c3b220bdab72936f1bdeff89fcf

#查看容器详情
[root@localhost _data]# docker inspect nginx_c_v2
[
{
"Mounts": [
{
"Type": "volume",
"Name": "nginx_v_v2",
"Source": "/var/lib/docker/volumes/nginx_v_v2/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
]
}
]
[root@localhost _data]# cd /var/lib/docker/volumes/nginx_v_v2/_data
[root@localhost _data]# ls
50x.html index.html
手动创建卷,宿主机文件夹非空,宿主机文件夹覆盖容器文件夹
1
2
3
4
5
6
7
8
9
10
11
12
#文件夹添加测试文件
[root@localhost _data]# echo -vtest>>test.html
[root@localhost _data]# ls
50x.html index.html test.html

#运行容器,-v 具名挂载
[root@localhost _data]# docker run -d --name nginx_c_v3 -p 8593:80 -v nginx_v_v2:/usr/share/nginx/html nginx
a916f1d3c625bb49e6591fb04e44372059d8131ce6ce4cdd406c30a89b314cdf

#宿主机文件夹覆盖容器文件夹
[root@localhost _data]# ls
50x.html index.html test.html
不存在的卷会自动创建,容器文件夹覆盖宿主机文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#查看现有卷
[root@localhost _data]# docker volume ls
DRIVER VOLUME NAME
local 25e37107425180f45d3ea8182ee738eb4e7434717bf0f4d7ef05aeef4ecb2c04
local nginx_v1
local nginx_v3
local nginx_v_v2

#运行容器,-v 具名挂载,卷不存在,自动创建成功
[root@localhost _data]# docker run -d --name nginx_c_v4 -p 8594:80 -v nginx_v_v4:/usr/share/nginx/html nginx
bf4bcd3a37adaab8ad6d342088bc47297ff533b4e8a069e11b296f0d55d3f49
[root@localhost _data]# docker volume ls
DRIVER VOLUME NAME
local 25e37107425180f45d3ea8182ee738eb4e7434717bf0f4d7ef05aeef4ecb2c04
local nginx_v1
local nginx_v3
local nginx_v_v2
local nginx_v_v4

#容器文件夹覆盖宿主机文件夹
[root@localhost _data]# docker volume inspect nginx_v_v4
[
{
"CreatedAt": "2022-01-08T23:08:49+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx_v_v4/_data",
"Name": "nginx_v_v4",
"Options": null,
"Scope": "local"
}
]
[root@localhost _data]# cd /var/lib/docker/volumes/nginx_v_v4/_data
[root@localhost _data]# ls
50x.html index.html

指定路径挂载,bind类型

  • docker run -v 宿主机路径:容器内路径 镜像名
  • 创建宿主机文件夹,宿主机文件夹为空,宿主机文件夹覆盖容器文件夹
  • 创建宿主机文件夹,宿主机文件夹非空,宿主机文件夹覆盖容器文件夹
  • 不创建宿主机文件夹,自动创建空文件夹,宿主机文件夹覆盖容器文件夹
指定路径挂载演示
创建宿主机文件夹,宿主机文件夹为空,宿主机文件夹覆盖容器文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# cd /var/lib/mydocker
[root@localhost mydocker]# ls
nginx_b1 nginx_crun

[root@localhost mydocker]# mkdir nginx_v_b1
[root@localhost mydocker]# ls
nginx_b1 nginx_crun nginx_v_b1

[root@localhost mydocker]# docker run -d --name nginx_c_b1 -p 8601:80 -v /var/lib/mydocker/nginx_v_b1:/usr/share/nginx/html nginx
fe489f13bf5a94fdbe9a0593a2eb26e97f350a19ba152f7c1bae4880e495ecd9

[root@localhost mydocker]# ls /var/lib/mydocker/nginx_v_b1
[root@localhost mydocker]#
创建宿主机文件夹,宿主机文件夹非空,宿主机文件夹覆盖容器文件夹
1
2
3
4
5
6
7
8
9
[root@localhost mydocker]# echo test>/var/lib/mydocker/nginx_v_b1/test.html
[root@localhost mydocker]# ls /var/lib/mydocker/nginx_v_b1
test.html

[root@localhost mydocker]# docker run -d --name nginx_c_b2 -p 8602:80 -v /var/lib/mydocker/nginx_v_b1:/usr/share/nginx/html nginx
209c8b095680b443b576ae51fd7a09ada8d37c51bd166fbbf561f27be46f7671

[root@localhost mydocker]# ls /var/lib/mydocker/nginx_v_b1
test.html
不创建宿主机文件夹,自动创建空文件夹,宿主机文件夹覆盖容器文件夹
1
2
3
4
5
6
7
8
9
10
[root@localhost mydocker]# ls
nginx_b1 nginx_crun nginx_v_b1

[root@localhost mydocker]# docker run -d --name nginx_c_b3 -p 8603:80 -v /var/lib/mydocker/nginx_v_b3:/usr/share/nginx/html nginx
c326680b684c815c88632b92329a4667b4ff35786b241b84622ca63356c2fe62

[root@localhost mydocker]# ls
nginx_b1 nginx_crun nginx_v_b1 nginx_v_b3
[root@localhost mydocker]# ls /var/lib/mydocker/nginx_v_b3
[root@localhost mydocker]#

指定文件夹的可读可写性质

1
2
3
4
# 通过 -v 容器内路径: ro rw 改变读写权限 
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -v 卷名:容器内目录:ro -p 主机端口:容器内端口 --name 容器名称 镜像名

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

运行容器挂载宿主机目录,宿主机可写,容器内只读
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost mydocker]# docker run -d --name nginx_c_b4 -p 8604:80 -v /var/lib/mydocker/nginx_v_b4:/usr/share/nginx/html:ro nginx
623798a666f981067afede23825db9de2e7d4a7a25870d85f56f98db9ec9d1b7

[root@localhost mydocker]# echo test>/var/lib/mydocker/nginx_v_b4/test.html
[root@localhost mydocker]# ls /var/lib/mydocker/nginx_v_b4
test.html

[root@localhost mydocker]# docker exec -it nginx_c_b4 /bin/bash
root@623798a666f9:/# cd /usr/share/nginx/html
root@623798a666f9:/usr/share/nginx/html# ls
test.html

root@623798a666f9:/usr/share/nginx/html# echo testsss>test2.html
bash: test2.html: Read-only file system