Docker数据管理-数据卷 data volumes和数据卷容器data volumes containers的使用详解

此文来源于:https://yq.aliyun.com/ziliao/43471css

参考原文件以外,作了些修改。linux

Volume数据卷是Docker的一个重要概念。数据卷是可供一个或多个容器使用的特殊目录,能够为容器应用存储提供有价值的特性:web

  • 持久化数据与容器的生命周期解耦:在容器删除以后数据卷中的内容能够保持。Docker 1.9以后引进的named volume(命名文件卷)能够更加方便地管理数据卷的生命周期;数据卷能够被独立地建立和删除。
  • 数据卷能够用于实现容器之间的数据共享
  • 能够支持不一样类型的数据存储实现

 

 数据的管理目前提供以下两种方式:docker

  • 数据卷 data volumes
  • 数据卷容器 data volumes containers

 

Docker缺省提供了对宿主机本地文件卷的支持,能够将宿主机的目录挂载到容器之中。因为没有容器分层文件系统带来的性能损失,**本地文件卷很是适合一些须要高性能数据访问的场景**,好比MySQL的数据库文件的存储。同时Docker支持经过volume plugin实现不一样类型的数据卷,能够更加灵活解决不一样应用负载的存储需求。好比在阿里云容器服务中能够为容器提供基于云盘的块存储、基于OSSFS和NAS/NFS的共享文件存储。数据库

 

注意: 数据卷常常出的问题在于权限问题,ossfs只能有一个用户可写,加上allow_other后可多个用户读,但依然是只有一个用户可写。并且ossfs并发为10,若是大量并发的场合显然不合适。 

 

 一,数据卷
数据卷,说白了就是一个特殊目录,相似linux下对目录或文件进行mount挂载操做,只不过他绕过了文件系统。具备以下特色:
(1) 数据卷能够在容器之间进行共享和重用
(2)对数据卷的更改会当即生效
(3)对数据卷的更新不会影响到镜像  (镜像只读)
(4)卷会一直存在,知道没有容器使用centos

数据卷的添加能够经过-v 参数来设定,后边跟上目录。一下举例说明:
1,建立一个数据卷/homedata到容器os123中:bash

[root@docker5 home]# docker  run  -d -ti --name os123   -v  /homedata  centos
[root@docker5 home]# docker  exex  -ti os123 /bin/bash
[root@d1a05a7d5efe /]# ll
total 40
-rw-r--r--. 1 root root 18301 Jun 2 13:27 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Jun 2 13:25 bin > usr/bin
drwxr-xr-x. 5 root root 380 Jun 23 02:42 dev
drwxr-xr-x. 48 root root 4096 Jun 23 02:42 etc
drwxr-xr-x. 2 root root 6 Aug 12 2015 home
drwxr-xr-x. 2 root root 6 Jun 23 02:42 homedata
..
[root@d1a05a7d5efe /]# cd homedata/
[root@d1a05a7d5efe homedata]# ll
total 0
[root@d1a05a7d5efe homedata]# touch  21yunwei.txt ;echo 123>> 21yunwei.txt
[root@d1a05a7d5efe homedata]# cat  21yunwei.txt 
123
2,挂载本地服务器上的一个目录/home/data到容器os456 目录/homedata中:
home/data事先里边创建一个文件1.txt并内容hello world服务器

[root@docker5 home]# docker run  -d -ti --name os456 -v /home/data:/homedata centos
9347d5ef84ffc532000df2637ff3280da001573029e826427d3b71cc88aa4703
[root@docker5 home]# docker exec  -ti os456  /bin/bash
[root@9347d5ef84ff homedata]# cd /homedata;cat  1.txt 
hello world
经过上边两个容器os123 和os456,基本了解了如何建立数据卷以及如何挂载本地目录到数据卷中。注意,两个容器中的若是是单独挂载的数据卷(即没有挂载同一个数据卷容器),那么数据是互不影响的,进入不一样的数据卷相同目录下好比/homedata,内容能够不同。并发

注意:删除容器的时候,数据卷不会删除。若是要删除容器的时候同时删除数据卷,需加上-v参数。好比: docker   rm  os456  -v   /homedatajsp

 

二,数据卷容器
创建的容器不少时候不是单一的,须要容器之间进行数据共享,进行数据同步和更新操做。这样就须要创建一个数据卷容器。
数据卷容器就是一个普通的容器,里边带有设置好的数据卷,专门提供给其余容器挂载使用。 经过–volumes-from 数据卷容器名 来实现。
我有一个网站程序放到了服务器本机的/home/webdata目录 ,下边建立一个数据卷容器webdata,同时将我服务器上的/home/webdata挂载到数据卷容器的/web目录:

[root@docker5 home]# docker  run  -d  -ti  --name webdata   -v  /home/webdata:/home/web  centos
进入容器并查看数据

[root@docker5 home]# docker exec  -ti  webdata  /bin/bash
[root@289598d6e24d /]# cd  /home/web/
[root@289598d6e24d web]# ll
total 7872
drwxr-xr-x. 3 root root      54 Mar 27  2013 META-INF
drwxr-xr-x. 6 root root    4096 Dec 25  2014 WEB-INF
drwxr-xr-x. 3 root root      63 Mar 27  2013 css
drwxr-xr-x. 2 root root    8192 Mar 27  2013 flags
-rw-r--r--. 1 root root      97 Mar 27  2013 index.jsp
drwxr-xr-x. 2 root root    4096 Mar 27  2013 js
drwxr-xr-x. 2 root root       6 Jun 23 03:43 probe
经过这里创建1.txt 并插入内容,能够看到服务器上的/home/webdata数据是同步的。可见容器以及目录挂载都没问题。

[root@docker5 home]# docker  run  -dti --volumes-from webdata --name os147 centos
[root@docker5 home]# docker  run  -dti --volumes-from webdata --name os258 centos
分别建立了两个容器,都经过–volumes-from webdata 挂载了同一个数据卷容器,进入os147 和os258 分别查看/home/web可见数据都是存在的,因而这里就实现了数据的共享同步。

[root@docker5 home]# docker exec  -ti  os147  /bin/bash
[root@b4cfa4c4e11c /]# cd  /home/web/
[root@b4cfa4c4e11c web]# ll
total 7876
-rw-r--r--. 1 root root      11 Jun 23 03:46 1.txt
drwxr-xr-x. 3 root root      54 Mar 27  2013 META-INF
drwxr-xr-x. 6 root root    4096 Dec 25  2014 WEB-INF
drwxr-xr-x. 3 root root      63 Mar 27  2013 css
drwxr-xr-x. 2 root root    8192 Mar 27  2013 flags
-rw-r--r--. 1 root root      97 Mar 27  2013 index.jsp
drwxr-xr-x. 2 root root    4096 Mar 27  2013 js
drwxr-xr-x. 2 root root       6 Jun 23 03:43 probe
说明:
1,能够屡次使用–volume-from参数从多个容器挂载多个目录。  也能够从其余已经挂载了数据卷的容器来挂载数据卷(相似传递)。
2,再次强调:若是删除了挂载的容器,数据卷不会被自动删除。若是要删除容器的时候同时删除数据卷,需加上-v参数。

 

三,经过数据卷容器进行数据备份、数据恢复和数据迁移
1,备份:咱们建立一个专门用来备份probe的容器:probebak进行备份数据卷容器中的数据,命令以下

docker run  -dti --volumes-from webdata  --name probebak -v /home/web_probebak:/backup   centos tar zcvf /backup/web_probe.tar.gz  /home/web
命令为建立一个专用备份的容器probebak,挂载了数据卷容器webdata,同时将服务器本地目录 /home/web_probebak挂载到了备份容器上的/backup目录容器启动之后,会执行tar zcvf /backup/web_proce.tar.gz /home/web操做,完成服务器上/home/web备份,打包到/backup/web_proce.tar.gz,也就是打包到了/home/web_probebak/web_probe.tar.gz 实现了数据备份。

2,恢复
建立一个容器os999  ,挂载有数据卷 /testdata

[root@docker5 home]# docker run  -v  /testdata --name os999  centos  /bin/bash
再建一个容器,经过–volumes-from os999挂载刚才设置好的数据卷,解压数据:

[root@docker5 home]# docker run --volumes-from os999 -v /home/web_probebak:/backup busybox tar zxvf /backup/web_probe.tar.gzUsage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.home/web/home/web/probe.ziphome/web/probe/home/web/css/home/web/css/classic/home/web/css/classic/datasourcetest.css.

相关文章
相关标签/搜索