一、docker 存储
1. storage driver
容器由最上面一个可写的容器层,以及若 干只读的镜像层组成,容器的数据就存放 在这些层中。这样的分层结构最大的特性 是 Copy-on-Write:
1.新数据会直接存放在最上面的容器层。
2.修改现有数据会先从镜像层将数据复制 到容器层,修改后的数据直接保存在容器 层中,镜像层保持不变。
3.如果多个层中有命名相同的文件,用户 只能看到最上面那层中的文件。
分层结构使镜像和容器的创建、共享以及分发变得非常高效,而这些都要归功于 Docker storage driver
2.storage driver 选型
Docker 支持多种 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它们都能实现分层的架构,同时又有各自的特性。对于 Docker 用户来说,具体 选择使用哪个 storage driver 是一个难题,因为:
1.没有哪个 driver 能够适应所有的场景。
2.driver 本身在快速发展和迭代。
不过 Docker 官方给出了一个简单的答案:
优先使用 Linux 发行版默认的 storage driver。
二、Data Volume
Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容 器的文件系统中。Data Volume 有以下特点:
1.Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
2.容器可以读写 volume 中的数据。
3.volume 数据可以被永久的保存,即使使用它的容器已经销毁。
2.1 、tmpfs mount
应用限制:
1)tmpfs挂载是临时的,并且仅保留在主机内存中。当容器停止时,将tmpfs删除安装,并且不会 保留写在那里的文件。
2)与卷和绑定装入不同,您无法tmpfs在容器之间共享装载。
2)只有在Linux上运行Docker时才能使用此功能
# docker run -d -it --name tmptest --mount type=tmpfs,dst=/app nginx
# docker run -d -it --name tmptest1 --mount type=tmpfs,dst=/app,tmpfsmode=1660 nginx
2.2 Data Volume
2.2.1 Data Volume 应用场景
1.Database 软件 vs Database 数据
2.Web 应用 vs 应用产生的日志
3.数据分析软件 vs input/output 数据
4.Apache Server vs 静态 HTML 文件
5.引擎服务 vs 依赖的数据词典
相信大家会做出这样的选择:
1.前者放在数据层中。因为这部分内容是无状态的,应该作为镜像的一部分。
2.后者放在 Data Volume 中。这是需要持久化的数据,并且应该与镜像分开存放。
2.3 bind mount 文件
2.3.1 bind mount 可以将 host 上文件 mount 到容器
使用 bind mount 单个文件的场景是:只需要向容器添加文件,不希望覆盖整个目录。
使用单一文件有一点要注意:host 中的源文件必须要存在,不然会当作一个新目录 bind mount 给容器。
2.3.3 bind mount 数据持久性测试
即使容器没有了,bind mount 也还在。这也合理,bind mount 是 host 文件系统中的数 据,只是借给容器用;
2.3.4 bind mount 权限控制
ro 设置了只读权限,在容器中是无法对 bind mount 数据进行修改的。只有 host 有权修 改数据,提高了安全性。
2.3.5 bind mount 优缺点
优点:
应用场景丰富,比如我们可以将源代码目录 mount 到容器中,在 host 中修改代码就能看 到应用的实时效果。再比如将 mysql 容器的数据放在 bind mount 里,这样 host 可以方 便地备份和迁移数据。 bind mount 的使用直观高效,易于理解;
不足:
bind mount 需要指定 host 文件系统的特定路径,这就限制了容器的可移植性,当需要将 容器迁移到其他 host,而该 host 没有要 mount 的数据或者数据不在相同的路径时,操 作会失败。
2.4 docker managed volume
不指定 mount 源,指明 mount point 是否可行?数据又是存在哪里?
2.4.1) docker managed volume 分析
volume 的内容跟容器原有 /usr/local/apache2/htdocs 完全一样,为什么? 这是因为:如果 mount point 指向的是已有目录,原有数据会被复制到 volume 中。 docker managed volume 的创建过程: 1.容器启动时,简单的告诉 docker 我需要一个 volume 存放数据,帮我 mount 到目录 /xx。
2.docker 在 /var/lib/docker/volumes 中生成一个随机目录作为 mount 源。
3.如果 /xx 已经存在,则将数据复制到 mount 源, 4.将 volume mount 到 /xx
三、两种 data volume 比较
相同点:两者都是 host 文件系统中的某个路径。
四、 数据共享 容器与HOST
bind mount 是非常明确的:直接将要共享的目录 mount 到容器。
docker managed volume 就要麻烦点。由于 volume 位于 host 中的目录,是在容器启动 时才生成,所以需要将共享数据拷贝到 volume 中,比如:
4.2 数据共享 容器与容器
将 $HOME/htdocs mount 到三个 httpd 容器。
修改 volume 中的主页文件,再次查看并确认所有容器都使用了新的数据内容?
4.3 共享数据 之 volume container
volume container 是专门为其他容器提供 volume 的容器。它提供的卷可以是 bind mount,也可以是 docker managed volume。
容器 mount 了两个 volume:
1.bind mount,存放 web server 的静态文件。
2.docker managed volume,存放一些实用工具
4.5 volume container 应用
volume container 的特点:
1.与 bind mount 相比,不必为每一个容器指定 host path,所有 path 都在 volume container 中定 义好了,容器只需与 volume container 关联,实现了容器与 host 的解耦。
2.使用 volume container 的容器其 mount point 是一致的,有利于配置的规范和标准化,但也带来 一定的局限,使用时需要综合考虑。
五、 Volume 生命周期
备份 因为 volume 实际上是 host 文件系统中的目录和文件,所以 volume 的备份实际上是对文件系统的备份。 恢复 volume 的恢复也很简单,如果数据损坏了,直接用之前备份的数据拷贝到 /myregistry 就可以了。 迁移 如果我们想使用更新版本的 Registry,这就涉及到数据迁移,方法是:
1.docker stop 当前 Registry 容器。
2.启动新版本容器并 mount 原有 volume。
3.docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:latest
当然,在启用新容器前要确保新版本的默认数据路径是否发生变化。
销毁
可以删除不再需要的 volume,但一定要确保知道自己正在做什么,volume 删除后数据是找不回来的。docker 不会销毁 bind mount,删除数据的工作只能由 host 负责。对于 docker managed volume,在执 行 docker rm 删除容器时可以带上 -v 参数,docker 会将容器使用到的 volume 一并删除,但前提是没有 其他容器 mount 该 volume,目的是保护数据,非常合理。
如果删除容器时没有带 -v 呢
总结:
1.docker 为容器提供了两种存储资源:数据层和 Data Volume。
2.数据层包括镜像层和容器层,由 storage driver 管理。
3.Data Volume 有两种类型:bind mount 和 docker managed volume。
4.bind mount 可实现容器与 host 之间,容器与容器之间共享数据。
5.volume container 是一种具有更好移植性的容器间数据共享方案,特别是 data-packed volume container。
6.最后我们学习了如何备份、恢复、迁移和销毁 Data Volume。
原文地址:https://www.cnblogs.com/Robi-9662/p/10651643.html