Docker镜像

suaxi
2021-03-21 / 0 评论 / 97 阅读 / 正在检测是否收录...

1.UnionFS 联合文件系统

UnionFS(联合文件系统):是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single vritual filesystem)。Union文件系统是docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。


2.docker镜像加载原理

docker镜像本质由一层一层的文件系统组成——UnionFS。

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与Linux/Unix是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,同时系统也会卸载bootfs。

rootfs(root file system)在bootfs之上,包含的就是Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的Linux发行版(Centos、Ubuntu、RealHat...)

1.UnionFS联合文件系统.png

图片来源:狂神说Java


Docker镜像为什么这么小?

对于一个精简的OS,rootfs可以很小,只需要包含基本的命令、工具和程序库,其底层本质上是调用主机的Kernel,本身只需提供rootfs。


3.分层理解

redis镜像拉取举例:

2.redis拉取举例.png

# 查看镜像分层
docker image inspect 镜像名

"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864",
                "sha256:8e14cb7841faede6e42ab797f915c329c22f3b39026f8338c4c75de26e5d4e82",
                "sha256:1450b8f0019c829e638ab5c1f3c2674d117517669e41dd2d0409a668e0807e96",
                "sha256:f927192cc30cb53065dc266f78ff12dc06651d6eb84088e82be2d98ac47d42a0",
                "sha256:a24a292d018421783c491bc72f6601908cb844b17427bac92f0a22f5fd809665",
                "sha256:3480f9cdd491225670e9899786128ffe47054b0a5d54c48f6b10623d2f340632"
            ]
        },


所有的docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。例:基于Ubuntu16.04创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;继续添加新的软件同理,

3.1分层理解.png

在添加额外镜像层的同时,镜像始终保持当前所有的镜像组合,例:每个镜像层包含3个文件,而总镜像包含来自两个镜像层的6个文件,

3.2分层理解.png

下图中的例子在外部看来整个镜像只包含6个文件,这是因为最上层的文件7是文件5的迭代更新版本

3.3分层理解.png

在这个过程中,上层镜像层中的文件覆盖了底层镜像层中的文件,这使得文件的更新版本作为一个新的镜像层添加到镜像中。

docker通过存储引擎(新版使用快照方式)的方式来实现镜像层堆栈,同时保证多层镜像层对外展示为一个统一的文件系统。

Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs及ZFS。

在Windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统实现分层和CoW。

3.4分层理解.png

所有镜像层堆叠并合并,对外展示为统一的文件系统。


补充

docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,也就是通常所说的容器,容器之下的都叫镜像层。

6.容器层.png

图片来源:狂神说Java


5.commit镜像

# 命令
docker commit -m="注释信息" -a="作者" 容器id 目标镜像名:[TAG]

例:给精简版的tomcat添加一点东西

7.commit镜像.png

0

评论 (0)

取消