1. docker存储分类

Docker为容器提供了两种存放数据的资源,分别是:

  • 由storage driver管理的镜像层和容器层,即镜像内文件系统。
  • Data Volume,宿主机文件系统

2. 镜像内文件系统(storage driver)

linux容器的文件系统,是基于mount namespace和rootfs实现的。在rootfs的基础上,docker使用多个增量rootfs联合挂载一个完整的rootfs的方案,这就是容器镜像中“层”的概念。通过“分层镜像”的设计,可以使得容器镜像比虚拟机镜像要小的多。

对于某些容器,直接将数据放在由storage driver维护的层中是很好的选择,比如那些无状态的应用。无状态意味着容器没有需要持久化的数据,随时可以从镜像直接创建。比如busybox,它是一个工具箱,我们启动busybox是为了执行诸如wget,ping之类的命令,不需要保存数据供以后使用,使用完直接退出,容器删除时存放在容器层中的工作数据也一起被删除,下次再启动新容器时又是一个干净如初的内部文件系统。

2.1 aufs

AUFS是一种Union File System,所谓UnionFS就是把不同物理位置的目录合并mount到同一个目录中。

比如,我们有以下目录

$ tree
.
├── fruits
│   ├── apple
│   └── tomato
└── vegetables├── carrots└── tomato

输入以下命令

# 创建一个mount目录
$ mkdir mnt# 把水果目录和蔬菜目录union mount到 ./mnt目录中
$ sudo mount -t aufs -o dirs=./fruits:./vegetables none ./mnt#  查看./mnt目录
$ tree ./mnt
./mnt
├── apple
├── carrots
└── tomato

2.2 device mapper

关于 Docker的分层镜像,除了 aufs,docker还支持btrfs, devicemapper和vfs,你可以使用 -s 或 –storage-driver= 选项来指定相关的镜像存储。

在Ubuntu 14.04下,Docker 默认 Ubuntu的 AUFS。因为 AUFS 还没有进入Linux 内核主干的原因,RedHat 上使用的是 devicemapper。

3. 主机存储(data volume)

docker的容器是无状态的,当容器重启的时候里面的数据会全部清除,如果是一些静态的数据,我们可以在build镜像的时候直接写死,但是对于数据库、日志等数据实时变化的镜像我们就不能通过这种方式来保存数据。

因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。

一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。

Data Volume 有以下特点:

  • Data Volume是目录或文件,而非没有格式化的磁盘(块设备)。
  • 容器可以读写volume中的数据。
  • volume数据可以被永久的保存,即使使用它的容器已经销毁。

3.1 bind mount

bind mount的意思是挂载宿主机中固定目录,启动容器的时候执行:

docker run -d -p 80:80 -v src:dst httpd

这与 linux mount 命令的行为是一致的,即将宿主机中的目录挂载到镜像中的目录。

4. 容器之间共享数据

4.1 共享host目录

只需要将同一个host目录挂载到不同的容器即可。

4.2 用volume container共享数据

volume container是专门为其他容器提供volume的容器。

volume container 的特点:

  • 与 bind mount 相比,不必为每一个容器指定host path,所有path都在 volume container中定义好了,容器只需与volume container关联。实现了容器与host的解耦。
  • 使用volume container的容器其mount point是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑。

5. 分布式存储(Flocker)

原生的 Docker volume 不具备可移植性。于是,出现了Docker 的分布式卷解决方案 Flocker。

它带来的好处包括:

  • 容器的数据会被写入 Flocker 后端存储而不是主机上,因此,在主机出现故障时可以保证数据不丢失
  • 在容器迁移时,Flocker 会自动地将卷从一个 host 移植到另一个 host

参考:
https://www.cnblogs.com/sammyliu/p/5931383.html

https://www.cnblogs.com/sammyliu/p/5932996.html

https://www.jianshu.com/p/655c934b4e4c

docker存储--理解镜像文件系统aufs/device mapper、主机存储共享、容器间存储共享、分布式存储Flocker相关推荐

  1. DOCKER存储驱动之DEVICE MAPPER简介

    Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别, ...

  2. 文末送书啦!| Device Mapper,那些你不知道的Docker核心技术

    戳蓝字"CSDN云计算"关注我们哦! 接触Docker 比较早的同学应该知道,Docker 在最开始只能在Ubuntu和Debian等少数的Linux 发行版上运行,并且在这些发行 ...

  3. Docker架构、镜像及容器的安装和基本操作

    Docker概念 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的虚拟机.Docker的宗旨:Build,Ship and Run Any APP,Anywhere,即通过对应用组件 ...

  4. Device Mapper系列基础教程:Thin Provisioning 实践

    docker Thin Provisioning 实践 文章目录 docker Thin Provisioning 实践 1. Thin Provisioning Snapshot 演示 2. Doc ...

  5. linux 文件理解,linux文件系统理解

    1.  文件即数据的集合,无论你有任何信息需要存储在计算机中,都要以文件的信息存在:而文件常常和具体的设备相关联,如磁盘.软盘等等. 2. 目录,即一个文件组. 3. linux支持的文件系统: Ex ...

  6. docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  7. docker容器网络配置之容器间的链接(默认桥接网络下的links)

    一. 遗留的容器连接方式  --link --link是docker 的一个遗留的特征,最终可能被删除.除非绝对需要使用,不然,建议使用 user-defined network 建立容器间的连接.不 ...

  8. docker容器网络 - 同一个host下的容器间通信

    2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...

  9. 理解镜像、容器和存储驱动

    理解镜像.容器和存储驱动 为了更有效地使用存储驱动,你必须理解Docker如何创建和存储镜像.接下来,需要理解容器是如何使用这些镜像的.最后,你需要一个对镜像和容器操作者都需要的技术简介. 镜像和图层 ...

最新文章

  1. 求求你,不要再使用!=null判空了!
  2. matlab 图像函数以及运用(第十章)
  3. c/c++ g++默认编译调用成功,O2优化却发生Segmentation fault
  4. 【opencv】——钢管计数(霍夫圆变换 + 阈值 + canny)
  5. JDBC布尔兼容性列表
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第33篇]Bellcore攻击是如何攻击使用CRT的RSA的?
  7. PL/SQL NOCOPY限制模式
  8. PL/SQL中的=作用
  9. (盒子模型常见问题)外边距合并问题,嵌套盒子边距塌陷问题解决
  10. 龙芯 LS2K 16G 内存支持
  11. html rfftq15.gif,stm32f4中用SD卡存储DCMI的图像
  12. 微信公众号修改业务域名、JS接口安全域名、网页授权域名
  13. 应对嵌入式校招面试手撕之——链表
  14. 国产网络分析仪的介绍
  15. GTY's gay friends
  16. 【渝粤题库】陕西师范大学210005幼儿教育学作业(高起专)
  17. 使用vue+elementUi+springBoot实现图片上传,图片删除,图片展示
  18. 文心一言 VS 讯飞星火 VS chatgpt (19)-- go语言的slice和rust语言的Vec的扩容流程是什么?
  19. UI设计职业发展方向有哪些 该怎么从事UI行业
  20. “短信轰炸”克星 ,“无感”AI立体防御完美解决方案

热门文章

  1. php include不可用,无法设置PHP include_path
  2. 第十一篇:稳定性之面向失败设计【过载保护】
  3. 关于泰勒展开的两点思考
  4. oracle左连接没用_oracle左外连接不显示正确的空值
  5. Python数据结构:选择排序
  6. html页面选择附件实现,实现单文件上传,页面局部刷新_html/css_WEB-ITnose
  7. java war目录_java war包 路径--解决war包中文件路径问题
  8. python怎么加载库_Python库如何安装和导入
  9. laravel 图片流_Laravel 之添加图片水印
  10. sqlite和java_Java和SQLite