1数据卷
数据卷是一个可供容器使用的特殊目录。它将主机操作系统目录直接映射进容器,类似于Linux中的mount的命令
1.数据卷可以在容器之间共享和重用,容器间传递数据将变得高效和方便
2. 对数据卷的修改会马上生效,无论容器内操作还是本地操作
3. 对数据卷的更新,不会影响镜像,解耦开应用和数据;
4. 卷会一直存在,知道没有容器使用,可以完全的卸载它
1.1创建数据卷
docker 提供了volume子命令来管理数据卷
docker volume create -d centos test
查看
ls -l /var/lib/docker/volumes
除了create 子命令外,docker volume还支持inspect(查看详细信息),ls (列出已有数据卷),prune (清理无用数据卷),rm(删除数据卷)等
1.2 绑定数据卷
在用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
-v 也可以指定挂载一个本地的已有目录到容器中去作为数据卷
docker run -d -P --name web -v /src/webapp:/opt/webapp test
加载主机的/src/webapp 目录到容器的/opt/webapp 目录
这个功能在进行测试的时候十分方便,用户可以放置一些程序或数据到本地目录中,然后在容器内运行和使用。另外目录的路径必须是绝对路径,如果目录不存在,docker 会自动创建
docker 挂载数据卷的默认权限为读写(rw),可以通过ro指定为只读
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
挂载一个本地主机文件作为数据卷
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
注释:如果直接挂载一个文件到容器,使用文件编辑工具,包括vi或者sed --in -place的时候,可能会造成文件inode的改变,从Docker1.1.0起,这会导致报错误信息,所以推荐的方式是直接挂载文件所在的目录
2. 数据卷容器
如果用户需要在容器之间共享一些 持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器其实就是一个普通容器,专门用它提供数据卷供其他容器挂载如下
1.创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata
[root@ybsrv1 /data/webapp]# docker run -ti -v /dbdata --name dbdata centos
[root@d68d854d552a /]#
然后可以在其他容器中使用--volumes-from 来挂载dbdata容器中的数据卷,创建db1 db2 并从dbdata容器挂载数据卷
[root@ybsrv1 /data/webapp]# docker run -it --volumes-from dbdata --name db1 centos
[root@ybsrv1 /data/webapp]# docker run -it --volumes-from dbdata --name db2 centos
测试:
#在dbdata上/dbdata文件下创建文件
[root@ybsrv1 /data/webapp]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2f0ea880639 centos "/bin/bash" 2 minutes ago Up 2 seconds db2
7265c5c841b8 centos "/bin/bash" 3 minutes ago Up 8 seconds db1
d68d854d552a centos "/bin/bash" 6 minutes ago Up 14 seconds dbdata
[root@ybsrv1 /data/webapp]# docker attach d6
[root@d68d854d552a /]# cd dbdata/
[root@d68d854d552a dbdata]# ll
total 0
[root@d68d854d552a dbdata]# echo 'niu' >ceshi.txt
#在db2上查看
[root@ybsrv1 ~]# docker attach b2f
[root@b2f0ea880639 /]# cd dbdata/
[root@b2f0ea880639 dbdata]# ll
total 4
-rw-r--r--. 1 root root 4 Apr 9 09:12 ceshi.txt
可以多次使用--volumes-from 参数来从多个容器挂载多个数据卷。还可以从其他已挂载容器卷的容器来挂载数据卷
[root@ybsrv1 ~]# docker run -d --name db3 --volumes-from db1 centos
f74d8658e2414a105b524cb9602f08b1c3e9ff0a261c1803413a45062db71048
注意:
使用 --volumes-from 参数所挂载数据卷的容器姿势并不需要保持在运行状态
如果删除了挂载的容器(包括dbdata, db1 和db2 )数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载这它的容器时显示使用docker rm -v 命令来指定同事删除关联的容器
使用数据卷容器可以让用户在容器之间自由的升级和移动数据卷。。
3. 利用数据卷容器迁移数据
可以利用数据卷容器对其中的数据卷进行备份,恢复,以实现数据的迁移
1. 备份
docker run --volumes-from dbdata -v /data/webapp:/backup --name worker centos
tar cvf /backup/backup.tar.gz /dbdata
解析如下:
使用centos镜像创建一个容器worker.使用--volumes-from dbdata 参数来让worker 容器挂载到dbdata容器的数据卷(即dbdata数据卷);使用-v /data/webapp:/backup参数来挂载本地的当前目录到worker容器的/backup目录。
worker 容器启动后,使用 tar cvf /backup/backup.tar.gz /dbdata命令来将/dbdata下内容为容器的/backup/backup.tar ,即宿主主机当前目录下的backup.tar.gz
恢复
恢复数据到一个容器,如下
docker run -v /dbdata --name db4 centos /bin/bash
然后创建另一个新的容器,挂载db4的容器,并使用untar 解压备份文件到所挂载的容器卷中
docker run --volumes-from db4 -v /data/webapp/:/backup busybox tar xf /backup/backup.tar.gz