Docker镜像
Docker 镜像(Image)是一个轻量、可执行的独立软件包。
Docker 镜像(Image,包含运行某个软件所需的全部内。
如下图所示:
包括:代码、运行时、库、环境变量和配置文件等。
你可以将其理解为容器的“模板”或“快照”,容器就是由镜像运行出来的。
比如:镜像 (Image) 就像一个类的定义 (Class Definition)。
而容器 (Container) ,就像这个类创建的一个对象 (Object)。
总之,可以将 Docker 镜像看作是一个应用程序及其所有依赖项的“快照”。
这个快照可以在任何运行 Docker 的环境中以相同的方式启动和运行。
Docker镜像原理
Docker 镜像采用分层架构(Layered Architecture),其背后的核心技术是 联合文件系统(UnionFS)。
主要实现原理包括:
镜像由多层组成,每一层对应一次构建操作(如RUN/COPY)。
各层是只读的,可以被多个容器共享,提高了存储效率。
各层通过 UnionFS 挂载到一个统一的视图中。
一个 Docker 镜像主要由以下几个核心部分组成:
基础镜像 (Base Image)
基础镜像是构建其他 Docker 镜像的起点,它通常是一个非常精简的操作系统发行版(例如 Linux)。
或者是一个预配置的运行时环境(例如 Node.js、Java 的 JRE)。
基础镜像不依赖于任何其他镜像,选择一个合适的基础镜像对于减小镜像体积和提高安全性至关重要。
镜像层 (Image Layers)
如前所述,Docker 镜像由多个有序的只读层叠加而成。
Dockerfile 中的每一条命令(如 RUN、COPY、ADD)都会创建一层镜像。
镜像层有以下特征:
-
层是不可变的(immutable);
-
层是按顺序堆叠的;
-
上层可以“覆盖”下层的内容(同路径);
-
多个镜像可共享相同的底层层(节省空间)。
UnionFS (联合文件系统)
联合文件系统(UnionFS),也称为联合挂载(union mount)。
是一种将多个文件系统的目录(称为分支,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面试题总结》