undefined

容器数据卷

docker 容器中会有一个小型的文件系统,数据会存储在容器内部,但是如果容器被删除,数据就会被丢失。因此如果需要数据持久化,应该存储在宿主机的文件系统中。所以产生了容器卷技术

容器的持久化和同步操作!容器间也可以共享数据

使用数据卷

方式一:直接使用命令来挂载 -v

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -v 主机位置:容器位置
docker run -it -v /home/test:/home 容器id /bin/bash

docker inspect 容器id # 可以看到 mounts 的信息
"Mounts": [
{
"Type": "bind",
"Source": "/home/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

容器退出,修改宿主机的本地文件,重新启动容器之后,容器依然可以同步到。

mysql 实战

1
2
3
4
5
6
7
8
9
docker pull mysql:5.7
docker run -d -p 3310:3306 -v /home/mysql:
# 官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag

docker run -d -p 3310:3306 -v /tmp/mysql/conf:/etc/mysql/conf.d -v /tmp/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# -e 环境配置
# --name 容器名字

mysql -h127.0.0.1 -P3310 -uroot -p123456

具名和匿名挂载

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
# 匿名挂载
-P 随机映射端口
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx 容器id

# 查看所有的 volume 卷的情况
docker volume ls
# 这就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径

# 具名挂载
# -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx 容器id
# 查看所有卷(包括具名和匿名)
docker volume ls
# 查看某个卷
docker volume inspect 卷名

root@9-134-239-95:tmp# docker volume ls
DRIVER VOLUME NAME
local a6b5c7a05b0a714a1cb78c1c9bad703b51d81b4ef4b3f87925ee9bb220af6a33
local f1d577850ac892a3f9b3d0685c58d5e3fcc4a0717ce3fb4712538233300e4de9
local fe7053b29a9abfae3f9d24c6ce3e05c3a16bb9870333fafa8a7733ada2932f8e
local jumping-nginx
root@9-134-239-95:tmp# docker volume inspect jumping-nginx
[
{
"CreatedAt": "2021-11-20T11:23:23+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/jumping-nginx/_data",
"Name": "jumping-nginx",
"Options": null,
"Scope": "local"
}
]

所有docker 容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况是使用 具名挂载

1
2
3
4
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载

扩展

1
2
3
4
5
6
7
8
9
# 通过 -v 容器内了路径,ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写

# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx

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