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

  1. 由 storage driver 管理的镜像层和容器层。
  2. Data Volume。

storage driver

Docker分层结构

storage driver 实现了多层数据的堆叠并为用户提供一个单一的合并之后的统一视图。

Docker 支持多种 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它们都能实现分层的架构,同时又有各自的特性。Docker
优先使用 Linux 发行版默认的 storage driver。

运行docker info查看 Ubuntu 的默认 driver:

Ubuntu 用的 AUFS,底层文件系统是 extfs,各层数据存放在 /var/lib/docker/aufs。

对于某些容器,直接将数据放在由 storage driver 维护的层中是很好的选择,比如那些无状态的应用。无状态意味着容器没有需要持久化的数据,随时可以从镜像直接创建。但对于另一类应用这种方式就不合适了,它们有持久化数据的需求,容器启动时需要加载已有的数据,容器销毁时希望保留产生的新数据,也就是说,这类容器是有状态的。

这就要用到 Docker 的另一种存储机制:

Data Volume

Data Volume 有以下特点:

  1. Data Volume 是目录或文件。
  2. 容器可以读写 volume 中的数据。
  3. volume数据可以被永久的保存,即使使用它的容器已经销毁。

docker 提供了两种类型的 volume:bind mount 和 docker managed volume

bind mount

bind mount 是将 host 上已存在的目录或文件 mount 到容器。

例如 docker host 上有目录 $HOME/htdocs:

root@ubuntu:~/htdocs# cat index.html
this is a file in host file system

通过 -v 将其 mount 到 httpd 容器:

root@ubuntu:~/htdocs# docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
8940a1cf3724e03583c4eac7dca0380c368cf4c75763913f3353b57ae1f23050

/usr/local/apache2/htdocs 就是 apache server 存放静态文件的地方。由于 /usr/local/apache2/htdocs 已经存在,原有数据会被隐藏起来,取而代之的是 host $HOME/htdocs/ 中的数据。

root@ubuntu:~/htdocs# curl 127.0.0.1:80
this is a file in host file system

curl 显示当前主页确实是 $HOME/htdocs/index.html 中的内容。更新一下,看是否能生效:

root@ubuntu:~/htdocs# echo "update index page in mypage" > ~/htdocs/index.html
root@ubuntu:~/htdocs# curl 127.0.0.1:80
update index page in mypage

host 中的修改确实生效了,bind mount 可以让 host 与容器共享数据。这在管理上是非常方便的。

下面我们将容器销毁,看看对 bind mount 有什么影响:

root@ubuntu:~/htdocs# docker stop 8940a1cf3724
8940a1cf3724
root@ubuntu:~/htdocs# docker rm 8940a1cf3724
8940a1cf3724
root@ubuntu:~/htdocs# cat ~/htdocs/index.html
update index page in mypage

mount point 有很多应用场景,比如我们可以将源代码目录 mount 到容器中,在 host 中修改代码就能看到应用的实时效果。再比如将 mysql 容器的数据放在 bind mount 里,这样 host 可以方便地备份和迁移数据。

不过bind mount 需要指定 host 文件系统的特定路径,这就限制了容器的可移植性,当需要将容器迁移到其他 host,而该 host 没有要 mount 的数据或者数据不在相同的路径时,操作会失败。

docker managed volume

 docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd
f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340

我们通过 -v 告诉 docker 需要一个 data volume,并将其 mount 到 /usr/local/apache2/htdocs。那么这个 data volume 具体在哪儿呢?

这个答案可以在容器的配置信息中找到,执行 docker inspect 命令:

docker inspect 21accc2ca072"Mounts": [{"Name": "f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340","Source": "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data","Destination": "/usr/local/apache2/htdocs","Driver": "local","Mode": "","RW": true,"Propagation": ""}]

每当容器申请 mount docker manged volume 时,docker 都会在/var/lib/docker/volumes 下生成一个目录(例子中是 "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data ),这个目录就是 mount 源。

root@ubuntu:~/htdocs# cd /var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data/
root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# ls
index.html
root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# cat index.html
<html><body><h1>It works!</h1></body></html>

修改host的这个挂载的文件试一试:

7f33c5acf5edc77c4674/_data# echo "update valumn form host !" > /var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data/index.html
root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# curl 127.0.0.1:80
update valumn form host !

简单回顾一下 docker managed volume 的创建过程:

  1. 容器启动时,简单的告诉 docker “我需要一个 volume 存放数据,帮我 mount 到目录 /abc”。
  2. docker 在 /var/lib/docker/volumes 中生成一个随机目录作为 mount 源。
  3. 如果 /abc 已经存在,则将数据复制到 mount 源,
  4. 将 volume mount 到 /abc

容器学习 之 docker存储(十五)相关推荐

  1. LINUX学习基础篇(十五)软件包管理

    LINUX学习基础篇(十五)软件包管理 软件包管理 软件包分类 源码包 二进制包 选择 依赖性 rpm包安装 rpm包命名规则 rpm包安装和卸载 服务命令 rpm查询命令 验证 数字证书 rpm中文 ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...

  3. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  4. 学习进度条(第十五周)

    学习进度条(第十五周) 所用时间:15小时左右 代码量:185行 博客量:3篇 收获知识:阅读<梦断代码>体会程序员的精彩经历,学会如何项目总结. 转载于:https://www.cnbl ...

  5. 深度学习入门笔记(十五):深度学习框架(TensorFlow和Pytorch之争)

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  6. 动手深度学习笔记(四十五)8.1. 序列模型

    动手深度学习笔记(四十五)8.1. 序列模型 8.1. 序列模型 8.1.1. 统计工具 8.1.1.1. 自回归模型 8.1.1.2. 马尔可夫模型 8.1.1.3. 因果关系 8.1.2. 训练 ...

  7. Slicer学习笔记(三十五)slicer学习链接

    Slicer学习笔记(三十五)slicer学习链接 使用方面: 坐标系:https://www.slicer.org/wiki/Coordinate_systems 模块:https://slicer ...

  8. Java学习笔记(三十五)

    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度.现在将跟着视频做的笔记进行整理.本篇博客是整理Java知识点的第三十五 ...

  9. Python学习笔记:第十五站 大宝藏

    Python学习笔记 文章目录 Python学习笔记 第十五站 大宝藏 1. 编码格式介绍 2. 文件的读写原理 3. 文件读写操作 4. 文件对象常用的方法 5. with语句(上下文管理器) 6. ...

最新文章

  1. 剑指offer_第1题_二维数组中的查找
  2. 关于Python类属性与实例属性的讨论
  3. 4 拼接_解析,地漏与瓷砖的4种拼接方法及安装工艺
  4. shell编程之特殊变量
  5. linux 7za下载,Linux安装7za
  6. 什么是MVP架构模式(Model、View、Presenter)?(软件设计模式MVC、MVVW)
  7. 属于web框架的python库_(2017)我不建议使用的Python Web框架
  8. 一个有意思的CStatic和combobox以及Cedit控件结合使用
  9. Redux Todos Example
  10. oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)
  11. LeetCode 108. Convert Sorted Array to Binary Search Tree
  12. 计算机专业电脑配置,计算机专业的学生在租电脑时如何选择电脑配置?
  13. 虚拟机Linux下如何查看自己的IP地址
  14. ROS Spinning-----简介
  15. WinSCP乱码解决
  16. Redis Zset的实现为什么用跳表,而不用平衡树?
  17. 学计算机减肥,电脑瘦身(教你一分钟让电脑瘦身)
  18. 树莓派(十三)——使用flask创建视频流媒体服务器
  19. ubuntu、win跨平台局域网文件传输工具
  20. Java SE day21_网络编程

热门文章

  1. frida hook java层常用模板
  2. AWS如何迁移实例到另一个区?
  3. 技术面试中,遇到不会回答的问题怎么破?来,教你几招!
  4. DeepFocus,基于AI实现更逼真的VR图像
  5. Salsify:高流畅度的实时视频传输新方式
  6. Hive常见面试问题(持续更新)
  7. 数据结构与算法之栈入门题目
  8. Java基础之String深入解析
  9. 云开发如何帮助业务扛过大流量活动洪峰丨深度好文
  10. 海量小文件场景下训练加速优化之路