docker buildx实现在x86系统上打arm包镜像
1.前提要求
centos7(内核版本应高于4.8)配置好国内镜像源
docker 建议用官方提供的方法安装 (自带docker buildx,什么额外的东西都不用装)
2.检查系统内核
2.1 查看系统内核版本
内核版本应高于4.8,没有达到版本,需要升级内核
[root@localhost wbalone]# uname -r
6.9.2-1.el7.elrepo.x86_64
2.2 升级系统内核版本
# 导入elrepo gpg key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装elrepo YUM源仓库
yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本
yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
# 设置grub2默认引导为0
grub2-set-default 0
# 重新生成grub2引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg
# 更新后,需要重启,使用升级的内核生效。
reboot
# 重启后,需要验证内核是否为更新对应的版本
uname -r
3. 安装buildx及相关配置
3.1 安装docker及插件
注意docker必须大于19.03.2版本,否则某些情况下会无法正确拉取镜像。
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
3.2 arm64多平台编译支持
需要创建一个buildkit.toml文件进行配置,让私有仓库走http、增加国内镜像代理。
无下面需求的话可以不创建此文件,下面创建builder的时候也不用加–config=buildkit.toml
cat > buildkit.toml <<EOF
debug=true
[registry."docker.io"]
mirrors = ["https://crpi-zywvub7izni1zqoo.cn-beijing.personal.cr.aliyuncs.com"] # 阿里云镜像仓库
# optionally mirror configuration can be done by defining it as a registry.
[registry."crpi-zywvub7izni1zqoo.cn-beijing.personal.cr.aliyuncs.com"]
username = "xxx" # 阿里云用户名
password = "xxxx" # 阿里云密码
[registry."harbor.caijy.com:5000"] # harbor镜像仓库地址
http = true # 使用 http 协议
username = "admin" # harbor用户名
password = "Harbor12345" # harbor密码
EOF
tonistiigi/binfmt,用于在容器内运行不同架构的二进制文件,比如在 x86 架构的容器内运行 ARM 架构的二进制文件
# 运行 tonistiigi/binfmt
docker run --privileged --rm tonistiigi/binfmt --install arm64
# 重启docker
systemctl daemon-reload
systemctl restart docker
# 默认的builder无法同时打包多个平台的镜像,创建支持打包多个平台的容器
docker buildx create --name multi-platform --use --platform linux/amd64,linux/arm64 --driver docker-container --driver-opt network=host --config=buildkit.toml
4. 构建镜像
4.1 构建命令
#单独打包arm
docker buildx build --platform arm64 -t harbor.od.com/public/nginx:test .
#同时打包arm和amd64
docker buildx build --platform arm64,amd64 -t harbor.od.com/public/nginx:test . --push
说明:用上面的命令,构建的镜像不会持久化保存,会出现以下警告
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
警告原因:
这个警告信息是说 docker build 出现的,指出你没有指定任何输出目的地,因此构建后的镜像不会被持久保存,只会存留在构建缓存中。以至于后面 docker tag 命令会找不到镜像,从而导致build 和push流程失败
4.2 将镜像推送到仓库
使用 --push 参数,构建完成后,镜像会被自动推送到指定的仓库地址。
docker buildx build --platform arm64 --push -t harbor.od.com/public/nginx:test .
4.3 加载镜像到本地Docker守护进程
使用 --load 参数,构建完成后,可以在本地使用 docker images 查看到这个镜像
docker buildx build --platform arm64 --load -t harbor.od.com/public/nginx:test .
引用
https://blog.csdn.net/qq_40244755/article/details/137040390
https://blog.csdn.net/zongjinyun123/article/details/135269581

浙公网安备 33010602011771号