## 什么是数据卷:
相当于redis里面的RDB和AOF持久化,挂载本地的一个目录到container里面,用来存放需要永久保存的数据
###为什么Docker要有数据卷?
因为docker是将运用的运行环境打包形成容器运行,运行的时候数据可以伴随着container一直存在,但是一旦container被删除,数据就丢失了,所以我们想要数据持久化,所以引入了数据卷的概念,可以想成redis的持久化
Docker容器产生的数据,如果不通过Docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了
### 数据卷能干什么:
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于UnionFS(联合文件系统)因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
> 1,数据卷可以在容器之间共享或重用数据
2,卷中的更改可以直接生效
3,数据卷中的更改不会包含在镜像的更新中
4,数据卷的生命周期一直只需到没有容器使用它为止。
### 如何在容器中添加数据卷:
**命令添加:**
> docker run -it -v /宿主机绝对路径目录:/容器内目录:permission mirrors_name(镜像名)
> 如果挂载的和要挂载的地方不存在。他会自己创建;permission: rw读写默认。ro只读
**dockerfile构建一个自带卷组的centos**
我们直接从`https://hub.docker.com/`里面搜索centos的dockerfile文件,自己改改,一会更改的内容我标识出来
```docke
[root@Docker mydocker]# cat dockerfile
FROM centos:latest
VOLUME ["/data_test1","/data_test2"]
CMD ["/bin/bash"]
```
这个dockerfile文件里面基于centos:latest(centos最新版)镜像构建一个我们自己挂载两个数据卷的镜像
```
build 一下把dockerfile变成镜像文件
[root@Docker mydocker]# docker build -f dockerfile -t volume_centos:1.3 .
Sending build context to Docker daemon 5.12 kB
Step 1/3 : FROM centos:latest ---先from基础镜像
---> 5182e96772bf
Step 2/3 : VOLUME /data_test1 /data_test2 ---然后创建两个数据卷volume
---> Running in c7204dcfe31c
---> b476ef88c68a
Removing intermediate container c7204dcfe31c
Step 3/3 : CMD /bin/bash ---执行了这个命令
---> Running in c3b1da0b8847
---> 2a3114e4b5bb
Removing intermediate container c3b1da0b8847
Successfully built 2a3114e4b5bb
```
这个时候我们可以使用docker images 来查看我们刚刚构建的镜像
```
[root@Docker mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
volume_centos 1.3 2a3114e4b5bb 5 minutes ago 200 MB
```
可以看出来我们刚才构建镜像已经成功了
我们现在来运行一下,看看它是否真的自动挂载两个数据卷volume了
```
[root@Docker mydocker]# docker run -it --name volume volume_centos:1.3
[root@d0021331d0d7 /]# ls
anaconda-post.log data_test1 dev home lib64 mnt proc run srv tmp va
bin data_test2 etc lib media opt root sbin sys us
```
这个时候我们可以看出,在这个容器中的根目录下面已经生成来咱们刚才挂载的两个volume了。我们测试一下看能不能写内容进去
```
[root@d0021331d0d7 /]# touch /data_test{1,2}/test.txt
[root@d0021331d0d7 /]# ls /data_test{1,2}
/data_test1:
test.txt
/data_test2:
test.txt
```
可以看出我们能正常读写,但是这个数据卷挂载到本地的那个地方了呢?我们先ctrl+p+q不暂停退出这个容器去找一下
```
[root@Docker mydocker]# docker inspect volume
"Mounts": [
{
"Type": "volume",
"Name": "24799514bfafd7423aa56976fe34833b80db5e292c60d53fd2a1dda8cc187908",
"Source": "/var/lib/docker/volumes/24799514bfafd7423aa56976fe34833b80db5e292c60d53fd2a1dda8cc187908/_data",
"Destination": "/data_test1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "d46138dd071b0862ca674ec93832da67fda324d9d4970517d119af412af65e79",
"Source": "/var/lib/docker/volumes/d46138dd071b0862ca674ec93832da67fda324d9d4970517d119af412af65e79/_data",
"Destination": "/data_test2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
```
通过上面的source可以看出来挂载点是在自己本地的这个地方,我们去看看有没有刚才在容器里面写的数据在本地磁盘上
```
[root@Docker mydocker]# ls /var/lib/docker/volumes/d46138dd071b0862ca674ec93832da67fda324d9d4970517d119af412af65e79/_data
test.txt
[root@Docker mydocker]# ls /var/lib/docker/volumes/24799514bfafd7423aa56976fe34833b80db5e292c60d53fd2a1dda8cc187908/_data
test.txt
```
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。