>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Go

Docker Buildx:将构建提升到新水平

听起来很熟悉?你运行 2,构建过程拖得很长。或者更糟:你需要为多个架构构建相同的镜像——比如,为运行 3 的主服务器和十几个运行 4 的树莓派构建。你最终会得到一堆不同的 Dockerfile,或者不得不在不同的机器上运行构建。听起来很熟悉?那这篇文章就是为你准备的!

什么是 Docker Buildx,为什么你需要它?

认识一下 Buildx – 这是一个面向 Docker CLI 的官方插件,将熟悉的 5 命令转变为一个真正的全能镜像构建机器。在底层,Buildx 运行在 BuildKit 之上——这是一个高性能、功能丰富的容器构建引擎,由 Moby Project 开发(也就是 Docker 背后的团队)。Buildx 本质上是一座桥梁,让你能够从 Docker 命令行直接访问所有这些酷炫的 BuildKit 功能,同时保持熟悉的语法。

谁需要这个?基本上任何定期使用 Docker 的开发者。如果你:

  • 为不同架构构建镜像(x86、ARM)。
  • 想要显著加快构建过程。
  • 使用 CI/CD 并追求最大效率。
  • 从事包含多个微服务的复杂项目。

……那么 Buildx 将成为你不可或缺的帮手。

将改变你构建方式的关键功能

Buildx 为 Docker 构建过程带来了大量有用的功能。让我们来看看最有趣的一些。

1. 多平台镜像:一次构建,到处运行!

这可能是最受欢迎的功能之一。以前,要获得一个同时适用于 6 和 7 的镜像,你必须构建两个独立的镜像或使用复杂的脚本。Buildx 彻底简化了这个任务。你可以在构建时指定多个目标平台,Buildx 将创建一个所谓的“清单列表”——一个包含所有指定架构版本的单一镜像。当你在不同平台运行镜像时,Docker 会自动选择正确的版本!

示例:

0

想象一下这将如何简化你跨不同硬件类型维护应用程序的流程,从强大的服务器到紧凑的物联网设备。不再需要担心哪个镜像用于哪里——只需 8,Docker 会处理其他一切。

2. 隔离的构建器和构建农场

Buildx 允许你创建和管理 构建器实例。这意味着什么?你可以设置一个独立的构建环境,不会影响你的主 Docker 守护进程。这对于 CI/CD 超级方便,因为每个构建都需要尽可能隔离和可重复。此外,你可以将多个远程节点组合成一个“构建农场”,分配负载并加快处理速度。

例如,创建一个新的构建器:

1

现在所有构建都将发生在一个新的隔离容器中,而不是在你的主机上。如果你添加 9 并指定远程主机,你可以创建一个真正的分布式构建系统!

3. 使用 Docker Bake 的高级构建

对于使用包含多个服务和 Dockerfile 的复杂项目的开发者,Buildx 提供了与 Docker Bake 的集成。这是一个用于声明式描述构建过程的工具。你不需要编写复杂的 bash 脚本,只需在 10 文件中描述要构建什么以及如何构建,Buildx Bake 就会处理所有繁琐的工作,包括并行依赖构建和输出管理。

它类似于 Makefile,但专为 Docker 和 BuildKit 量身定制,为你提供了一个强大的构建编排工具。

4. 智能缓存和优化

BuildKit 本身在缓存层方面非常高效。Buildx 通过允许你使用 分布式缓存 扩展了这些能力。这意味着如果你或你的团队已经构建了一个类似的镜像,Buildx 可以重用缓存层,即使它们在不同的节点或远程存储中。其结果是显著减少构建时间,特别是对于频繁的代码更改。

底层工作原理

Buildx 不是从头重写 Docker——它使用 BuildKit 的能力来扩展它。BuildKit 不仅仅是一个构建引擎,它是一个完整的框架,提供用于处理文件系统、执行命令和管理依赖项的低级原语。它在设计时就考虑了现代对安全性、性能和多平台支持的要求。

Buildx 允许你为构建器选择不同的 驱动程序

  • 11:使用你的本地 Docker 守护进程(默认)。
  • 12:在单独的容器中运行 BuildKit,提供隔离。
  • 13:允许你直接在 Kubernetes 集群中运行 BuildKit 构建,利用其资源。
  • 14:连接到远程 BuildKit 守护进程。

特别有趣的是 Buildx 如何处理多平台构建。有三种主要策略:

  1. QEMU 模拟: 最简单的方法。如果你的主机系统配置了模拟(例如使用 15),BuildKit 可以使用 QEMU 运行其他架构的二进制文件。Docker Desktop 已经自带此支持。
  2. 原生节点: 为了获得最大性能和复杂场景,你可以创建一个由多个节点组成的构建器,每个节点运行在其原生架构上(例如,一个 16,另一个 17)。Buildx 将在它们之间分配任务。
  3. Dockerfile 中的交叉编译: 如果你的编程语言支持交叉编译,你可以在 Dockerfile 中使用多阶段构建,使用构建器的原生架构为目标平台构建二进制文件。Buildx 为这种情况提供了特殊参数(18、19)。

实际应用:Buildx 将大放异彩的领域

  • 物联网和嵌入式系统开发: 如果你正在为 ARM 处理器设备(如树莓派)创建软件,Buildx 将显著简化构建和测试过程,允许你在主机器上构建镜像。
  • 云应用: 现代云经常使用不同的实例类型,包括为了节省成本而使用 ARM 处理器。Buildx 允许你创建可在任何地方工作的通用镜像。
  • CI/CD 流水线: 更快的构建、在隔离环境中运行它们的能力(例如在 Kubernetes 中)以及集中式缓存——所有这些对于有效的 CI/CD 都至关重要。
  • Apple M1/M2/M3 开发: 如果你使用的是配备 Apple Silicon 芯片的 Mac,你可能遇到过许多 Docker 镜像在历史上针对 20 优化的事实。Buildx 允许你轻松构建和使用原生于 21 的镜像,或创建通用的清单列表。

结论:值得切换到 Buildx 吗?

绝对是!Docker Buildx 不仅仅是一个不错的补充——它是现代 Docker 开发者的必备工具。它解决了我们多年来一直在处理的许多问题,并为更高效、更快速和更灵活的构建流程打开了大门。

如果你仍然只使用 22,切换到 23 是提升技能和显著改善工作流程的最简单、最有效的方法之一。试试看,你会惊讶于你的 Docker 构建变得多么快速和方便!安装很简单,特别是如果你已经有 Docker Desktop 或 Docker Engine 19.03 或更高版本。不要错过这个机会,让你的构建真正现代化和跨平台。

相关项目