Docker 构建多架构镜像并合并成一个TAG

文摘   2024-12-09 10:58   安徽  

Docker Buildx简介

Docker Buildx是一个Docker CLI的插件,用于构建多平台容器镜像。它允许开发者构建并推送适用于不同操作系统和CPU架构的镜像,而无需在本地拥有这些架构的硬件。这对于跨平台应用的开发和部署尤为重要。

环境准备

在开始构建多架构镜像之前,需要确保Docker环境已经安装并配置好。

启用Docker Buildx

可以通过以下命令启用Docker Buildx:

docker buildx create --name mybuilder --use

这条命令会创建一个新的builder实例,并将其设置为默认的构建器。使用以下命令检查builder的状态:

docker buildx inspect --bootstrap

构建多架构镜像

使用Docker Buildx,可以指定多个目标平台来构建镜像。以下是一个构建适用于Linux AMD64和ARM64架构的镜像的示例:

1、编写一个脚本:

#!/bin/sh
echo "Hello World"

2、编写一个Dockerfile:

# 使用官方的轻量级Alpine Linux镜像作为基础镜像
FROM alpine:latest

# 设置工作目录
WORKDIR /app

# 将当前目录下的hello-world.sh脚本复制到容器中
COPY hello-world.sh /app/hello-world.sh

# 使脚本可执行
RUN chmod +x /app/hello-world.sh

# 运行hello-world.sh脚本
CMD ["/app/hello-world.sh"]

然后构建镜像:

docker buildx build --platform linux/amd64 -t my-image:amd64 --load .
docker buildx build --platform linux/arm64 -t my-image:arm64 --load .
  • --platform linux/amd64:指定构建的目标平台。

  • -t my-image:amd64:指定镜像的名称和标签。

  • --load:构建完成后自动将镜像加载到本地的环境中。

  • .:表示Dockerfile位于当前目录。

这样就可以构建出来amd64架构的镜像了:

用此方法我们还可以构建其他架构,例如:

  • linux/amd64

  • linux/arm64

  • linux/arm/v7

  • linux/arm/v6

  • linux/386

  • linux/ppc64le

  • linux/s390x

  • linux/mips64

  • linux/mips

  • windows/amd64

  • linux/riscv64

管理多平台镜像

我们应该都遇到过,明明都是通过docker pull nginx:latest去拉取的镜像,却能够自动拉取到自己对应架构的镜像:

这是因为有Manifest List,Manifest List 是 Docker 提供的一种机制,用于管理不同操作系统和硬件架构的 Docker 镜像。通过 Manifest List,用户可以创建一个包含多个实际 Docker 镜像的虚拟镜像,每个实际的 Docker 镜像对应一个不同的操作系统和硬件架构。这种方式使得开发者能够构建和分发跨平台的容器镜像,而无需维护多个独立的镜像标签。


合并多个架构的镜像需要镜像仓库,并且仓库配置了https才能够合并。

没有镜像仓库的可以参考往期的文章搭建一个docker镜像仓库:

搭建一个轻量级的 Docker 本地镜像仓库


我们需要开启一个功能,如果你是Docker Desktop,只需要找到下方的位置开启Use containerd for pull and store images即可:

如果你使用的是 Docker Engine则需要去修改配置文件,将以下配置添加到你的配置文件中:/etc/docker/daemon.json

{
"features": {
"containerd-snapshotter": true
}
}

然后可以通过下方的命令一次性构建多个架构,并合并到一个TAG中,且直接推送到仓库里:

docker buildx build --platform linux/amd64,linux/arm64 -t image-name:latest --push .

由于我没有给本地的仓库配置SSL/TLS,所以在构建完镜像合并推送的时候出现了报错,尝试了多次都无法让其走http协议。

如果你不是批量构建多个架构的镜像,而是一个一个去构建的,一定要记得先把不同架构的镜像先推送到镜像仓库然后再去合并,否则会提示报错,无法拉取镜像,即使你本地有这个镜像都不行。

欢迎大家关注我的公众号,将会为大家推荐更优质的内容!

青檬小栈
科长技术小栈,分享各种技术文章和教程集合。欢迎大家的关注!
 最新文章