一、什么是数据卷

  生成环境中使用docker的过程中,往往需要对数据进行持久化,或者需要多个容器之间进行数据共享,这个就涉及到了容器数据管理

  容器中管理数据主要有两种方式:

  1. 数据卷:容器内数据之间映射到本地主机环境
  2. 数据卷容器:使用特定的容器来维护数据卷

  数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似Linux 的mount挂载

  数据卷的特性

  1. 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便
  2. 对数据卷内数据的修改立马生效,无论是容器内还是本地操作
  3. 对数据卷的更新不会影响镜像,解耦了应用和数据
  4. 卷会一直存在,直到没有容器使用,可以安全的卸载它

二、创建数据卷

  在用docker run 命令的时候,使用 -v 标记可以在容器内创建一个数据卷。多次重复使用 -v 标记可以创建多个数据卷

  1. [root@rsync131 ~]# docker run -it -P -d --name web -v /opt/web/ centos
  2. b0772ffc49ea226536a23ca5d73f1a69c4212407ad54ab406b1b098138e64a65

  PS:-P参数是将容器服务暴露的端口,是自动映射到本地主机的临时端口

  也可以挂载主机目录做我数据卷(经常使用的方式)

  1. [root@rsync131 ~]# docker run -it -P -d --name web1 -v /opt/web:/opt/ centos
  2. acb1b0f0c804ca2b9bbe8c1fe0373c6025c51342e138204e40e74ac9123c8854

  上面的命令是将主机的/opt/web 目录挂载到容器的/opt/下,这样是很方便的在你进行数据修改的是,直接修改本地文件就行了,容器直接就会同步了

  docker 挂载数据卷的默认权限是读写(rw) ,我们也可以改权限

  1. [root@rsync131 ~]# docker run -it -P -d --name web2 -v /opt/web:/opt/:ro centos
  2. 8400a6999dbafe14dd6cb28796dc84595282361e619a8d183db405106e07d85d

  加了:ro 容器内对所挂载的数据卷内的数据就不能修改了

  也可以只挂载本地主机的单个文件到容器中作为数据卷(强烈不推荐,生产也很少用,可忽略)

  1. [root@rsync131 ~]# docker run -it -P -d --name web4 -v /root/.bash_history:/.bash_history centos
  2. b5a45865eca2ad16cde207c9a35702667f3bd9b947383a33451b67098548331e

  

三、数据卷容器

  如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器,数据卷容器也是个容器,但是它的目的是专门用来提供数据卷供其他容器挂载的

  首先创建一个数据卷容器

  1. [root@rsync131 /]# docker run -it -d -v /dbdata --name dbdata centos
  2. ea8c0b5014166f57afc5d7cf52b1ca532e0e0a259f414d2891d0ebf9dc397624
  3. [root@rsync131 /]# docker exec -it ea8c0b5014166f57afc5d7cf52b1ca532e0e0a259f414d2891d0ebf9dc397624 bash
  4. [root@ea8c0b501416 /]# ls
  5. anaconda-post.log bin dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

  挂载

  1. [root@rsync131 /]# docker run -it -d --volumes-from dbdata --name db1 centos
  2. ad8b9458a39c85516f2dc88645af8f3725418d5f4bf058566b0cbc977352490c
  3. [root@rsync131 /]# docker run -it -d --volumes-from dbdata --name db2 centos
  4. b07899fb1a46aa5538fc82dceebc4e53d7abf74ab870e14f916a59a03d1fab45

  此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata 目录,三个容器任何一方在该目录下进行操作,其他的容器都能看见

  测试

  1. # db1 容器
  2. [root@rsync131 /]# docker exec -it db1 bash
  3. [root@ad8b9458a39c /]# cd /
  4. [root@ad8b9458a39c /]# ls
  5. anaconda-post.log bin dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
  6. [root@ad8b9458a39c /]# cd dbdata/
  7. [root@ad8b9458a39c dbdata]# ls
  8. [root@ad8b9458a39c dbdata]# touch a.txt
  9. [root@ad8b9458a39c dbdata]# ls
  10. a.txt
  11. [root@ad8b9458a39c dbdata]# exit
  12. exit
  13.  
  14. # db2 容器
  15. [root@rsync131 /]# docker exec -it db2 bash
  16. [root@b07899fb1a46 /]# cd /d
  17. dbdata/ dev/
  18. [root@b07899fb1a46 /]# cd /dbdata/
  19. [root@b07899fb1a46 dbdata]# ls
  20. a.txt

  其实在有容器也可以对db1或者db2进行挂载

  1. [root@rsync131 /]# docker run -it -d --volumes-from db1 --name db3 centos
  2. 95547b8422226a2f18dd71db4e8c551fd8df72771cf6001cfdfb963899b71477
  3. [root@rsync131 /]# docker exec -it db3 bash
  4. [root@95547b842222 /]# ls /dbdata/
  5. a.txt

  --volumes-from 参数所挂载数据卷的容器自身并不需要保持正在运行

  如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动的删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v命令来指定同时删除关联的容器

四、利用数据卷容器来迁移数据

4.1. 备份

  使用下面的命令来备份dbdata数据卷容器内的数据卷

  1. [root@rsync131 ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name backup1 centos tar zcvf /backup/backup.tar.gz /dbdata
  2. /dbdata/
  3. /dbdata/a.txt
  4. [root@rsync131 ~]# ll
  5. 总用量 273540
  6. -rw-------. 1 root root 1513 8 20 20:25 anaconda-ks.cfg
  7. -rw-r--r-- 1 root root 142 9 23 14:13 backup.tar.gz
  8.  
  9. # 具体的意思是:利用centos镜像创建一个容器,使用--volumes-from dbdata参数来让容器挂载dbdata容器的数据卷,使用-v 参数来挂载本地当前目录到容器的/backup目录,容器启动后使用tar打包备份到本地目录

4.2. 恢复

  为了恢复我们创建一个容器

  1. [root@rsync131 ~]# docker run -it -d -v /dbdata --name db8 centos
  2. 042d3c9567154d047977e8097939215bef441d3206c81c6bca99b6d227501169
  3. [root@rsync131 ~]# docker run --volumes-from db8 -v $(pwd):/backup centos tar zxvf /backup/backup.tar.gz
  4. dbdata/
  5. dbdata/a.txt
  6. [root@rsync131 ~]# docker exec -it db8 bash
  7. [root@042d3c956715 /]# ls
  8. anaconda-post.log bin dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
  9. [root@042d3c956715 /]# cd dbdata/
  10. [root@042d3c956715 dbdata]# ls
  11. a.txt

  

Docker数据管理(五)的更多相关文章

  1. Docker数据管理(四)

    Docker数据管理 Docker数据分为两种: 数据卷 -v /data -v src:dst 数据卷容器 --volumes-from 数据卷 案例1:我们创建一个容器,起名叫nginx-volu ...

  2. 用前端姿势玩docker【五】快速构建中类Unix系统与Windows系统的差异化处理

    目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...

  3. 【Docker】第五篇 Docker 数据管理

    一.基本介绍 数据管理的原因:Docker中的容器一旦删除,容器本身的rootfs文件系统就会被删除,容器中的所有数据就会被删除.为了对一些需要持久化的数据,不随容器删除而删除,所以我们可以通过多个容 ...

  4. Docker(十五)-Docker的数据管理(volume/bind mount/tmpfs)

    Docker提供了三种不同的方式用于将宿主的数据挂载到容器中:volumes,bind mounts,tmpfs volumes.当你不知道该选择哪种方式时,记住,volumes总是正确的选择. vo ...

  5. Docker数据管理

    用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及到Docker的数据管理. 容器中管理数据主要有两种方式: ...

  6. Docker系统七:Docker数据管理

    Docker的数据管理 I. 基本概念 Docker容器一旦删除,其相关的rootf文件系统就会被删除,其容器内的数据将一并删除,为了保存相关数据,Docker提出了数据卷的概念. II. 数据卷 D ...

  7. Docker数据管理(数据卷&数据卷容器)

    生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷(Data Volumes):容 ...

  8. Docker实战(四)之Docker数据管理

    在生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及到容器的数据管理操作. 容器中管理数据主要有两种形式: 数据卷:容器内数据直接映射到本地主 ...

  9. 深入浅出Docker(五):基于Fig搭建开发环境

    概述 在搭建开发环境时,我们都希望搭建过程能够简单,并且一劳永逸,其他的同事可以复用已经搭建好的开发环境以节省开发时间.而在搭建开发环境时,我们经常会被复杂的配置以及重复的下载安装所困扰.在Docke ...

随机推荐

  1. 使用Docker镜像

    1     使用Docker镜像 1.1   获取镜像 命令格式:docker pull NAME[:TAG] NAME为镜像仓库的名称 TAG为镜像的标签(表示版本号) 描述一个镜像需要包括:名称+ ...

  2. oracle 操作,偶尔记一下

    一.根据更新时间排序 1.插入insert into t_user t (t.user_id,t.user_name,t.create_time,t.update_time)values('10',' ...

  3. 实现两个sym转一个sym

    CVO输出如果是一个像素并行输出,选择内嵌人插入同步码.如果两个像素并行输出是不能选择内嵌的,只能选择分离的方式.如果把输出的并行数据给VIP并且要求是内嵌,那只能在内部转或者外部转. 这里是实现外部 ...

  4. AngularJS实战之filter的使用一

    一.格式化数字为货币格式. <div>{{money|currency:"$"}}</div> <div>{{money|currency:&q ...

  5. hibernate增删改

    public class HibernateUtils { private static SessionFactory sessionFactory=null; static{ //获取config ...

  6. spring mvc使用ModelAndView时发生No request handling method with name '方法 名' in class [类名]的错误

    我日,下午关于标题错误查了好久,网上啥说法都有, 后来发现是ModelAndView的路径引错了 正确路径应该为: import org.springframework.web.servlet.Mod ...

  7. listview 嵌套checkbox响应item点击和button点击事件

    参考文档 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=182280 一.主要要点 1. CheckBox的优先级比item高. ...

  8. spark图解

    导语 spark 已经成为广告.报表以及推荐系统等大数据计算场景中首选系统,因效率高,易用以及通用性越来越得到大家的青睐,我自己最近半年在接触spark以及spark streaming之后,对spa ...

  9. python_条件语句

    条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python程序语言指定任何非0和非空(null)值为true,0 或者 null为fals ...

  10. Effective C++ 第二版 31)局部对象引用和函数内new的指针 32)推迟变量定义

    条款31 千万不要返回局部对象的引用, 不要返回函数内部用new初始化的指针的引用 第一种情况: 返回局部对象的引用; 局部对象--仅仅是局部的, 在定义时创建, 在离开生命空间时被销毁; 所谓生命空 ...