一、什么是容器数据卷?
为什么Docker需要容器数据卷?因为当我们将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!就好比,你安装一个MySQL,结果不小心把容器删了,那岂不是就相当于删库跑路了,这显然是不允许发生的事情!
为了能保存数据在Docker中我们就可以使用卷!让数据 挂载
到我们本地!这样数据就不会因为容器删除而丢失了!
容器卷的作用:
卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
容器卷的特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
所以:总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!
二、使用数据卷
1、挂载
# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
# 测试
[root@TR ~]# ll
total 1052
drwxr-xr-x 9 1001 1001 4096 Nov 29 20:54 nginx-1.21.4
-rw-r--r-- 1 root root 1070260 Nov 29 20:42 nginx-1.21.4.tar.gz
# 1、创建一个测试文件夹“pangtaiyi”
[root@TR ~]# mkdir pangtaiyi
[root@TR ~]# ll
total 1056
drwxr-xr-x 9 1001 1001 4096 Nov 29 20:54 nginx-1.21.4
-rw-r--r-- 1 root root 1070260 Nov 29 20:42 nginx-1.21.4.tar.gz
drwxr-xr-x 2 root root 4096 Dec 1 21:40 pangtaiyi
# 2、运行Centos 镜像, 并将容器中的 “/root/pangtaiyi” 目录和本地的“/root/pangtaiyi”目录关联起来
[root@TR ~]# docker run -it -v /root/pangtaiyi:/root/pangtaiyi centos /bin/bash
[root@2cb343981d5b /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@2cb343981d5b /]# cd root
[root@2cb343981d5b ~]# ls
anaconda-ks.cfg anaconda-post.log original-ks.cfg pangtaiyi
[root@2cb343981d5b ~]# cd pangtaiyi
# 3、在 “pangtaiyi”文件夹下创建一个“pangtaiyi.txt” 文件
[root@2cb343981d5b pangtaiyi]# touch pangtaiyi.txt
[root@2cb343981d5b pangtaiyi]# ls
pangtaiyi.txt
# 4、退出容器, 看下本地关联的目录下是否有文件生成
[root@2cb343981d5b pangtaiyi]# [root@TR ~]#
[root@TR ~]# cd pangtaiyi
[root@TR pangtaiyi]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 1 21:42 pangtaiyi.txt
2、查询挂载情况
# 语法 “docker inspect 容器ID”
[root@TR ~]# docker inspect 2cb343981d5b
[
{
"Id": "2cb343981d5b4181869b807b51c08af487534333073013186ee4ed540f23b3d5",
"Created": "2021-12-01T13:41:54.89582656Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1850114,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-12-01T13:41:55.330564955Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
..................
"Mounts": [
{
"Type": "bind",
"Source": "/root/pangtaiyi",
"Destination": "/root/pangtaiyi",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
........
}
]
可以看到在 Mounts
中, 有我们之前挂载的两个路径。