原文出自:http://blog.csdn.net/anxpp/article/details/52491131

123

    我们在使用Docker 的时候,会产生很多数据,比如web服务器啊,数据库之类的,有时我们还需要备份或复制这些数据,这就需要涉及到Docker的数据管理了。

    docker容器中管理数据主要分两种:

  • 数据卷
  • 数据卷容器

1、数据卷

    数据卷是一个可供容器使用的特殊目录,它会绕过文件系统,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享个重用
  • 对数据卷的修改会立即生效
  • 对数据卷的更新不会影响镜像
  • 卷会一直存在直到没有容器使用

    数据卷的使用类似于Linux下对目录或文件进行mount操作。

    在容器内创建数据卷

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

    比如要使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到容器的/webapp目录:

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d -P --name web -v /webapp training/webapp Python app.py  

    挂载一个主机目录作为数据卷

    也可以直接指定挂载一个本地已有目录到容器中作为数据卷,同样使用-v参数,依然是刚才的例子:

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-family: Arial, Helvetica, sans-serif;">docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp Python app.py</span>  

    此时加载主机的/src/webapp目录到容器的/opt/webapp目录下。
    这个功能可以为我们提供很多便捷,比如我们可以放置一些程序或者数据到本地目录中,然后再容器中运行和使用。

    这个本地目录的路径必须是绝对路径,如果目录不存在,会被自动创建。

    Docker挂载数据卷的默认权限是读写(rw),我们也可以指定为只读(ro):

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp Python app.py  

    加了只读后,容器内挂载的数据卷数据是无法修改的。

    挂载一个本地主机文件作为数据卷

    -v标记也可以从主机挂载单个文件到容器中作为数据卷。

    比如需要记录在容器中输入过的历史命令:

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash  

 

2、使用数据卷容器

    Docker镜像是如此的方便,针对以上的数据管理,也提供了一个普通的容器:数据卷容器。

    他可以使容器间共享一些持续性的数据变得更加简单。

    使用步骤:

  • 创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata(使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态):
[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -it -v /dbdata --name dbdata ubuntu  
  • 然后再其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,比如有两个容器dbq和db2:
[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -it --volumes-from dbdata --name db1 ubuntu  
  2. docker run -it --volumes-from dbdata --name db2 ubuntu  

    此时db1和db2都挂载同一个数据卷到相同的/dbdata目录下。三个容器任意一个在该目录的数据修改,其他容器都能看到。
    可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。也可以从其他已经挂载了容器卷的容器来挂载数据卷:

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d --name db3 --volumes-from db1 training/postgres  

    如果删除了挂载的容器(包括dbdata、db1、db2),数据卷并不会被自动删除。

    如果需要删除一个数据卷,必须在删除最后一个还挂载它的容器时,显示使用docker rm -v 来指定同时删除关联的容器。

    利用数据卷容器迁移数据

    可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

    备份

    备份dbdata数据卷容器中数据卷命令如下:

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata  

    解释:

  • 首先利用ubuntu镜像创建一个容器worker
  • 使用--volumes-from dbdata参数让worker容器挂载dbdata容器的数据卷
  • 使用-v $(pwd):/backup参数挂载本地的当前目录到worker容器的/back目录下。
  • worker容器启动后,使用tar cvf /backup/backup.tar /dbdata命令将/dbdata下内容备份为容器内的backup/backup.tar,即宿主主机当前目录下的backip.tar。

    恢复

    恢复数据到容器的操作:

  • 创建一个带有数据卷的容器dbdata2:
[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -v /dbdata --name dbdata2 ubuntu /bin/bash  
  • 然后创建另一个容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中即可:
[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar  

小节

    docker为数据管理提供了充分的支持,并且,使用数据卷容器是一个不错的选择。