Docker进阶-挂载-容器数据卷

容器数据卷

卷技术,作用是数据共享。由于容器删除后内部修改的数据也会丢失,因此需要有个地方存储数据。 卷技术可以让容器本地产生的数据映射到本地,卷技术的本质是目录的挂载,将容器内部的目录挂载到宿主机上,实现容器持久化。包括容器间也可以共享

1
2
3
docker
-v 主机目录:容器目录
# 就算重启容器,映射关系也还是会存在

安装mysql

navicat连接到云服务器的3305端口,映射到docker容器的3306端口,即可连接成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker run -d -p 
:
-v
/home/my
sql
/conf:/
etc
/mysql/
conf.d -v
/home/my
sql
/data:/
var
/lib/my
sql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:
.7
-v:挂载卷
-e:配置环境,这里是设置root密码
本地创建数据库,数据直接是同步的。就算将容器删除,挂载到本地的数据卷中的数据也不会丢失

具名挂载和匿名挂载

匿名挂载

没有给挂载点取名。在-v时没有写容器外的路径,只写了容器内的路径

1
2
3
4
5
[root@VM-0-7-centos ~]
# docker run -d -
P
--name
jmnginx -v /etc/nginx nginx

可以发现,匿名挂载的外部路径,默认是在 /var/lib/docker/volumes/xxx/_data

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[root@VM-0-7-centos ~]
# docker volume ls
DRIVER VOLUME NAME
local
e
d440c53a251de69252c9e767a0386c88ddcf699d7ba42ec556e8c94d74b
[root@VM-0-7-centos ~]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b
bd3c330b nginx
"/docker-entrypoint.…"
minutes ago Up
minutes
.0
.
.0
:
->
/tcp, :::
->
/tcp jmnginx
[root@VM-0-7-centos ~]
# docker inspect jmnginx
…………
"Mounts"
: [
{
"Type"
:
"volume"
,
"Name"
:
"5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d"
,
"Source"
:
"/var/lib/docker/volumes/5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d/_data"
,
"Destination"
:
"/etc/nginx"
,
"Driver"
:
"local"
,
"Mode"
:
""
,
"RW"
:
true
,
"Propagation"
:
""
}
],
…………

具名挂载

为挂载卷指定名字,方便查找卷,一般都是使用具名挂载

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
[root
@VM
-0
-7
-centos _data]
# docker run -d -P --name nginx -v jmnginx:/etc/nginx nginx
e5458
d216512b650455d97713e30fdb0dd31b49e22335cef8bb2a7625532
[root
@VM
-0
-7
-centos _data]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5458
d21 nginx
"/docker-entrypoint.…"
seconds ago Up
seconds
.0
.0
.0
:
->
/tcp, :::
->
/tcp nginx
[root
@VM
-0
-7
-centos _data]
# docker volume ls
DRIVER VOLUME NAME
local
e68
d440c53a251de69252c9e767a0386c88ddcf699d7ba42ec556e8c94d74b
local
b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d
local
jmnginx
[root
@VM
-0
-7
-centos _data]
# docker volume inspect jmnginx
[
{
"CreatedAt"
:
"2021-12-05T16:57:41+08:00"
,
"Driver"
:
"local"
,
"Labels"
:
null
,
"Mountpoint"
:
"/var/lib/docker/volumes/jmnginx/_data"
,
"Name"
:
"jmnginx"
,
"Options"
:
null
,
"Scope"
:
"local"
}
]
[root
@VM
-0
-7
-centos _data]
#

扩展

为容器挂载出来的内容设置读写权限

1
2
3
4
5
6
7
8
9
10
11
12
[root@VM-
-
-centos _data]# docker run -d -P --name nginx -v jmnginx:
/etc/
nginx:ro/rw nginx
:ro
read
-only 只读,只可通诺宿主机来操作,容器内不无法操作
:rw
read
write
可读写(默认)

在DockerFile中挂载

dockerfile用于构建docker镜像的构建文件,命令脚本。docker镜像是一层层的,dockerfile也是一个个命令的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@VM-
-
-centos docker-test-
volume
]
# cat dockerfile01 #新建脚本,注意,脚本中的指令都是大写的
FROM
centos
VOLUME
[
"volume01"
,
"volume02"
]
CMD
echo
"-------------end--------"
CMD
/bin/bash

构建镜像

-f file名 -t 镜像名

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[root@VM-
-
-centos docker-test-volume]# docker build -f dockerfile01 -t yuanzhou/centos:
.0
.
Sending build context to Docker daemon
.048
kB
Step
/
:
FROM
centos
---> 5d0da3dc9764
Step
/
:
VOLUME
[
"Vvolume01"
,
"volume02"
]
---> Running in 794cbe294f47
Removing intermediate container
cbe294f47
---> 64be4f7b9f83
Step
/
:
CMD
echo
"-------------end--------"
---> Running in f16a4be3b1c0
Removing intermediate container f16a4be3b1c0
---> e9f0e352192d
Step
/
:
CMD
/bin/bash
---> Running in 7c1a9d4a1363
Removing intermediate container
c1a9d4a1363
---> 989969f6fbad
Successfully built
f6fbad
Successfully
tagged
yuanzhou/centos:
.0
[root@VM-
-
-centos docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yuanzhou/centos
.0
f6fbad
minutes ago
MB

启动镜像

这种挂载也较为常用,如果构建镜像时没有挂载,就需要手动-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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[root@VM
-0
-7
-centos docker-test-volume]# docker run -it yuanzhou/centos:
.0
/bin/bash
[root@d6afa730c9b7 /]# ls
volume01 bin dev etc home lib lib64 lost+found media mnt opt
proc
root
run
sbin
srv
sys
tmp
usr
var
volume02
#这里的volume01和volume02就是创建镜像时自动挂载的,这种目录属于匿名目录。使用inspect可以查看宿主机的目录
"Mounts": [
{
"Type"
:
"volume"
,
"Name"
:
"c432ac4c1479b54b8b2248a5bd982b0d95f2909e605b0d1744bd9734c9f093f6"
,
"Source"
:
"/var/lib/docker/volumes/c432ac4c1479b54b8b2248a5bd982b0d95f2909e605b0d1744bd9734c9f093f6/_data"
,
"Destination"
:
"Vvolume01"
,
"Driver"
:
"local"
,
"Mode"
:
""
,
"RW"
: true,
"Propagation"
:
""
},
{
"Type"
:
"volume"
,
"Name"
:
"358875250c31b98b1b5ff64e17f7873f5b3ed65f75207e5f127d430ef89b5221"
,
"Source"
:
"/var/lib/docker/volumes/358875250c31b98b1b5ff64e17f7873f5b3ed65f75207e5f127d430ef89b5221/_data"
,
"Destination"
:
"volume02"
,
"Driver"
:
"local"
,
"Mode"
:
""
,
"RW"
: true,
"Propagation"
:
""
}
],

数据卷容器

多个容器挂载同一个目录。是容器之间的数据共享

数据卷:挂载的目录

1
2
3
4
5
6
docker 
run
-
it
--name centos02 --volumes-from d6afa730c9b7 yuanzhou/centos:1.0
--volumes-from 从第一台机器volume出来的容器,数据卷目录的是共享的,即使源容器删掉目录也不会丢失,因为文件本身是存储在宿主机上的

Docker进阶-挂载-容器数据卷
https://zhouyinglin.top/2022/08/06/Docker进阶-挂载-容器数据卷/
作者
小周
发布于
2022年8月6日
许可协议