Docker中的镜像分层
Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。
1、Docker 镜像为什么分层
镜像分层最大的一个好处就是共享资源。 比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜 像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共 享。
如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容 器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。
2、可写的容器层
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫 “镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容 器层下面的所有镜像层都是只读的。
3、容器层的细节说明
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同 路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器 层中,用户看到的是一个叠加之后的文件系统。
Dockerfile 介绍
Docker中有个非常重要的概念叫做——镜像(Image)。Docker 镜像是一个特殊的文件系统,除 了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构 建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜 像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每 一条指令的内容,就是描述该层应当如何构建。
[root@localhost ~]# mkdir /db
[root@localhost ~]# cd /db
[root@localhost db]# systemctl start docker
[root@localhost db]#
[root@localhost db]# vim Dockerfile
ARG VER=latest
FROM busybox:$VER
MAINTAINER wyx<wyx@111.com>
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p ${WEB_DOC_ROOT}
COPY index.html ${WEB_DOC_ROOT}/index.html
EXPOSE 80
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
Dcokerfile指令介绍
FROM
介绍
- FROM 指令必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句; FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环 境;
- 实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指 定的镜像文件,在其不存在时,则会自动从 Docker 的公共库 pull 镜像下来。如果找不到指定的 镜像文件,docker build 会返回一个错误信息;
- FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。 如果FROM语句没有指定镜像标签,则默认使用latest标签。
ARG
介绍
- ARG指令类似ENV,定义了一个变量;区别于ENV:用户可以在构建时docker build --build-arg = 进行对变量的修改;ENV不可以;
- 如果用户指定了未在Dockerfile中定义的构建参数,那么构建输出警告。
MAINTAINER
介绍
用于让dockerfile制作者提供本人的详细信息 dockerfile 并不限制MAINTAINER 指令可在出现的位置,但推荐将其放置于FROM指令之后
COPY
介绍
用于从docker 主机复制新文件或者目录至创建的新镜像指定路径中
EXPOSE
介绍
用于为容器打开指定要监听的端口以实现与外部通信
RUN
介绍
用于指定docker build过程中运行的程序,其可以是任何命令
ENV
介绍
- 用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、 COPY等)所调用
- 调用格式为$variable_ name 或 ${variable_ name}
示例
[root@localhost db]# docker build -t web:v2 ./ --load
[+] Building 1.5s (7/7) FINISHED docker-container:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 344B 0.0s
=> [internal] load metadata for docker.io/library/busybox:latest 1.3s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/2] FROM docker.io/library/busybox:latest@sha256:650fd573e056b679a5110a70aabeb01e26b76e545ec4b9c70a9523f2dfaf18c6 0.0s
=> => resolve docker.io/library/busybox:latest@sha256:650fd573e056b679a5110a70aabeb01e26b76e545ec4b9c70a9523f2dfaf18c6 0.0s
=> CACHED [2/2] RUN mkdir -p /data/web/html && echo "<h1>Busybox httpd server</h1>" > /data/web/html/index.html 0.0s
=> exporting to docker image format 0.1s
=> => exporting layers 0.0s
=> => exporting manifest sha256:ac9ab7ea17a22df4d6b811825b8d72617057773c55d4ac1333202c077d02edc9 0.0s
=> => exporting config sha256:d295a55faa063775dc81658b0f9a2b022e8c3ebee479fe7b94386155c695c810 0.0s
=> => sending tarball 0.1s
=> importing to docker 0.0s
=> => loading layer 29daefb0147a 223B / 223B 0.0s
[root@localhost db]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
web v2 d295a55faa06 6 minutes ago 4.26MB
moby/buildkit buildx-stable-1 480495983c47 5 weeks ago 172MB
wordpress latest 2fc2a7b04129 5 weeks ago 739MB
tencentci/discuz latest caba9d3ea6d8 8 weeks ago 574MB
mysql 5.7 5107333e08a8 3 months ago 501MB
goharbor/harbor-exporter v2.8.4 b8d33e28ec68 6 months ago 97.7MB
goharbor/redis-photon v2.8.4 7b7324d651ca 6 months ago 120MB
goharbor/trivy-adapter-photon v2.8.4 91d8e9f0b21a 6 months ago 464MB
goharbor/notary-server-photon v2.8.4 a46f91560454 6 months ago 113MB
goharbor/notary-signer-photon v2.8.4 da66bd8d944b 6 months ago 110MB
goharbor/harbor-registryctl v2.8.4 805b38ca6bee 6 months ago 141MB
goharbor/registry-photon v2.8.4 756769e94123 6 months ago 79MB
goharbor/nginx-photon v2.8.4 375018db778b 6 months ago 116MB
goharbor/harbor-log v2.8.4 8a2045fb24d2 6 months ago 124MB
goharbor/harbor-jobservice v2.8.4 97808fc10f64 6 months ago 141MB
goharbor/harbor-core v2.8.4 c26fcd0714d8 6 months ago 164MB
goharbor/harbor-portal v2.8.4 4a8b0205c0f9 6 months ago 124MB
goharbor/harbor-db v2.8.4 5b8af16d7420 6 months ago 174MB
goharbor/prepare v2.8.4 bdbf974d86ce 6 months ago 166MB
busybox latest ba5dc23f65d4 9 months ago 4.26MB
mysql 5.6 dd3b2a5dcb48 2 years ago 303MB
y109/discuz latest 607a1b6e9cc4 8 years ago 542MB
training/webapp latest 6fae60ef3446 8 years ago 349MB
training/postgres latest 6fa973bb3c26 9 years ago 365MB
[root@localhost db]# docker run -d --name test1 -P web:v2
ed9d72069d829036d826e87875f1b15242c358d67d95130862ef8ee440caa0f3
[root@localhost db]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed9d72069d82 web:v2 "/bin/sh -c '/bin/ht…" 5 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp test1
faed7103e3ff moby/buildkit:buildx-stable-1 "buildkitd" 11 minutes ago Up 11 minutes buildx_buildkit_default