docker存储

一、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

时间: 2024-11-09 12:01:44

docker存储的相关文章

Docker存储驱动之Device Mapper简介

Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别,本文使用Device Mapper指驱动中的框架,而devicemapper指Docker的存储驱动. 注意:商业支持的Docker Engine(CS-Engine)建议在RHEL和CentOS上使用devicemapper存储驱动. AUFS之外的另一种选择 Docker最初运行在Ubuntu和

理解Docker(7):Docker 存储 - AUFS

(1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 (7)Docker 存储 - AUFS Docker 存储可以分为分层文件系统和卷,本文将介绍 AUFS 分层文件系统. 1. 基础知识 1.1 Linux 的 rootfs 和 bootfs 一

Docker存储驱动之OverlayFS简介

简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. 因此,OverlayFS在Docker社区关注度提高很快,被很多人认为是AUFS的继承者.就像宣称的一样,OverlayFS还很年轻.所以,在生成环境使用它时,还是需要更加当心. Docker的overlay存储驱动利用了很多OverlayFS特性来构建和管理镜像与容器的磁盘结构. 自从Docke

理解Docker(8):Docker 存储之卷(Volume)

(1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 (7)Docker 存储 - AUFS (8)Docker 存储 - Volume 1. Docker volume 的几种形态 有状态容器都有数据持久化需求.前一篇文章中提到过,Docker 采

Docker 存储引擎

可插拔存储引擎架构   这种可插拔式的存储架构.可以让你很灵活的去选择适合自己环境的存储引擎. 每个存储引擎都是以Linux 文件系统为基础的.此外,每个存储引擎都以自己的方式自由的管理image层,container层. 也就是说每个种存储引擎在特定的情况下,表现的比其他的更好. Docker只能运行一个存储引擎,所有的容器被daemon使用一样的存储引擎创建. Dcoker支持的存储引擎: docker info 命令查看daemon 中使用了哪个存储引擎: [email protected

centos7 docker 存储使用 overlay

docker 存储使用overlay 1.requirement 必须升级到7.2 centos 7.2 2.升级centos,安装docker 2.1 系统升级  sudo yum upgrade --assumeyes --tolerant  sudo yum update --assumeyes 2.2 确认内核   uname -r 3.10.0-327.10.1.el7.x86_64 2.3 启用overlay $ sudo tee /etc/modules-load.d/overla

docker存储与网络

目录 Docker存储 挂载主机目录 创建一个数据卷 挂载一个宿主机目录作为数据卷 数据卷容器 创建一个数据卷容器 利用数据卷容器迁移数据 删除数据盘 Docker网络 简介 bridge网络 bridge网络基本用法 基于bridge网络的容器访问外部网络 外部网络访问基于bridge网络的容器 none网络 host网络 自定义网络 自定义bridge网络 创建一个自定义网络 通过指定子网和网关的方式创建自定义网络 使用自定义网络与默认网络互通 同一台宿主机容器互联 Docker存储 doc

聊一聊docker存储驱动

目录 镜像的分层特性 容器读写层的工作原理 写时复制 用时配置 Docker存储驱动 AUFS OverlayFS Devicemapper 常用存储驱动对比 AUFS VS OverlayFS OverlayFS VS Device mapper 镜像的分层特性 在说docker的文件系统之前,我们需要先想清楚一个问题.我们知道docker的启动是依赖于image,docker在启动之前,需要先拉取image,然后启动.多个容器可以使用同一个image启动.那么问题来了:这些个容器是共用一个i

Docker存储卷

docker存储卷: docker容器卷的使用方式: 1 Docker 管理卷: docker run -it --name [名称] -v [docker内部的卷] [镜像名称] 具体使用: docker run -it --name testvolume -d -v /data/mydata 75835a67d134 查看存储卷映射的目录: 命令:docker inspect f878a628f152 "Mounts": [ { "Type": "vo