测试环境

cat /etc/os-release 
NAME="Amazon Linux"
VERSION="2023"
ID="amzn"
ID_LIKE="fedora"
VERSION_ID="2023"
PLATFORM_ID="platform:al2023"
PRETTY_NAME="Amazon Linux 2023.6.20241212"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023"
HOME_URL="https://aws.amazon.com/linux/amazon-linux-2023/"
DOCUMENTATION_URL="https://docs.aws.amazon.com/linux/"
SUPPORT_URL="https://aws.amazon.com/premiumsupport/"
BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023"
VENDOR_NAME="AWS"
VENDOR_URL="https://aws.amazon.com/"
SUPPORT_END="2028-03-15"


背景描述

如果在一个 x86 的服务器上,去构建 dockerfile 镜像,那么只有 x86 的服务器才可以使用。
同理,如果是在 arm 服务器上,去构建 dockerfile 镜像,那么也只有 arm 的服务器才可以用。

有没有一种方法,在 x86 服务器上面构建两种镜像,让 arm 和 x86 的都可以使用呢?

这就是本文的一个目的:借助于 BuildX 这个工具来实现

BuildX 介绍

buildx 是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 buildx,用户可以在单个命令中构建多种架构的镜像,例如 x86 和 ARM 架构,而无需手动操作多个构建命令。此外,buildx 还支持 Dockerfile 的多阶段构建和缓存,这可以大大提高镜像构建的效率和速度。


实现步骤

安装 docker

yum update
yum -y install docker

# 启动 docker
systemctl start docker && systemctl enable docker

启用 buildx

# 创建一个新的 buildx builder
docker buildx create --name mybuilder

# 启用我们刚刚创建的 builder
docker buildx use mybuilder

# 启动 builder
docker buildx inspect --bootstrap

Demo 测试

# 创建一个文件夹
mkdir ./demo-docker && cd ./demo-docker
# 使用最小化的 alpine                                                                                                                          
FROM alpine:3.18

# 配置时区 / 安装环境可按需选择
RUN apk --no-cache add ca-certificates tzdata

# 创建一个简单的 hello.sh 脚本
RUN echo '#!/bin/sh' > /hello.sh && \
    echo 'echo "Hello from $(uname -m) container!"' >> /hello.sh && \
    chmod +x /hello.sh

ENTRYPOINT ["/hello.sh"]EOF

ECR镜像仓库创建

# 配置环境变量
AWS_REGION=us-east-1
ACCOUNT_ID=893420598334

# 创建 ecr 
aws ecr create-repository --repository-name raymond-docker-demo \
    --region ${AWS_REGION}### 登录ecr
aws ecr get-login-password --region ${AWS_REGION} \
    | docker login --username AWS \
    --password-stdin ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

构建镜像并且推送

docker buildx build \
    --tag ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/raymond-docker-demo:latest \
    --platform linux/amd64,linux/arm64 \
    --push .

服务器运行测试

X86 服务器测试

docker run --rm   --name docker-demo 893420598334.dkr.ecr.us-east-1.amazonaws.com/raymond-docker-demo:latest


ARM服务器测试

总结

使用 buildx 构建镜像之后,在 x86 服务器上面,也可以构建 arm 架构的镜像。

自我判定

#

判定描述

自我判定(是/否)

备注

1在各搜索引擎中是否能找到知识信息(包括但不限于Google、百度、Bing)

2

是否需要代码集成开发


3

是有有相关文章