本文主要了解下 docker 镜像的分层结构。
镜像分层
镜像分层结构
如上图所示,docker 分层主要分为两大层,上层是“容器层”,下层是“镜像层”。
容器层可以读写,容器所有发生文件变更写都发生在这一层,容器自身内部完成,容器互相独立互不干扰。镜像层 read-only,只允许读取。
通过镜像构建时看分层
docker build -t zwqh.top/mywebapp:1.0 /usr/image/my-dockerfile
____________________________________________
Sending build context to Docker daemon 28.97MB
Step 1/4 : FROM tomcat:jdk8-corretto
---> 79b38376f3de
Step 2/4 : MAINTAINER zwqh.top
---> Running in 13c52044c758
Removing intermediate container 13c52044c758
---> 817712d51c7e
Step 3/4 : WORKDIR /usr/local/tomcat/webapps
---> Running in 6575a667ae48
Removing intermediate container 6575a667ae48
---> 65d94934c688
Step 4/4 : ADD docker-web ./docker-web
---> 80946ac76b0d
Successfully built 80946ac76b0d
Successfully tagged zwqh.top/mywebapp:1.0
从上面内容看执行的每一步都会生成一个临时镜像,临时镜像只用于镜像的构建,不能直接使用。
临时镜像可以看做是一种快照,每执行一步都会对当时系统环境进行一次快照,类似游戏的存档。
而每一步又类似叠汉堡,有层次~
分层的临时容器可重用
分层的临时容器是可重用的,如果不更换底层配置,只需构建不同的部分就可以了~
示例:
#进入镜像目录
cd /usr/image
#创建docker-layer目录
mkdir docker-layer
#进入docker-layer目录
cd /docker-layer
#编辑Dockerfile文件
vim Dockerfile
#基准镜像
FROM centos
#构建镜像时输出
RUN ["echo","aaaa"]
RUN ["echo","bbbb"]
RUN ["echo","cccc"]
RUN ["echo","dddd"]
:wq #保存
#构建镜像
docker build -t zwqh.top/docker-layer:1.0 /usr/image/docker-layer
#运行内容
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM centos
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
---> 300e315adb2f
Step 2/5 : RUN ["echo","aaaa"]
---> Running in 9e8f37427440
aaaa
Removing intermediate container 9e8f37427440
---> 090240f2c10b
Step 3/5 : RUN ["echo","bbbb"]
---> Running in c472cfecc059
bbbb
Removing intermediate container c472cfecc059
---> f06a8292da38
Step 4/5 : RUN ["echo","cccc"]
---> Running in a5865c336958
cccc
Removing intermediate container a5865c336958
---> cc49ab52eb9a
Step 5/5 : RUN ["echo","dddd"]
---> Running in 5838d16395b1
dddd
Removing intermediate container 5838d16395b1
---> 99549efe0556
Successfully built 99549efe0556
Successfully tagged zwqh.top/docker-layer:1.0
#修改Dockerfile文件
vim Dockerfile
#基准镜像
FROM centos
#构建镜像时输出
RUN ["echo","aaaa"]
RUN ["echo","bbbb"]
RUN ["echo","eeee"]
RUN ["echo","ffff"]
#再次构建镜像
docker build -t zwqh.top/docker-layer:1.1 /usr/image/docker-layer
#运行内容
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM centos
---> 300e315adb2f
Step 2/5 : RUN ["echo","aaaa"]
---> Using cache
---> 090240f2c10b
Step 3/5 : RUN ["echo","bbbb"]
---> Using cache
---> f06a8292da38
Step 4/5 : RUN ["echo","eeee"]
---> Running in 6ec0861d5b83
eeee
Removing intermediate container 6ec0861d5b83
---> e5f314de5417
Step 5/5 : RUN ["echo","ffff"]
---> Running in 249aef1aef8a
ffff
Removing intermediate container 249aef1aef8a
---> 12ce8a3e910b
Successfully built 12ce8a3e910b
Successfully tagged zwqh.top/docker-layer:1.1
可以看到第二次构建没有输出 aaaa、bbbb,再看 Using cache,说明临时镜像是重用的,这样可以减少步骤快速构建。
总结
本文主要学习了 docker 镜像分层,docker 内部构建过程及原理,后续章节将会对 Dockerfile 文件指令进行详细解析。
评论区