现在的位置: 首页 > 云计算 > Docker > 正文
docker容器技术系列六:docker容器的数据管理
2015年11月04日 Docker ⁄ 共 1882字 暂无评论 ⁄ 被围观 2,606 views+

刚接触docker时总在思考两个问题:

  1. docker容器如何实现将数据持久化呢?比如一个httpd容器中用户上传的文件或者访问日志等!
  2. 如何实现便捷的更新容器中的文件呢? 比如需要快捷的更新容器中的程序,总不能每次更新都build一次镜像吧!

那下面我们就来聊聊docker容器的数据管理:数据卷。

docker提供了两种方式实现数据管理:

  • 映射宿主机目录或文件
  • 通过创建一个专用的数据卷容器与相关容器间共享数据并实现持久化

一、数据卷的基本概念

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用

*提示:数据卷的使用,类似于 Linux 下对目录或文件进行 mount。

可以使用带有 -v 参数的 docker run 命令给容器添加一个数据卷.在一个 docker run 中可以多次使用 -v 参数来达到挂载多个数据卷的目的.我们现在在web应用容器中挂载单个卷。

二、挂载宿主文件夹到数据卷

使用 -v 参数也可以挂载宿主的文件夹到容器里

[root@node01 httpd]# docker run -d -v /data/www:/var/www/html -p 80:80 httpd-php

这样会把本地文件夹/src/webapp挂在到容器中的/opt/webapp目录.对于测试来说这是非常有用的.例如我们可以把源码挂载到容器中并通过修改源码查看应用运行情况.在宿主机上的文件夹必须是绝对路径,而且当文件夹不存在时会自动创建。

查看挂载效果如下:

image

*注意:出于可移植性和共享的木的挂载宿主文件的功能在Dockerfile中无法使用.就宿主文件而言,宿主依赖可能事容器无法在所有的主机上正常工作.

默认情况下Docker以读写权限挂载数据卷,但是我们也可以以只读方式进行挂载,如下:

[root@node01 httpd]# docker run -d -v /data/www:/var/www/html:ro -p 80:80 httpd-php

这里我们挂载了和上面相同的一个目录/data/www。但是我们添加了“ro”选项来制定挂载时文件权限应该是只读的。

三、创建和挂在一个数据卷容器

如果你有一些持久数据需要在容器之间共享或想要使用非持久性容器,最好的方式是创建一个命名数据卷容器,然后从数据卷容器中挂载数据.
我们来创建一个带有卷的命名容器来共享数据.

[root@node01 ~]# docker run -d -p 4444:22 -v /data --name data centos:sshd

你可以在另外一个容器中使用 --volumes-from 标记来挂在/dbdata卷

[root@node01 ~]# docker run -d -p 5555:22 --volumes-from data --name test centos:sshd

此时我们通过ssh进入两个容器中,我们通过在数据卷容器“data”的挂载点/data下创建一个文件,可以实时共享给其他使用该数据卷的容器,如test容器,见下面截图:

image

四、数据卷的备份,恢复和迁移数据

另外一个有用的功能是使用它们来进行备份,恢复或迁移数据。如下所示,我们使用--volumes-from 标记来创建一个挂载了要备份数据卷的容器:

[root@node01 ~]# docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

这里我们创建并登录了一个新容器,挂载了dbdata容器中的数据卷,并把一个本地目录挂载到了/backup下,最后我们传入了一条tar命令来备份dbdata卷到/backup下。当命令执行完成后容器就会停止运行,并保留一个dbdata的备。

然后你就可以恢复数据到同一个或者另外创建的容器中。如下创建一个新的容器:

[root@node01 ~]# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

然后解压备份文件到新容器的数据卷中:

[root@node01 ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

你可以使用上面的技术及你喜欢的工具进行自动数据备份,迁移和恢复。

数据卷很好的实现了容器中数据的持久化问题,在实际使用中,可以将日志、应用数据等放入数据卷中。后面也有专门的文章介绍容器日志的管理办法。

给我留言

留言无头像?


×