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

容器数据卷

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

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

安装mysql

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

1
2
3
4
5
6
7
docker run -d -p 3305:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7

-v:挂载卷

-e:配置环境,这里是设置root密码

本地创建数据库,数据直接是同步的。就算将容器删除,挂载到本地的数据卷中的数据也不会丢失

具名挂载和匿名挂载

匿名挂载

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

1
[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
[root@VM-0-7-centos ~]# docker volume ls
DRIVER VOLUME NAME
local 39e68d440c53a251de69252c9e767a0386c88ddcf699d7ba42ec556e8c94d74b

[root@VM-0-7-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25b3bd3c330b nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:49153->80/tcp, :::49153->80/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
[root@VM-0-7-centos _data]# docker run -d -P --name nginx -v jmnginx:/etc/nginx nginx
8052e5458d216512b650455d97713e30fdb0dd31b49e22335cef8bb2a7625532
[root@VM-0-7-centos _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8052e5458d21 nginx "/docker-entrypoint.…" 8 seconds ago Up 6 seconds 0.0.0.0:49154->80/tcp, :::49154->80/tcp nginx

[root@VM-0-7-centos _data]# docker volume ls
DRIVER VOLUME NAME
local 39e68d440c53a251de69252c9e767a0386c88ddcf699d7ba42ec556e8c94d74b
local 5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d
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
[root@VM-0-7-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
[root@VM-0-7-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
[root@VM-0-7-centos docker-test-volume]# docker build -f dockerfile01 -t yuanzhou/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["Vvolume01","volume02"]
---> Running in 794cbe294f47
Removing intermediate container 794cbe294f47
---> 64be4f7b9f83
Step 3/4 : CMD echo "-------------end--------"
---> Running in f16a4be3b1c0
Removing intermediate container f16a4be3b1c0
---> e9f0e352192d
Step 4/4 : CMD /bin/bash
---> Running in 7c1a9d4a1363
Removing intermediate container 7c1a9d4a1363
---> 989969f6fbad
Successfully built 989969f6fbad
Successfully tagged yuanzhou/centos:1.0

[root@VM-0-7-centos docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yuanzhou/centos 1.0 989969f6fbad 3 minutes ago 231MB

启动镜像

这种挂载也较为常用,如果构建镜像时没有挂载,就需要手动-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
[root@VM-0-7-centos docker-test-volume]# docker run -it yuanzhou/centos:1.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
docker run -it --name centos02 --volumes-from d6afa730c9b7 yuanzhou/centos:1.0

--volumes-from 从第一台机器volume出来的容器,数据卷目录的是共享的,即使源容器删掉目录也不会丢失,因为文件本身是存储在宿主机上的

Docker进阶-挂载-容器数据卷
https://zhouyinglin.cn/post/46cf604d.html
作者
小周
发布于
2022年8月6日
更新于
2022年12月15日
许可协议