1. Docker镜像本质

官方解释:

A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.

译文:镜像是轻量、独立、可执行的软件包,包含应用运行所需:代码、运行时、工具、系统库、配置

镜像是多层只读roofts堆叠而成的静态模板,不含内核(bootfs),复用宿主机内核

镜像的多层只读层 = OverlayFS lowerdir
容器启动自动新建独立读写层 = OverlayFS upperdir
内核通过 OverlayFS 合并两层,得到merged视图,这个合并视图就是容器内可见的 rootfs

2. 两大组成部分

1)多层只读文件层

每一层对应Dockerfile 一条可生成变更的指令:FROM、RUN、COPY、ADD

--每层互相独立、只读,不能修改

--下层改动不会影响上层,多个镜像可以共享底层公共层,节省磁盘

--OverlayFS负责将所有只读层联合展示为一个完整目录

OverlayFS(Docker默认存储驱动)

OverlayFS是Linux内核提供的联合文件系统,用于把多个目录合并挂载成一个统一视图,实现分层文件系统

Overlay简化结构示意图

merged(合并视图):容器内看到的 / 文件系统,lower+upper合并展示出来

upperdir(上层可读写层):容器专属读写层;容器所有新增、修改、删除文件,全写在这里

lowerdir(底层只读层):镜像的多层只读层,只能读、不能改

2)镜像元数据(配置信息,不属于文件层,告诉Docker怎么启动这个镜像)

镜像元数据:镜像除了分层文件数据(rootfs)之外,附带的描述信息

记录容器启动规则:WORKDIR、ENV、CMD、ENTRYPOINT、EXPOSE、USER 等

build阶段仅保存配置,不会生成文件层

3. 容器运行时新增一层

执行docker run,在所有只读镜像层最上方新建一层“容器可写层”

采用写时复制CoW:修改已有文件,先复制文件到可写层再修改,底层镜像保持原样

删除容器,仅销毁可写层,镜像完整保留

4. 总结

Dockerfile 指令 --》逐层生成只读rootfs层+保留元数据 --》多层堆叠 = 镜像

docker run --》叠加容器可写层 --》OverlayFS合并所有层 --》容器可用rootfs

更多推荐