Docker - 容器存储详解1(使用Data Volume实现数据持久化)
对于有些容器,我们可能会有持续化数据的需求,也就是容器启动时需要加载已有的数据,容器销毁时希望保留产生的数据,也就是说这类容器是有状态的。
(2)这里的 /usr/local/apache2/htdocs 就是 Apache Server 存放静态文件的地方。mount 后,容器中 /usr/local/apache2/htdocs 里原有数据会被隐藏起来,取而代之代之的是 host $HOME/htdocs/ 中的数据。
(2)同样以 httpd 容器为例。我们通过 -v 告诉它需要一个 data volume,并将其 mount 到 /usr/local/apache2/htdocs。
(3)上面执行后,docker 就会自动在 host 的 /var/lib/docker/volumes 下生成一个目录,这个目录就是 mount 源。同时还会将容器里中 /usr/local/apache2/htdocs 数据复制到 mount 源中。
(2)在 Mounts 这部分的信息中会显示容器当前所使用的所有 data volume,包括 bind mount 和 docker managed volume。
(3)我们进这个文件夹可以看到,容器里中 /usr/local/apache2/htdocs 数据确实已经复制到这个 mount 源中。
这个就需要用到 Docker 的 Data Volume 存储机制。Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统。
在具体的使用上,docker 提供了两张类型的 volume:bind mount 和 docker managed volume。下面分别进行介绍。
一、bind mount
1,基本用法
(1)下面在容器启动时通过 -v 参数将 docker host 上的 $HOME/htdocs 目录 mount到 httpd 容器里。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 有权修改数据。
3,bind mount 单个文件
如果只需要向容器添加文件,不希望覆盖整个目录,可以使用 bind mount 单个文件。下面样例,我们将一个 html 文件添加到 apache 中,同时也保留了容器原有的数据后。注意:如果我们 mount 的是单个文件的话,不同于 mount 整个目录,运行后如果宿主机的这个文件进行了修改,容器内对应的文件内容是不会同步变化的,必须重启容器才会更新。
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。
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 查看容器配置信息:附:bind mount 与 docker managed volume 的区别
这两种 data volume 实际上都是使用 host 文件系统的中的某个路径作为 mount 源。它们不同之处在于:不同点 | bind mount | docker managed volume |
volume 位置 | 可任意指定 | /var/lib/docker/volumes/... |
对已有mount point 影响 | 隐藏并替换为 volume | 原有数据复制到 volume |
是否支持单个文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为只读,默认为读写权限 | 无控制,均为读写权限 |
移植性 | 移植性弱,与 host path 绑定 | 移植性强,无需指定 host 目录 |