03-Docker存储引擎
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03-Docker存储引擎相关的知识,希望对你有一定的参考价值。
参考技术A目前docker的默认存储引擎为overlay2,不同的存储引擎需要相应的文件系统支持,如需要磁盘分区的时候传递d-type稳健分层功能,即需要传递内核参数并开启格式化磁盘的时候指定的功能
Docker 存储引擎的核心思想是“层”的概念,理解了这个层,就基本可以理解它的设计思路。当我们拉取一个 Docker 镜像的时候,可以看到如下:
一个镜像被分成许多的“层”,每“层”包含了若干的文件,而一层层堆叠起来就组成了我们的一个完整的镜像。我们镜像中的文件就是所有“层”文件的并集。 我们构建 Docker 镜像一般采用 Dockerfile 的方式,而 Dockerfile 的每行命令,其实就会生成一个“层”,即使什么文件都没有添加。
文件的创建是在读写层增加文件,那修改和删除呢?
这就要提一下 Docker 设计的 copy-on-write (CoW) 策略。
当我们试图读取一个文件时,Docker 会从上到下一层层去找这个文件,找到的第一个就是我们的文件。所以下面层相同的文件就被“覆盖”了。而修改就是当我们找到这个文件时,将它“复制”到读写层并修改,这样读写层的文件就是我们修改后的文件,并且“覆盖”了镜像中的文件了。而删除就是创建了一个特殊的 whiteout 文件,这个 whiteout 文件覆盖的文件即表示删除了。
这样的设计有什么好处吗?
第一个好处是减少了存储空间,由于镜像被分成了多个层,而各个层是静态只读的,是可以共享的。当你从一个镜像构建另一个镜像时,只需要添加新的层,原有的层不会被复制。
我们可以用 docker history 命令查看我们创建的镜像,相同的层将共享且只保存一份。
我们可以在系统的 /var/lib/docker/<存储驱动>/ 下看到我们所有的层。
第二个好处是启动容器就变得非常轻量和快速。因为我们的容器只是添加了一个“空”的读写层,其他的都是复用的只读层,需要用时才会去搜索。
Docker 的存储引擎针对不同的文件系统,是由不同的存储驱动。
Docker 主要有一下几类存储驱动:
有条件的情况下,我们还是建议选择 overlay2 的存储驱动。
Linux 系统正常运行, 通常需要两个文件系统:
OverlayFS 是从 aufs 之上改进和简化而来的,比 aufs 和 devicemapper 有更好的性能,大部分情况下也比 btrfs 好。
OverlayFS 结构分为三个层: LowerDir 、 Upperdir 、 MergedDir
LowerDir、Upperdir、MergedDir 关系图:
特性:
获取镜像存储路径
Lower层
LowerDir 层的存储是不允许创建文件, 此时的LowerDir实际上是其他的镜像的UpperDir层,也就是说在构建镜像的时候, 如果发现构建的内容相同, 那么不会重复的构建目录,而是使用其他镜像的Upper 层来作为本镜像的Lower
Merged层
属于对外展示层,只能在运行中的容器查看,镜像是查看不了的
1)查看init层地址指向
容器在启动的过程中, Lower 会自动挂载init的一些文件
2) init层主要内容是什么?
init层是以一个uuid+-init结尾表示,放在只读层(Lowerdir)和读写层(Upperdir)之间,
作用只是存放/etc/hosts、/etc/resolv.conf 等文件。
3) 为什么需要init层?
(1) 容器在启动以后, 默认情况下lower层是不能够修改内容的, 但是用户有需求需要修改主机名与域名地址, 那么就需要添加init层中的文件(hostname, resolv.conf), 用于解决此类问题.
(2) 修改的内容只对当前的容器生效, 而在docker commit提交为镜像时候,并不会将init层提交。
(3) init 文件存放的目录为/var/lib/docker/overlay2/<init_id>/diff
4) 查看init层文件
hostname与resolv.conf 全部为空文件, 在系统启动以后由系统写入。
配置 Docker 存储驱动非常简单,只需要修改配置文件即可。
方法1
方法2
以上是关于03-Docker存储引擎的主要内容,如果未能解决你的问题,请参考以下文章