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协议。
如果你不是批量构建多个架构的镜像,而是一个一个去构建的,一定要记得先把不同架构的镜像先推送到镜像仓库然后再去合并,否则会提示报错,无法拉取镜像,即使你本地有这个镜像都不行。
欢迎大家关注我的公众号,将会为大家推荐更优质的内容!