原文出自:http://blog.csdn.net/anxpp/article/details/52491131
我们在使用docker 的时候,会产生很多数据,比如web服务器啊,数据库之类的,有时我们还需要备份或复制这些数据,这就需要涉及到Docker的数据管理了。
docker容器中管理数据主要分两种:
- 数据卷
- 数据卷容器
1、数据卷
数据卷是一个可供容器使用的特殊目录,它会绕过文件系统,可以提供很多有用的特性:
- 数据卷可以在容器之间共享个重用
- 对数据卷的修改会立即生效
- 对数据卷的更新不会影响镜像
- 卷会一直存在直到没有容器使用
数据卷的使用类似于Linux下对目录或文件进行mount操作。
在容器内创建数据卷
在用docker run命令的时候,使用-v标记可以在容器中创建一个数据卷,多次使用该参数可以创建多个数据卷。
比如要使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到容器的/webapp目录:
docker run -d -P --name web -v /webapp training/webapp Python app.py
挂载一个主机目录作为数据卷
也可以直接指定挂载一个本地已有目录到容器中作为数据卷,同样使用-v参数,依然是刚才的例子: <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):
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp Python app.py
加了只读后,容器内挂载的数据卷数据是无法修改的。
挂载一个本地主机文件作为数据卷
-v标记也可以从主机挂载单个文件到容器中作为数据卷。比如需要记录在容器中输入过的历史命令:
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
2、使用数据卷容器
Docker镜像是如此的方便,针对以上的数据管理,也提供了一个普通的容器:数据卷容器。他可以使容器间共享一些持续性的数据变得更加简单。
使用步骤:
- 创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata(使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态):
docker run -it -v /dbdata --name dbdata ubuntu
- 然后再其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,比如有两个容器dbq和db2:
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
此时db1和db2都挂载同一个数据卷到相同的/dbdata目录下。三个容器任意一个在该目录的数据修改,其他容器都能看到。
可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。也可以从其他已经挂载了容器卷的容器来挂载数据卷:
docker run -d --name db3 --volumes-from db1 training/postgres
如果删除了挂载的容器(包括dbdata、db1、db2),数据卷并不会被自动删除。
如果需要删除一个数据卷,必须在删除最后一个还挂载它的容器时,显示使用docker rm -v 来指定同时删除关联的容器。
利用数据卷容器迁移数据
可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。备份
备份dbdata数据卷容器中数据卷命令如下:
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:
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
- 然后创建另一个容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中即可:
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar