什么是容器数据卷

docker 的理念回顾

将应用和环境打包成一个镜像!

数据如果数据都在容器中,容器删除之后数据就会消失 ,我们怎么来保证数据持久化呢?

比如Mysql,容器删掉的话,GG删库跑路,我们要把MySQL的数据存在本地

容器之间有个共享的技术!Docker容器产生的数据,同步到本地

这就是技术卷,目录的挂载,将我们容器内的目录,挂载到Linux上面!

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

使用数据卷

  1. 方式一: 使用 -v命令就像挂载
1
2
3
4
5
6
7
8
9
#挂载容器卷
docker run -it -v 主机目录:容器中目录 镜像名 /bin/bash

# 测试结果
root@again:~# docker run -it -v /home/test:/usr/local/tomcat/webapps tomcat_fg:9.0 /bin/bash
root@2651b9e919b6:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work

容器中新建完文件,主机中查看可以看到,说明同步成功

当我们把容器停止后,我们修改主机的文件,是否可以在容器再次启动同步到容器中呢?

答案是会的

实战,安装配置MySQL

1
2
3
4
5
6
7
8
9
10
# 获取镜像
docker pull mysql:5.7
# 运行容器 数据挂载 #安装启动MySQL,MySQL是需要配置密码的,这是注意点
# -d 后台运行
# -p 配置端口映射
# -e 配置环境
# --name 重命名
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=543210 --name mysql01 mysql:5.7

# 官方测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

测试连接成功

具名挂载和匿名挂载

匿名挂载

1
2
3
4
5
6
7
8
9
10
11
# 匿名挂载
-v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx nginx

# 查看所有的卷的情况
root@again:~# docker volume list
DRIVER VOLUME NAME
local 53912b2c23049d224bbe98482918fb3984a402200cf7c93dc0dd1eeba92b2ba8

# 发现它的数据都是这样的,这就是匿名挂载 我们在 -v 只写了容器内的路径,没有写主机路径
local 53912b2c23049d224bbe98482918fb3984a402200cf7c93dc0dd1eeba92b2ba8

具名挂载

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
# 具名挂载
docker run -d --name nginx02 -v juming_guazai:/etc/nginx nginx

# 查看所有的卷情况

root@again:~# docker volume ls
DRIVER VOLUME NAME
local 53912b2c23049d224bbe98482918fb3984a402200cf7c93dc0dd1eeba92b2ba8
local juming_guazai

# 通过 -v 卷名:容器内路径 来指定
# 查看一下这个卷

root@again:~# docker volume inspect juming_guazai
[
{
"CreatedAt": "2020-10-27T09:58:52+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming_guazai/_data",
"Name": "juming_guazai",
"Options": null,
"Scope": "local"
}
]

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

我们通过一个具名,可以方便的帮助我们找到一个卷,这是大多数情况在用的,不推荐使用具名

如果区别这是匿名挂载还是具名挂载呢 或者是 指定路径挂载呢?

  • -v 容器内路径 匿名挂载
  • -v 具名:容器内路径 具名挂载
  • -v 主机路径:容器内路径 指定路径挂载

拓展

有时候会遇到 后面加个 ro 或者 rw

ro ReadOnly 只读权限
rw ReadWrite 读写权限

一旦设置了权限,容器对我们挂载出来的内容就有限制了

1
2
3
# 只读 一旦看到了 ro说明这个路径只能通过宿主机来操作,容器内部无法操作 

docker run -d --name nginx03 -v test:/etc/nginx:**ro** nginx
1
2
# 
docker run -d --name nginx03 -v test:/etc/nginx:**rw** nginx