Docker - 容器存储详解1(使用Data Volume实现数据持久化)

作者: hangge 发布时间: 2019-09-09 浏览: 1785 次 编辑

    对于有些容器,我们可能会有持续化数据的需求,也就是容器启动时需要加载已有的数据,容器销毁时希望保留产生的数据,也就是说这类容器是有状态的。

    这个就需要用到 Docker 的 Data Volume 存储机制。Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统。

    在具体的使用上,docker 提供了两张类型的 volumebind mount 和 docker managed volume。下面分别进行介绍。

一、bind mount

1,基本用法

(1)下面在容器启动时通过 -v 参数将 docker host 上的 $HOME/htdocs 目录 mount到 httpd 容器里。

1
docker run -d -v ~/htdocs:/usr/local/apache2/htdocs httpd


(2)这里的 /usr/local/apache2/htdocs 就是 Apache Server 存放静态文件的地方。mount 后,容器中 /usr/local/apache2/htdocs 里原有数据会被隐藏起来,取而代之代之的是 host $HOME/htdocs/ 中的数据。

注意:当我们 mount 一个目录时,如果更改宿主机目录里的内容,容器内对应的内容也会同步更新,不需要重启容器。


2,指定数据的读写权限

默认情况下 mount 的数据是可读可写的。我们可以添加 ro 参数设置成只读权限,此时:

  • 在容器中无法对 bind mount 数据进行修改。 

  • 只有 host 有权修改数据。

原文:Docker - 容器存储详解1(使用Data Volume实现数据持久化)


3,bind mount 单个文件

    如果只需要向容器添加文件,不希望覆盖整个目录,可以使用 bind mount 单个文件。下面样例,我们将一个 html 文件添加到 apache 中,同时也保留了容器原有的数据后。

注意:如果我们 mount 的是单个文件的话,不同于 mount 整个目录,运行后如果宿主机的这个文件进行了修改,容器内对应的文件内容是不会同步变化的,必须重启容器才会更新。

1
docker run -d -v ~/htdocs/index.html:/usr/local/apache2/htdocs/new_index.html httpd


二、docker managed volume

1,基本用法

(1)docker managed volume  bind mount 在使用上最大的区别是不需要指定 mount 源,指明 mount point 就好。
(2)同样以 httpd 容器为例。我们通过 -v 告诉它需要一个 data volume,并将其 mount 到 /usr/local/apache2/htdocs

1
docker run -d -v /usr/local/apache2/htdocs httpd


(3)上面执行后,docker 就会自动在 host  /var/lib/docker/volumes 下生成一个目录,这个目录就是 mount 源。同时还会将容器里中 /usr/local/apache2/htdocs 数据复制到 mount 源中。

2,查找 data volume 的具体位置

(1)当容器申请 mount docker managed volume 时,docker 会在 /var/lib/docker/volumes 下生成一个目录作为 mount 源。要找到它我们先执行 docker inspect 查看容器配置信息:

原文:Docker - 容器存储详解1(使用Data Volume实现数据持久化)


(2)在 Mounts 这部分的信息中会显示容器当前所使用的所有 data volume,包括 bind mount 和 docker managed volume

原文:Docker - 容器存储详解1(使用Data Volume实现数据持久化)


(3)我们进这个文件夹可以看到,容器里中 /usr/local/apache2/htdocs 数据确实已经复制到这个 mount 源中。

原文:Docker - 容器存储详解1(使用Data Volume实现数据持久化)


附:bind mount 与 docker managed volume 的区别

这两种 data volume 实际上都是使用 host 文件系统的中的某个路径作为 mount 源。它们不同之处在于:

 不同点bind mountdocker managed volume
 volume 位置可任意指定/var/lib/docker/volumes/...
 对已有mount point 影响隐藏并替换为 volume原有数据复制到 volume
 是否支持单个文件支持不支持,只能是目录
 权限控制可设置为只读,默认为读写权限无控制,均为读写权限
 移植性移植性弱,与 host path 绑定移植性强,无需指定 host 目录


原文链接:https://www.hangge.com/blog/cache/detail_2403.html