第6章 Docker数据管理
在生产环境中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及到容器的数据管理操作。
容器中的数据管理主要有2种方式:
1.数据卷(Data Volumes):容器内数据直接映射到本地主机环境;
2.数据卷容器(Data Volumes Containers):使用特定容器维护数据卷。
6.1 数据卷
数据卷 是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux的mount行为。
数据卷可以提供很多有用的特性:
1.数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;
2.对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
3.对数据卷的更新不会影响镜像,解耦开应用和数据;
4.卷会一直存在,直到没有容器使用,可以安全的卸载它。
1.创建数据卷
docker volume COMMAND
docker volume create -d local test
此时查看 /var/lib/docker/volumes 路径下,会发现所创建的数据卷位置:/var/lib/docker/volumes/test
2.绑定数据卷
除了使用 volume 子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷被称为
绑定数据卷。
在使用 docker run 命令的时候,可以使用 -mount 选项来使用数据卷。-mount 选项支持三种类型的数据卷,包括:
1.volume
普通数据卷,映射到主机 /var/lib/docker/volumes 路径下;
2.bind
绑定数据卷,映射到主机指定的路径下;
3.tmpfs
临时数据卷,只存在于内存中。
下面使用 training/webapp 镜像创建一个 web 容器,并创建一个数据卷挂载到容器的 /opt/webapp 目录。
docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py
等价于使用旧的 -v 标记可以在容器内创建一个数据卷:
docker run -d -P --name web -v /webapp:/opt/webapp training/webapp python app.py
本地的路径必须是绝对路径,容器内的路径可以是相对路径。如果目录不存在,docker会自动创建。
docker 挂载数据卷的默认权限是读写(rw),用户也可以通过 ro 指定为只读。
docker run -d -P --name web -v /webapp:/opt/webapp training/webapp:ro python app.py
如果挂载一个文件到容器,使用文件编辑工具去编辑的时候,可能会导致文件inode改变。从docker 1.1 开始会导致报错信息,所以推荐的方式是直接挂载目录。
6.2 数据卷容器
如果用户需要在多个容器之前共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器首先也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载的。
docker run -it -v /dbdata --name dbdata ubuntu
然后,在其他容器中使用 --volumes-from 挂载 dbdata 容器中的数据卷,如:
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
如果删除了挂载的容器(包括dbdata,db1,db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂着它的容器时显式使用 docker rm -v 命令
来指定同时删除关联的容器。
6.3 利用数据卷容器来迁移数据
可以利用数据卷容器来对其中的数据卷进行备份、恢复。
1.备份
使用下面的命令来备份 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 容器的数据卷(即dbdata数据卷);使用
-v $(pwd):/backup 参数来挂载本地的当前目录到worker容器的 /backup 目录。
worker 容器启动后,使用 tar cvf /backup/backup.tar /dbdata 命令将 /dbdata 下面的内容备份为容器内的 /backup/backup.tar,即宿主机当前目录下
的 backup.tar。
2.恢复
首先创建一个带有数据卷的容器 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