天天看点

容器镜像构建神器 Buildx,支持多平台

作者:不秃头程序员
容器镜像构建神器 Buildx,支持多平台

1.简介

Docker 是一种流行的部署工具,使我们能够打包和运行应用程序。由于采用率很高,因此需要根据不同的要求扩展功能。因此,为了实现这一点,可以使用第三方docker 插件[1]。

例如,如果希望数据跨不同主机持久化数据,可以使用卷插件。另一个常用的插件是 Docker buildx[2] 。它通过使用 BuildKit builder 扩展了镜像的构建能力。因此,使用该插件,我们可以为不同的平台和架构构建镜像。此外,它支持使用自定义上下文进行并行多阶段制作。

在本教程中,我们将介绍 Docker buildx。

2.安装 buildx

首先,要运行 buildx ,我们需要安装 Docker。对 Docker buildx 的支持从 19.00 开始可用。

首先检查 Docker 版本:

$ docker --version
Docker version 19.03.8, build afacb8b           

接下来,通过设置环境变量启用 Docker 实验性功能:

$ export DOCKER_CLI_EXPERIMENTAL=enabled           

为了确保我们的设置在会话结束后仍然存在,我们将变量添加到$HOME/.bashrc,现在应该可以访问 buildx:

$ docker buildx

Usage:  docker buildx COMMAND

Build with BuildKit

Management Commands:
  imagetools  Commands to work on images in registry

Commands:
  bake        Build from a file
  build       Start a build
  create      Create a new builder instance
  inspect     Inspect current builder instance
  ls          List builder instances
  rm          Remove a builder instance
  stop        Stop builder instance
  use         Set the current builder instance
  version     Show buildx version information

Run 'docker buildx COMMAND --help' for more information on a command.           

这显示了常用命令和每个命令的语法。

3.使用 buildx 构建

buildx 执行所有Docker 构建[3]功能。因此,可以轻松地运行并执行它们。例如,指定目标平台、构建缓存和输出配置。除此之外, buildx 还提供了额外的功能。

首先是同时为多个平台构建镜像的能力。其次,在单个 dockerfile 中为较小的镜像进行多阶段构建。最后,在构建过程中自定义输入、参数或变量的能力。

让我们通过创建一个实例来深入研究一个例子:

$ docker buildx create --name ourbuilder
ourbuilder           

这将创建一个名为 ourbuilder 的构建实例。

接下来,将其设置为活动目录:

$ docker buildx use ourbuilder           

接下来,创建一个 dockerfile 来运行一个简单的 node 应用程序:

# Base image
FROM node:14-alpine

# Set working directory
WORKDIR /app

# Copy application files
COPY . .

# Install dependencies
RUN npm install --production

# Expose the port
EXPOSE 3000

# Start the application
CMD ["node", "app.js"]           

这里使用 node.js 基础镜像并将工作目录设置为/app。然后将应用程序文件复制到容器中。然后安装所有依赖项,暴露端口 3000 并启动应用程序:

$ docker buildx build --platform linux/amd64,linux/arm64 -t ourapp:latest .
time="2023-06-01T07:13:20+03:00" level=warning msg="No output specified for docker-container driver.
  Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load"
#1 [internal] booting buildkit
#1 pulling image moby/buildkit:buildx-stable-1
#1 pulling image moby/buildkit:buildx-stable-1 73.2s done
#1 creating container buildx_buildkit_ourbuilder0
#1 creating container buildx_buildkit_ourbuilder0 2.1s done
#1 DONE 75.4s

#3 [internal] load .dockerignore
#3 transferring context: 0.0s
#3 transferring context: 2B 0.1s done
#3 DONE 0.3s

#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 294B 0.0s done
#2 DONE 0.4s

#4 [linux/amd64 internal] load metadata for docker.io/library/node:14-alpin...
#4 DONE 4.7s
.... truncated .....           

使用 –platform 标志指定目标平台。在这种情况下,目标是 x86 (Linux/amd64) 和 ARM (Linux/arm64) 架构。我们还提供了标签-t ourapp:latest 以使用名称 ourapp 和 latest 标签来标记构建的镜像。指定构建上下文,即当前目录。

Docker buildx auto 处理多平台构建并为每个目标架构生成单独的镜像。

4、结论

在本教程中,我们探索了 Docker buildx,这是一种扩展 Docker 镜像构建和管理能力的工具。它通过支持并行构建、自定义构建上下文和多阶段构建来简化流程。