前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器数据卷:

容器数据卷:

原创
作者头像
张琳兮
发布2018-09-13 23:38:32
9600
发布2018-09-13 23:38:32
举报
文章被收录于专栏:首富手记首富手记

## 什么是数据卷:

相当于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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档