Docker镜像原理详解(图文全面总结)

Docker镜像

Docker 镜像(Image)是一个轻量、可执行的独立软件包。

Docker 镜像(Image,包含运行某个软件所需的全部内。

如下图所示:

Docker镜像原理详解(图文全面总结)-mikechen

包括:代码、运行时、库、环境变量和配置文件等。

你可以将其理解为容器的“模板”或“快照”,容器就是由镜像运行出来的。

比如:镜像 (Image) 就像一个类的定义 (Class Definition)。

而容器 (Container) ,就像这个类创建的一个对象 (Object)。

总之,可以将 Docker 镜像看作是一个应用程序及其所有依赖项的“快照”。

这个快照可以在任何运行 Docker 的环境中以相同的方式启动和运行。

 

Docker镜像原理

Docker 镜像采用分层架构(Layered Architecture),其背后的核心技术是 联合文件系统(UnionFS)。

主要实现原理包括:

镜像由多层组成,每一层对应一次构建操作(如RUN/COPY)。

各层是只读的,可以被多个容器共享,提高了存储效率。

各层通过 UnionFS 挂载到一个统一的视图中。

Docker镜像原理详解(图文全面总结)-mikechen

一个 Docker 镜像主要由以下几个核心部分组成:

基础镜像 (Base Image)

基础镜像是构建其他 Docker 镜像的起点,它通常是一个非常精简的操作系统发行版(例如  Linux)。

或者是一个预配置的运行时环境(例如 Node.js、Java 的 JRE)。

Docker镜像原理详解(图文全面总结)-mikechen

基础镜像不依赖于任何其他镜像,选择一个合适的基础镜像对于减小镜像体积和提高安全性至关重要。

镜像层 (Image Layers)

如前所述,Docker 镜像由多个有序的只读层叠加而成。

Docker镜像原理详解(图文全面总结)-mikechen

Dockerfile 中的每一条命令(如 RUN、COPY、ADD)都会创建一层镜像。

镜像层有以下特征:

  • 层是不可变的(immutable);

  • 层是按顺序堆叠的;

  • 上层可以“覆盖”下层的内容(同路径);

  • 多个镜像可共享相同的底层层(节省空间)。

 

 UnionFS (联合文件系统)

联合文件系统(UnionFS),也称为联合挂载(union mount)。

Docker镜像原理详解(图文全面总结)-mikechen

是一种将多个文件系统的目录(称为分支,branches)透明地叠放在一起,形成一个单一的虚拟文件系统的技术。

这意味着,尽管这些目录在物理上是分离的,但在用户和应用程序看来,它们的内容被合并成了一个统一的目录结构。

核心思想: 将多个不同的文件系统层合并成一个逻辑上的整体。

假设一个 Docker 镜像由三层组成:Layer A (Base OS), Layer B (Installed Software), Layer C (Application Code)。

[Layer D (Read-Write - Container Layer)]
    ^
    |
[Layer C (Read-Only - Application Code)]
    ^
    |
[Layer B (Read-Only - Installed Software)]
    ^
    |
[Layer A (Read-Only - Base OS)]

当基于这个镜像启动一个容器时,Docker 会将这三层只读地挂载,并在其之上添加一个可读写的容器层 (Layer D)。

UnionFS 通过将多个独立的文件系统层透明地叠加在一起,形成一个统一的视图,为 Docker 镜像的分层存储和容器的读写操作提供了强大的基础。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法