前言:
在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
容器中管理数据有两种方式:
1、数据卷
2、数据卷容器
一、数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
1、数据卷可以在容器之间共享和重用
2、对数据卷的修改会立马生效
3、对数据卷的更新,不会影响镜像
4、卷会一直存在,直到没有容器使用
> 创建一个数据卷
# 命令举例
docker run -it --name dbdata -v /dbdate ubuntu /bin/bash
> 挂载一个主机目录做数据卷
# 命令举例
docker run -itd -v /root/test:/web --name docker_test ubuntu /bin/bash
docker exec -it docker_test ubuntu /bin/bash
> 挂载一个本地主机文件做数据卷
# 命令举例
docker run -itd -v /root/test/a.txt:/a.txt --name docker_test_file ubuntu /bin/bash
docker exec -it docker_test_file /bin/bash
备注:当主机目录或文件挂载到容器中,文件保持同步修改,并立即生效。
二、数据卷容器
如果有一些持续更新的数据需要在容器之间共享,那么最好创建数据卷容器。 数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
1、首先创建一个数据卷容器
# 命令举例
docker run -itd --name dbdata -v /dbdate ubuntu /bin/bash
docker exec -it dbdata /bin/bash
2、在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷
# 命令举例
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
此时,在db1和db2容器根目录下面也出现一个/dbdata目录,并且三个容器中任意一个容器对/dbdata目录进行修改,其他容器该目录保持同步更新
备注:如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。
如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。
三、利用数据卷对数据进行备份和恢复
1、数据备份
# 流程实例
# 第一步
docker run -it --name dbdata -v /dbdata ubuntu /bin/bash
# 第二步
# 在/dbdata目录下写入数据,后面打包数据时使用
# 第三步
# 首先使用--volumes-from标记来创建一个加载dbata容器卷的容器,并从本地主机挂载当前到容器的
/backup 目录。
docker run -it --volumes-from dbdata -v ~/test:/backup ubuntu tar cvf /backup/backup.tar /dbdata
# 第四步
# 此时在本机目录~/test目录下可以看到backup.tar打包文件已经在该目录下
2、数据迁移
# 流程示例
# 创建一个容器卷容器.将本机目录test挂载到该容器
docker run -it -v ~/test:/dbdata --name db_test ubuntu /bin/bash
# 此时已经可以看到,压缩包已经在该容器中,接下来就可以在该容器中对该数据进行操作