
Docker Buildx 与 CNB 构建多平台镜像实战
一、Docker Buildx 功能介绍
docker buildx
是 Docker 提供的一个增强版构建工具,支持更强大的构建功能,特别是在构建多平台镜像和高效处理复杂 Docker 镜像方面。
1.1 主要功能
多平台构建支持
- 使用
docker buildx
,可以在单台设备上构建多平台的镜像(如linux/amd64
、linux/arm64
等)。 - 构建方式无需实际运行在目标架构上,借助 QEMU 实现跨平台模拟
分布式和并行构建
buildx
支持在分布式环境下进行并行构建,将构建任务分配到多台设备。- 支持多个后端驱动(如 Docker 本地引擎、Kubernetes 集群等),可以根据需求选择构建环境。
缓存导入与导出
- 在构建镜像时,可以导入和导出缓存以提升构建效率,尤其在 CI/CD 环境中。
镜像的直接推送
- 构建完成的镜像可以直接推送到 Docker Registry,无需本地保存。
1.2 Buildx 构建演示
下面是一个简单的 Dockerfile
,它创建了一个非常小的镜像,并且可以用来测试 docker buildx
对 ARM 和 x86 平台的支持:
# 使用最小的Alpine镜像
FROM --platform=$BUILDPLATFORM alpine:latest
# 设置工作目录
WORKDIR /app
# 简单的命令,输出平台信息
RUN echo "Building for platform: $BUILDPLATFORM"
# 默认执行命令
CMD ["echo", "Hello from Docker!"]
解释:
FROM --platform=$BUILDPLATFORM alpine:latest
:使用alpine:latest
镜像,并根据docker buildx
的平台选择功能自动切换平台(x86 或 ARM)。RUN echo "Building for platform: $BUILDPLATFORM"
:在镜像构建时输出当前的构建平台信息。CMD ["echo", "Hello from Docker!"]
:构建并运行容器时执行的简单命令。
1.2.1 创建一个Buildx 构建实例
用于管理和执行 Docker Buildx 的构建任务
docker buildx create --name srebro
切换到名为
srebro
的 Buildx 构建实例,并将srebro
设置为默认的构建器
docker buildx use srebro
初始化并启动一个 buildx 容器
docker buildx inspect --bootstrap
1.2.2 构建多平台镜像
这里我使用 cnb 的容器仓库作为镜像的存放仓库
登录 cnb 容器仓库
$ docker login -u cnb docker.cnb.cool
构建镜像并推送镜像仓库,这里同时构建 x86 和 arm 的镜像
$ docker buildx build --platform linux/amd64,linux/arm64 -t docker.cnb.cool/srebro/docker-images/hello:latest --push .
可以看到镜像已经成功的推送到 cnb 镜像仓库上了,有 arm 和 x86 两种镜像
二、如何使用CNB 构建多平台镜像
CNB 云原生构建平台,这里我不详细介绍,用过 coding 的人 应该会很熟悉,我知道的是原班 coding 和 之前 QQ 空间的 大佬 一起联合 做的一个 云原生构建平台。https://cnb.cool/
2.1 CNB 创建一个代码仓库
步骤忽略,自行探索,官方文档写的很详细
2.2 在CNB上构建一个 Redis 多平台容器镜像
- 仓库示例地址: https://cnb.cool/srebro/redis
- 如何在 cnb 上构建多平台镜像,官方 demo: https://cnb.cool/examples/showcase
- 构建过程文件: https://cnb.cool/srebro/redis/-/blob/main/.cnb.yml
- 自定义构建按钮: https://cnb.cool/srebro/redis/-/blob/main/.cnb/web_trigger.yml
一键构建 ,嘎嘎发射 🚀 🚀 🚀
构建结果:
镜像仓库地址:
这里其实也是用到了docker 的 manifest
技术。
Docker 的 manifest 是镜像的元数据文件,包含镜像的层、配置、平台信息等。它是管理和存储 Docker 镜像的关键部分,特别是在处理多平台构建时,manifest 使得 Docker 能够根据平台选择正确的镜像版本。
2.3 使用CNB回传镜像
懂得都懂,外面的镜像基本上都很难拉取,不过也有一些解决方法,比如github 的actions,不过往往 github 的网址都要打开好久,不是很友好;
那何尝不如去 试试 CNB 的 呢,提供的构建机器 有 arm 的 也有x86 的,构建的速度 也挺快,我听说都是做了加速的。搞个自定义参数流水线,构建镜像并直接保存在CNB镜像仓库上了,岂不是很方便;或者说调用 CNB 的 API 接口,远程构建 等等。
截止今天发文前,我刚知道CNB 他们有发布了一个 vscode 的插件
一个用于管理 CNB (https://cnb.cool) 云开发环境的 VS Code 插件。
TIPS: 需要创建一个Token,给足权限哦😯
2.3.1 功能特性
🐂功能很多,但是我只关心 镜像同步的这块功能,至于远程开发的需求,各位自行👀研究
- 利用CNB流水线将Docker官方镜像或者gcr.io的镜像同步到CNB制品库,解决镜像下载不下来的问题
- 查看同步状态
- 稍等片刻,同步完之后的镜像地址
- 感谢你赐予我前进的力量