戊辰人博客

青,取之于蓝而青于蓝;冰,水为之而寒于水。

Docker实战(二)数据卷管理

日期:2016年04月27日 作者: 分类:运维 阅读:2,504

Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。

数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。

一、数据卷创建

容器管理实验中我们学习的命令 docker run 用来创建容器,可以在使用改命令时添加 -v 参数,就可以创建并挂载一个到多个数据卷到当前运行的容器中,-v的作用是将宿主机的一个目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。

# 创建两个目录
mkdir /tmp/data1 /tmp/data2 

# 分别将两个目录挂载到新创建的容器上
docker run -t -i --name docker2 -v /tmp/data1:/data1 -v /tmp/data2:/data2 ubuntu /bin/bash

Docker数据卷管理

上述命令中 -v 参数可以使用多次,并挂在多个数据卷到容器中。后面的参数信息中冒号前面是宿主机的本地目录,冒号后面是容器中的挂载目录。

使用 docker inspect docker2 查看docker2容器中的数据卷信息:

Docker数据卷管理

进入容器后我们可以查看和使用容器卷,尝试向这个容器卷中写入数据,然后在宿主机中查看是否存在,此处操作就不作演示了。

二、数据卷权限

挂载的数据卷默认为可读写权限,除非外部文件系统做了特殊限制,在 docker run的时候也可以执行为只读权限:

# 创建一个数据卷目录
mkdir /tmp/rodata

# 以只读的方式挂载到docker2ro容器上
docker run -t -i --name docker2ro -v /tmp/rodata:/rodata:ro ubuntu /bin/bash

上面的命令中参数很简单,ro表示 readonly,挂载后的数据卷就是只读权限了,这时候我们再次尝试向数据卷中写入:

Docker数据卷管理

 

三、挂载主机上的文件

除了可以挂载目录之外,文件也可以作为数据卷挂载到容器中。

# 创建测试文件
echo 'test docker file' > /root/dockerfile.txt

# 创建容器并挂载测试文件
docker run -t -i --name docker2file -v /root/dockerfile.txt:/root/dockerfile.txt:ro ubuntu /bin/bash

Docker数据卷管理

四、数据卷容器

如果需要在多个容器间共享数据,并希望永久保存这些数据,最好的方式是使用数据卷容器,类似于一个提供网络文件共享服务的NFS服务器。

数据卷容器创建方法跟普通容器一样,只需要指定宿主机的一个文件夹作为数据卷即可,使用docker create命令创建但不启动数据卷容器:

docker create -v /data --name docker2db ubuntu /bin/true

Docker数据卷管理

其他使用该数据卷容器的容器创建时候需要使用–volumes-from参数,指定该容器名称或ID:

docker run --volumes-from docker2db ...

创建site1和site2两个容器挂载数据卷容器docker2db,可以连接到这两个容器中对数据卷进行操作,并查看彼此之间是否已经有了共享文件:

Docker数据卷管理

Docker数据卷管理

五、备份数据卷

继续使用之前环境,我们对数据卷容器中的数据进行备份,备份方法:

1. 创建一个新的容器
2. 挂载数据卷容器
3. 挂载宿主机本地目录作为数据卷
4. 将数据卷容器的内容备份到宿主机本地目录挂载的数据卷中
5. 完成备份操作后容器销毁

按照上述步骤对数据卷容器docker2db中的数据进行备份:

# 创建备份目录
mkdir /tmp/backup

# 创建备份容器
docker run --rm --volumes-from docker2db -v /tmp/backup:/backup ubuntu tar cvf /backup/docker2db.tar /data

Docker数据卷管理

 

PS:本Docker实战教程系列中使用的操作系统是基于Debian的LMDE2,教程中的命令均已运行测试,如有雷同,我抄你的!!!

标签:

除非注明,戊辰人博客文章均为原创,转载请以链接形式标明本文地址

本文地址:https://wanglu.info/1149.html

6条评论

  • 老哥问你个问题,我用docker搭建了一个nginx,我把静态资源放在容器里面,我把容器commit成镜像再推送到我的云仓库上面,然后我在别的地方pull这个镜像的时候以前存在容器的静态资源都没有了,这是为什么啊,请问怎么才能实现我前面这个想法呢

    • 本来想自己实验后给你回复的,但这段时间太忙没时间搭建环境试验,我以前也有你相同的想法只是没有行动。看你是评论在数据卷管理这里,我想是不是你在这个容器中使用了数据卷呢?我觉得要实现这个想法,是不能使用数据卷的(且最好不要和其它容器有关联),因为如果使用数据卷的话,静态资源就存储到了数据卷容器中了。

      • 没有亵渎您劳动成果的意思,只是觉得这句话特别好玩,您写的内容特别棒,对我们帮助很大,辛苦了

        • 哈哈哈,知道你是开玩笑的,不过文章内容确实也如同最后一句所声明的,都是网络上参考各种不同资料然后重新实验整理,所以是抄谁的都有可能!!!

发表评论

电子邮件地址不会被公开。 必填项已用*标注