容器中的管理数据主要有两种方式:
数据卷(Data Volumes):容器内数据直接映射到本地主机环境;如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中。
数据卷容器(Data Volume Containers):使用特定容器维护数据卷。如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。
数据卷存在于宿主机中,独立于容器,和容器的生命周期是分离的,数据卷存在于宿主机的文件系统中,数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
数据卷可以提供很多有用的特性,类似于Linux 中的mount 行:
数据卷可以在容器之间共事和重用,容器间传递数据将变得高效与方便;
对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
对数据卷的更新不会影响镜像,解摘开应用和数据;
卷会一直存在,直到没有容器使用,可以安全地卸载它。
1. 创建数据卷
$ docker volume create -d local test
test
此时,查看/var/lib/docker/volumes 路径下(宿主机路径),会发现所创建的数据卷位置:
$ ls -1 /var/lib/docker/volumes
drwxr- xr-x 3 root root 4096 May 22 06:02 test
除了create 子命令外, docker volume 还支持inspect (查看详细信息)、ls (列
出已有数据卷)、prune (清理无用数据卷)、rm (删除数据卷)等,读者可以自行实践。
2 绑定数据卷
除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径
挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
在用docker [container] run命令的时候,可以使用 -mount 选项来使用数据卷。
-mount 选项支持三种类型的数据卷,包括:
volume : 普通数据卷,映射到主机/var/lib/docker/volumes 路径下;
bind :绑定数据卷,映射到主机指定路径下;
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:rotraining/webapp python app.py
容器内的目录会被覆盖,如果之前不是空目录,将会丢失容器内数据。
3.数据卷容器
首先,创建一个数据卷容器dbdata , 并在其中创建一个数据卷挂载到/dbdata :
$ docker run it -v /dbdata --name dbdata ubuntu
root@3ed94f279b6f:/#
查看/dbdata 目录:
root@3 ed94f279b6f:/# ls
b工n bootdbdatadev etc home lib lib64 media mnt opt proc root run
sbin srv sys tmp usr var
然后,可以在其他容器中使用-- volumes-from 来挂载dbdata 容器中的数据卷,例
如创建dbl 和db2 两个容器,并从dbdata 容器挂载数据卷:
$ docker run -it --volumes-from dbdata --name dbl ubuntu
$ docker run -it --volumes-from dbdata --name db2 ubuntu
此时, 容器dbl 和db2 都挂载同一个数据卷到相同的 /dbdata 目录,三个容器任何一方在该目录下的写人,其他容器都可以看到。
如果删除了挂载的容器(包括dbdata 、db 工和db2 ),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v 命令来指定同时删除关联的容器。
4.利用数据卷容器来迁移数据
可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。
备份
使用下面的命令来备份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 。
要备份的数据容器的数据,是备份在一个容器上,这个容器是挂载了要备份数据的容器。
恢复
如果要恢复数据到一个容器,可以按照下面的操作。
首先创建一个带有数据卷的容器dbdata2:
$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个新的容器,挂载dbda ta2 的容器,并使用untar 解压备份文件到所挂
载的容器卷中:
$docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backu.tar
可以确认,容器 Volume 里的信息,并不会被 docker commit 提交掉;但这个挂载点目录 /test 本身,则会出现在新的镜像当中。