6.1 构建镜像原则

系列 - 应用程序容器化
摘要
本实验将带你探索Docker镜像的构建技巧,包括选择合适的基础镜像、减少镜像层数。
你的Docker镜像为什么这么大

同样安装Go语言环境,选择不同的基础镜像:

  • Ubuntu基础镜像 → 最终镜像 600MB+
  • Alpine基础镜像 → 最终镜像 300MB+

差距2倍多!这意味着什么?

  • ⏱️ 传输时间减半
  • 💾 存储成本减半
  • 🚀 容器启动更快

让我们动手验证这个差异。

在这个任务中,我们将创建两个基于不同父镜像(Ubuntu和Alpine)的Dockerfile,以比较它们在镜像大小上的差异。

1、创建目录

bash

mkdir /root/compare
cd /root/compare

2、创建两个 Dockerfile 文件

bash

touch Dockerfile-1 Dockerfile-2

3、编辑Dockerfile文件内容

Dockerfile-1 文件内容(基于Ubuntu):

Dockerfile-2 文件内容(基于Alpine):

TSfVr7

信息
golang 在 Ubuntu 系统中的软件包名为 golang,在 alpine 系统中直接叫 go。这是因为不同的Linux发行版可能对同一软件使用不同的包名。

4、构建两个镜像

使用 Dockerfile-1 构建 golang:ubuntu 镜像:

stmfyR

使用 Dockerfile-2 构建 golang:alpine 镜像:

WUn9E9

Docker build参数解释
  • -t:指定构建的镜像名称和标签,格式为name:tag
  • -f:指定使用的Dockerfile文件路径,当Dockerfile不是默认文件名或不在当前目录时使用
  • .:构建上下文路径,Docker会将这个路径下的所有文件发送给Docker守护进程

5、对比镜像大小

bash

docker images golang

xp1lm1

基础镜像选择技巧
从上面的结果可以看出,基于Alpine的镜像比基于Ubuntu的镜像小很多。Alpine是一个轻量级Linux发行版,镜像大小通常只有几MB,非常适合作为Docker镜像的基础。 当你的应用不需要特定发行版的功能时,优先使用Alpine作为基础镜像

在这个任务中,我们将创建两个 Dockerfile 来对比镜像层数对最终镜像大小的影响。

1、在 /root/compare 中创建文件 Dockerfile-3 和 Dockerfile-4,内容如下:

Dockerfile-3(多层构建):

4sKNqr

Dockerfile-4(减少层数):

jnlThL

信息
Dockerfile-3使用了多个COPY命令,每个命令会创建一个新的镜像层。而Dockerfile-4将多个COPY命令合并为一个COPY命令,这样只会创建一个镜像层。

2、构建两个镜像,名称分别为 l3 和 l4

构建l3镜像:

ebuJ8v

构建l4镜像:

1DWCtJ

3、对比两个镜像的层数

docker history 命令可以查看镜像的层数:

6gwIDJ

减少镜像层数的好处
每一层都会增加镜像的复杂度并影响镜像性能。通过合并命令减少层数,不仅可以优化镜像大小,还能提高构建和部署的效率。

在这个任务中,我们将创建一个包含Firefox浏览器和VNC服务器的Docker镜像,让用户可以通过网页远程访问容器中运行的Firefox。

1、创建目录

bash

mkdir /root/firefox-vnc
cd /root/firefox-vnc

2、创建 Dockerfile 文件

bash

vim Dockerfile

文件内容

思考问题

为什么在一条 RUN 指令中执行两次 apt-get,而不是拆成两条 RUN 指令?

答:这是为了减少镜像层数。每一个RUN指令都会创建一个新的镜像层,而通过&&连接多个命令,可以在一个层中完成多个操作,从而减小最终镜像的大小。另外,将apt-get update和apt-get install放在同一个RUN命令中可以确保使用的是最新的软件包列表。

3、构建镜像

bash

docker build -t firefox-vnc .

4、查看镜像列表

5、启动容器

bash

docker run --rm -p 8080:8080 --name ff-vnc firefox-vnc
参数解释
  • --rm:容器停止运行后自动删除容器,避免占用磁盘空间
  • -p 8080:8080:将容器内部的8080端口映射到主机的8080端口,使外部能够访问容器内的VNC服务
  • --name ff-vnc:给容器指定一个易记的名称
  • firefox-vnc:使用的镜像名称

6、打开浏览器,输入 ip:8080/vnc.html

应用场景
这种镜像构建方式非常适合需要图形界面应用的场景,如自动化测试、远程桌面应用等。通过在容器中运行GUI应用并暴露VNC服务,用户可以在任何支持网页的设备上远程访问这些应用。

相关内容