挂载方式命令详解

卷管理命令说明
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost _data]# docker volume --help

Usage: docker volume COMMAND

Manage volumes

Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes

volume 管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker volume ls				 #列出所有卷
docker volume create 卷名 #创建卷
docker volume inspect 卷名 #查看卷详细信息
docker volume rm 卷名1 卷名2 #删除卷
docker volume prune #删除未被使用的卷,容器停止的占用的卷也不会删除

#volume mounts(固定目录数据卷挂载)
docker run --mount [type=volume,]source=卷名,target=容器文件夹 镜像名

#bind mounts(自定义目录挂载)
docker run --mount type=bind,source=宿主机文件夹,target=容器内文件夹 镜像名

#tmpfs mounts(内存挂载)
docker run --mount type=tmpfs,target=容器内文件夹 镜像名

volume(固定目录数据卷挂载)

  • volume可以通过docker volume命令集被管理,创建的卷就是宿主机的固定文件夹/var/lib/docker/volumes/卷名/_data
  • 手动创建卷,卷文件夹为空,挂载到容器,容器文件夹覆盖卷文件夹
  • 手动创建卷,卷文件夹不为空,挂载到容器,卷文件夹覆盖容器文件夹
  • 不存在的卷会自动创建,容器文件夹覆盖卷文件夹
固定目录挂载数据卷演示
查看卷列表,创建volume数据卷,查看卷信息,查看卷详情,查看卷文件夹没有文件
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
#查看当前所有数据卷信息
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME

#创建volume数据卷
[root@localhost ~]# docker volume create nginx_v1
nginx_v1

#查看卷信息
[root@localhost ~]# docker volume inspect nginx_v1
[
{
"CreatedAt": "2021-12-03T15:28:04+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx_v1/_data",
"Name": "nginx_v1",
"Options": {},
"Scope": "local"
}
]

#查看卷文件夹没有文件
[root@localhost ~]# cd /var/lib/docker/volumes/nginx_v1/_data
[root@localhost _data]# ls
手动创建卷,卷文件夹为空,挂载到容器,容器文件夹覆盖卷文件夹
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
#运行容器挂载到卷
[root@localhost _data]# docker run -d -p 8561:80 --name nginx_cv1 --mount source=nginx_v1,target=/usr/share/nginx/html nginx
e8158f0887ec6f515b8ca0a752c30c99fc1ac3323fd47a32c45a83bfff9c621d

#查看容器卷信息
[root@localhost _data]# docker inspect nginx_cv1
[
{
...
"Mounts": [
{
"Type": "volume",
"Name": "nginx_v1",
"Source": "/var/lib/docker/volumes/nginx_v1/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
]
...
}
]

#查看卷文件夹,容器目录文件挂载出来了
[root@localhost _data]# ls
50x.html index.html
卷里面添加文件,进入容器查看,容器文件夹也能看到该文件,且可以访问成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#卷里面添加文件
[root@localhost _data]# echo v1test>>test.html
[root@localhost _data]# ls
50x.html index.html test.html

#进入容器查看,容器文件夹也添加了该文件
[root@localhost _data]# docker exec -it nginx_cv1 /bin/bash
root@c601ab5eb057:/# cd /usr/share/nginx/html
root@c601ab5eb057:/usr/share/nginx/html# ls
50x.html index.html test.html
root@c601ab5eb057:/usr/share/nginx/html# read escape sequence

#访问成功
[root@localhost _data]# curl localhost:8561/test.html
v1test
关闭删除容器,宿主机文件夹文件依然存在,持久化成功
1
2
3
4
5
6
7
8
9
10
11
#关闭容器,文件依然在卷里
[root@localhost _data]# docker stop nginx_cv1
nginx_cv1
[root@localhost _data]# ls
50x.html index.html test.html

#删除容器,文件依然在卷里
[root@localhost _data]# docker rm -f nginx_cv1
nginx_cv1
[root@localhost _data]# ls
50x.html index.html test.html
手动创建卷,卷文件夹不为空,挂载到容器,卷文件夹覆盖容器文件夹
1
2
3
4
5
6
7
8
9
10
11
#运行容器挂载到卷
[root@localhost _data]# docker run -d -p 8562:80 --name nginx_cv2 --mount source=nginx_v1,target=/usr/share/nginx/html nginx
4ed35df5bfa7f6a7a897e453fe284c0f6b918cce2aa7853d10d00616194bc9d2

#测试文件还在
[root@localhost _data]# ls
50x.html index.html test.html

#访问测试文件成功
[root@localhost _data]# curl localhost:8562/test.html
v1test
不创建卷,直接挂载不存在的卷到容器,会自动创建卷,容器文件夹覆盖卷文件夹
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
#查看当前的所有卷
[root@localhost _data]# docker volume ls
DRIVER VOLUME NAME
local nginx_v1

#运行容器,挂载未创建的卷,自动创建卷
[root@localhost _data]# docker run -d -p 8563:80 --name nginx_cv3 --mount source=nginx_v3,target=/usr/share/nginx/html nginx
5d5671155661b165085a65f26d674ca91d9cdf84d90b34fcf074a15362a0eb87
[root@localhost _data]# docker volume ls
DRIVER VOLUME NAME
local nginx_v1
local nginx_v3

#查看卷信息,卷文件夹,容器文件夹覆盖卷文件夹
[root@localhost _data]# docker volume inspect nginx_v3
[
{
"CreatedAt": "2022-01-08T19:59:23+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx_v3/_data",
"Name": "nginx_v3",
"Options": null,
"Scope": "local"
}
]
[root@localhost _data]# cd /var/lib/docker/volumes/nginx_v3/_data
[root@localhost _data]# ls
50x.html index.html

bind mounts(自定义目录挂载)

  • 运行容器挂载宿主机文件夹,宿主机文件夹不存在报错
  • 宿主机文件夹为空,运行容器挂载宿主机文件夹,宿主机文件夹覆盖容器文件夹
  • 宿主机文件夹非空,运行容器挂载宿主机文件夹,宿主机文件夹覆盖容器文件夹
自定义目录挂载数据卷演示
运行容器挂载宿主机文件夹,宿主机文件夹不存在,报错!
1
2
3
[root@localhost _data]# docker run -d -p 8571:80 --name nginx_cb1 --mount type=bind,source=/var/lib/mydocker/nginx_b1,target=/usr/share/nginx/html nginx
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /var/lib/mydocker/nginx_b1.
See 'docker run --help'.
宿主机文件夹为空,运行容器挂载宿主机文件夹,宿主机文件夹覆盖容器文件夹
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
#创建宿主机文件夹
[root@localhost _data]# cd /var/lib
[root@localhost lib]# mkdir -p mydocker/nginx_b1

#运行容器挂载宿主机文件夹
[root@localhost lib]# docker run -d -p 8571:80 --name nginx_cb1 --mount type=bind,source=/var/lib/mydocker/nginx_b1,target=/usr/share/nginx/html nginx
53d66a64ba1dea4b6ba3c17230cd2e73d09b0820c697c0a47cf00cc943d091dd

#查看容器挂载信息,类型bind
[root@localhost lib]# docker inspect nginx_cb1
[
{
...
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/mydocker/nginx_b1",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
...
}
]

#查看宿主机文件夹,文件还是空
[root@localhost lib]# cd /var/lib/mydocker/nginx_b1
[root@localhost nginx_b1]# ls

#进入容器,查看文件为空,被宿主机覆盖
[root@localhost nginx_b1]# docker exec -it nginx_cb1 /bin/bash
root@53d66a64ba1d:/# cd /usr/share/nginx/html
root@53d66a64ba1d:/usr/share/nginx/html# ls
root@53d66a64ba1d:/usr/share/nginx/html# read escape sequence
宿主机文件夹添加文件,进入容器查看,容器文件夹也能看到该文件,且可以访问成功
1
2
3
4
5
6
7
8
9
10
11
12
13
#宿主机文件夹添加文件文件
[root@localhost nginx_b1]# echo b1test>>test.html
[root@localhost nginx_b1]# ls
test.html

#进入容器查看,容器文件夹也能看到该文件,且可以访问成功
[root@localhost nginx_b1]# docker exec -it nginx_cb1 /bin/bash
root@53d66a64ba1d:/# cd /usr/share/nginx/html
root@53d66a64ba1d:/usr/share/nginx/html# ls
test.html
root@53d66a64ba1d:/usr/share/nginx/html# read escape sequence
[root@localhost nginx_b1]# curl localhost:8571/test.html
b1test
关闭删除容器,宿主机文件夹文件依然存在,持久化成功
1
2
3
4
5
6
7
8
9
10
11
#关闭容器,宿主机文件夹文件依然存在
[root@localhost nginx_b1]# docker stop nginx_cb1
nginx_cb1
[root@localhost nginx_b1]# ls
test.html

#删除容器,文件依然在卷里
[root@localhost nginx_b1]# docker rm -f nginx_cb1
nginx_cb1
[root@localhost nginx_b1]# ls
test.html
宿主机文件夹非空,运行容器挂载宿主机文件夹,宿主机文件夹覆盖容器文件夹
1
2
3
4
5
6
7
8
9
#运行容器挂载宿主机文件夹
[root@localhost nginx_b1]# docker run -d -p 8572:80 --name=nginx_cb2 --mount type=bind,source=/var/lib/mydocker/nginx_b1,target=/usr/share/nginx/html nginx
f5ef981caaca239ae14a261595ec26b99ea6a30e7dd5778330d23e940101a72a

#宿主机文件还在,访问成功ls
[root@localhost nginx_b1]# ls
test.html
[root@localhost nginx_b1]# curl localhost:8572/test.html
b1test

tmpfs mounts(内存挂载)

内存挂载数据卷演示
挂载到宿主机内存,容器文件夹文件被覆盖掉了
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
#创建容器
[root@localhost nginx_v3]# docker run -d -p 8581:80 --name=nginx_ct1 --mount type=tmpfs,target=/usr/share/nginx/html nginx
6031e0ffc52d876a789c05473434e787641a14d84580fe74eac0df97b6212b07

#查看容器挂载详情
[root@localhost nginx_v3]# docker inspect nginx_ct1
[
{
...
"Mounts": [
{
"Type": "tmpfs",
"Source": "",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
...
}
]

#进入容器,添加测试文件,访问成功
[root@localhost nginx_b1]# docker exec -it nginx_ct1 /bin/bash
root@09593f4c5c55:/# cd /usr/share/nginx/html
root@09593f4c5c55:/usr/share/nginx/html# echo tmpfstest>test.html
root@09593f4c5c55:/usr/share/nginx/html# ls
test.html
root@09593f4c5c55:/usr/share/nginx/html# read escape sequence
[root@localhost nginx_b1]# curl localhost:8581/test.html
tmpfstest
停止容器再启动,重新访问失败,文件无法持久化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#停止容器再启动,重新访问失败,文件无法持久化
[root@localhost nginx_b1]# docker stop nginx_ct1
nginx_ct1
[root@localhost nginx_b1]# docker start nginx_ct1
nginx_ct1

[root@localhost nginx_b1]# curl localhost:8581/test.html
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>