Docker镜像的组成原理
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
更多推荐

所有评论(0)