0Pricing
DevOps Bootcamp · 课时

用于提升效率的多阶段构建

使用多阶段构建,通过分离构建依赖和运行时依赖,创建更小且更安全的生产镜像

用于提升效率的多阶段构建 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。

多阶段构建简介

欢迎学习高级 Dockerfile 优化!今天,我们将探索多阶段构建,这是一种用于创建更小、更高效 Docker 镜像的强大技术。

更小的镜像可以带来更快的下载速度、更高的安全性以及更好的资源利用率。

用于提升效率的多阶段构建 — 插图 1

为什么镜像越小越好

构建 Docker 镜像时,其中通常会包含一些只在构建过程中需要、而在最终应用运行时并不需要的工具和依赖项。

  • 拉取更快:更小的镜像下载速度更快。
  • 占用更少磁盘空间:节省镜像仓库和主机上的存储空间。
  • 减小攻击面:组件越少,潜在漏洞也越少。
  • 提高安全性:生产镜像只包含必要内容。

单阶段构建的问题

以编译型应用为例,例如使用 Go 编写的应用。传统的单阶段 Dockerfile 会将完整的 Go 编译器和开发依赖项包含在最终镜像中。

这会使最终镜像远大于实际所需大小,因为运行已编译的二进制文件并不需要编译器。

单阶段示例(Go)

下面是一个简单的 Go 应用及其 Dockerfile,该文件在单个阶段中完成构建。请注意,构建环境也被包含在最终镜像中。

main.go:

package main

import "fmt"

func main() {
    fmt.Println("Hello from Single-Stage Docker!")
}

单阶段 Dockerfile

这个 Dockerfile 使用 `golang:1.21-alpine` 作为基础镜像。应用构建完成后,这个庞大的基础镜像及其所有构建工具仍会保留在最终镜像中。

FROM golang:1.21-alpine
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
EXPOSE 8080
CMD ["./myapp"]

多阶段构建的组成

多阶段构建通过允许您在单个 Dockerfile 中定义多个 `FROM` 指令来解决这个问题。每个 `FROM` 都会开始一个新的构建阶段。

  • 使用 AS 关键字为阶段命名(例如 FROM golang:1.21-alpine AS builder)。
  • 随后可以使用 COPY --from=<stage_name> 从之前的阶段复制构建产物。

只有最后一个阶段会作为镜像保存。

多阶段结构

典型的多阶段 Dockerfile 至少包含两个阶段:

  • 构建阶段:包含编译应用所需的全部工具和源代码。
  • 运行阶段:使用最小化基础镜像,只包含已编译的应用和运行时依赖项。

构建阶段的中间镜像会被丢弃,只留下精简的最终镜像。

多阶段示例(Go)

我们来使用多阶段方法重写 Go 应用的 Dockerfile。我们将在第一个阶段构建应用,然后只将编译后的二进制文件复制到小得多的 `alpine` 基础镜像中。

# Stage 1: Build the application
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go

# Stage 2: Create the final lightweight image
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]

运行多阶段构建

构建这个 Dockerfile 时,Docker 会执行每个阶段。不过,只有最后一个 `FROM` 指令的内容,以及从之前阶段复制的文件,才会组成最终镜像。

与单阶段构建相比,这样得到的镜像会小得多,因为 Go 编译器和构建工具会留在之前的阶段中。

多阶段构建的优势

多阶段构建对于以下场景非常有用:

  • 编译型语言:Go、Java、C++、Rust。
  • 前端框架:构建 React/Angular 应用,并使用 Nginx 提供静态资源。
  • Node.js 应用:在构建阶段安装 `node_modules`,然后只将 `package.json`、`package-lock.json` 和构建后的应用复制到精简的运行时镜像中。

检查您的知识

以下哪些是使用多阶段 Docker 构建的主要优势?

回顾:多阶段构建的效率

您已经了解了多阶段 Docker 构建!

  • 它们会在单个 Dockerfile 中使用多个 FROM 指令。
  • AS 关键字用于命名阶段,而 COPY --from= 用于传输构建产物。
  • 其主要优势是最终镜像体积大幅减小,同时更加安全、高效。

这项技术对于优化容器化应用至关重要。接下来,我们将了解如何利用构建缓存!

常见问题解答

「用于提升效率的多阶段构建」课时是免费的吗?

是的 — 「用于提升效率的多阶段构建」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。

「用于提升效率的多阶段构建」这节课中我会学到什么?

使用多阶段构建,通过分离构建依赖和运行时依赖,创建更小且更安全的生产镜像 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 DevOps Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「用于提升效率的多阶段构建」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 DevOps Bootcamp 课中编写并运行代码吗?

能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 用于提升效率的多阶段构建
  2. 利用构建缓存
  3. Dockerfile 安全最佳实践
  4. 使用 Slim 与 Distroless 基础镜像减小镜像体积
← 返回 DevOps Bootcamp