容器镜像中 apt 多层构建优化全攻略

## 一、容器镜像构建的背景

在开发和部署应用程序时,容器化技术变得越来越流行。容器就像是一个个独立的小盒子,里面装着应用程序以及它所需要的所有依赖,能够确保应用在不同的环境中都能稳定运行。而容器镜像是创建容器的基础,它包含了应用运行所需的一切,从操作系统到各种软件包。

在基于 Linux 系统的容器镜像构建中,apt 是一个常用的包管理工具,用于安装和管理软件包。但是,直接使用 apt 安装软件包会带来一些问题,比如镜像体积过大,这会导致镜像的下载和部署时间变长,占用更多的存储空间。所以,对容器镜像中 apt 构建进行优化就显得尤为重要。

## 二、多层构建优化的原理

多层构建优化主要通过分阶段安装、清理缓存和合并层这三个关键步骤来实现。

分阶段安装

分阶段安装就是把镜像构建过程分成多个阶段。在不同的阶段完成不同的任务,比如在一个阶段安装编译工具,在另一个阶段进行应用程序的编译和打包。这样可以避免把不必要的工具和文件包含在最终的镜像中。

清理缓存

apt 在安装软件包时会下载很多缓存文件,这些文件在软件包安装完成后就没有用了,但会占用大量的空间。清理缓存就是在软件包安装完成后,把这些缓存文件删除,从而减小镜像的体积。

合并层

容器镜像是由多个层组成的,每个层都包含了一些文件和目录的变化。合并层就是把一些不必要的层合并在一起,减少镜像的层数,从而进一步减小镜像的体积。

## 三、示例演示(Docker 技术栈)

下面我们通过一个具体的示例来演示如何使用多层构建优化容器镜像中 apt 的安装。

# 第一阶段:构建阶段
# 使用官方的 Ubuntu 镜像作为基础镜像
FROM ubuntu:20.04 as builder

# 设置环境变量,避免在安装过程中出现交互提示
ENV DEBIAN_FRONTEND=noninteractive

# 更新 apt 源并安装必要的软件包
RUN apt-get update && \
    apt-get install -y build-essential curl && \
    # 清理 apt 缓存
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 安装应用程序依赖
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN make

# 第二阶段:运行阶段
# 使用一个更小的基础镜像
FROM ubuntu:20.04

# 设置环境变量,避免在安装过程中出现交互提示
ENV DEBIAN_FRONTEND=noninteractive

# 更新 apt 源并安装应用程序运行所需的最小依赖
RUN apt-get update && \
    apt-get install -y libc6 && \
    # 清理 apt 缓存
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 从构建阶段复制应用程序
COPY --from=builder /app/myapp /usr/local/bin/

# 设置容器启动时执行的命令
CMD ["myapp"]

代码解释:

  1. 第一阶段(构建阶段)

    • FROM ubuntu:20.04 as builder:使用 Ubuntu 20.04 作为基础镜像,并将这个阶段命名为 builder
    • ENV DEBIAN_FRONTEND=noninteractive:设置环境变量,避免在安装过程中出现交互提示。
    • RUN apt-get update && apt-get install -y build-essential curl:更新 apt 源并安装编译工具和 curl
    • apt-get clean && rm -rf /var/lib/apt/lists/*:清理 apt 缓存,减少镜像体积。
    • COPY . /app:将当前目录下的所有文件复制到容器的 /app 目录。
    • RUN make:编译应用程序。
  2. 第二阶段(运行阶段)

    • FROM ubuntu:20.04:使用 Ubuntu 20.04 作为基础镜像。
    • RUN apt-get update && apt-get install -y libc6:更新 apt 源并安装应用程序运行所需的最小依赖。
    • COPY --from=builder /app/myapp /usr/local/bin/:从构建阶段复制编译好的应用程序到运行阶段的镜像中。
    • CMD ["myapp"]:设置容器启动时执行的命令。

## 四、应用场景

多层构建优化适用于各种需要构建容器镜像的场景,特别是以下几种情况:

大型项目

对于大型项目,依赖的软件包较多,使用多层构建可以避免把不必要的开发工具和依赖包含在最终的镜像中,从而减小镜像的体积。

频繁部署

在频繁部署的场景中,较小的镜像体积可以减少镜像的下载和部署时间,提高部署效率。

资源受限的环境

在资源受限的环境中,如边缘计算设备,较小的镜像体积可以减少存储空间的占用,提高资源利用率。

## 五、技术优缺点

优点
  • 减小镜像体积:通过分阶段安装和清理缓存,可以显著减小镜像的体积,减少镜像的下载和部署时间。
  • 提高安全性:只包含应用程序运行所需的最小依赖,减少了潜在的安全风险。
  • 提高构建效率:多层构建可以并行执行不同阶段的任务,提高构建效率。
缺点
  • 增加构建复杂度:多层构建需要对构建过程进行更细致的规划和管理,增加了构建的复杂度。
  • 学习成本较高:对于初学者来说,理解和掌握多层构建的原理和方法需要一定的时间和精力。

## 六、注意事项

在使用多层构建优化容器镜像中 apt 安装时,需要注意以下几点:

缓存清理

在每个阶段安装完软件包后,一定要及时清理 apt 缓存,否则会导致镜像体积过大。

依赖管理

在分阶段安装时,要确保每个阶段只包含该阶段所需的依赖,避免把不必要的依赖包含在最终的镜像中。

## 七、文章总结

通过多层构建优化容器镜像中 apt 的安装,可以显著减小镜像的体积,提高镜像的部署效率和安全性。分阶段安装、清理缓存和合并层是实现多层构建优化的关键步骤。在实际应用中,我们可以根据项目的需求和特点,合理运用这些方法,打造超轻量的业务镜像。