使用 Docker Buildx 构建多架构镜像
Docker Buildx 最强大的功能之一是它能够同时为多个架构构建镜像。在这一步中,我们将学习如何创建多架构镜像。
理解多架构镜像
多架构镜像允许使用相同的镜像名称在不同的平台(如 AMD64、ARM64 等)上运行。当拉取镜像时,Docker 会自动为宿主架构选择合适的版本。
这尤其适用于:
- 支持基于 x86 和 ARM 的设备
- 确保你的应用程序在各种云提供商上运行
- 为具有不同架构的物联网设备构建
设置多架构构建
Docker Buildx 需要配置为进行多架构构建。首先,让我们确保我们的构建器支持此功能:
docker buildx inspect --bootstrap mybuilder
如果你看到关于构建器不可用的错误,让我们使用正确的配置重新创建它:
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
创建多架构镜像
现在,让我们为多个架构构建我们的 Nginx 镜像:
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
你可能会看到类似如下的错误消息:
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
发生这种情况是因为默认的 Docker 驱动程序不支持多架构构建。让我们修改我们的方法。
为了演示目的,我们将分别为特定平台构建:
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
这会专门为 AMD64 架构构建镜像,并将其加载到 Docker 的本地镜像存储中。
使用构建参数
Docker Buildx 允许我们使用构建参数来定制我们的构建。让我们修改我们的 Dockerfile 以使用构建参数:
nano Dockerfile
将 Dockerfile 内容更新为:
FROM ubuntu:22.04
ARG PACKAGE=nginx
RUN apt-get update && apt-get install -y \
curl \
${PACKAGE} \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
按 Ctrl+O
,然后按 Enter
保存,再按 Ctrl+X
退出 nano。
现在我们可以使用自定义软件包构建镜像:
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
推送到注册表(可选)
要充分利用多架构镜像,你通常会将它们推送到注册表。这需要 Docker Hub 凭据或私有注册表。在真实世界中,该命令将如下所示:
## 仅供参考 - 本实验不需要
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
检查镜像
让我们检查一下我们创建的镜像:
docker images | grep nginx
你应该看到类似如下的输出:
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
测试我们的镜像
最后,让我们使用我们的镜像运行一个容器来验证它是否有效:
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
检查容器是否正在运行:
docker ps
你应该看到输出,表明你的容器正在运行:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdef123456 nginx-test:latest "nginx -g 'daemon of…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp test-nginx
让我们使用 curl 命令访问 nginx 服务器,以确保它正在响应:
curl http://localhost:8080
你应该看到默认的 Nginx 欢迎页面 HTML。
完成后,清理容器:
docker stop test-nginx
docker rm test-nginx
恭喜你!你已经成功地使用了 Docker Buildx,理解并解决了 "requires exactly 1 argument" 错误,并且学习了如何为不同的架构创建专门的构建。