docker的多架构镜像构建
目前很多服务器都是基于arm架构的,而现在大多数的docker镜像都是基于x86架构的。一种情况就是同样的代码编译成业务包做成镜像需要部署在不同架构的服务器上,这个时候我们就可以使用docker的多平台构建了。
以下操作是在centos7.9系统上完成(x86_64位)
注意要使用docker的多架构镜像构建功能linux内核需要大于4.19才行,如下图,我的centos系统的内核为5.4.278
如果不是4.19及以上的内核,请升级linux内核,centos7系统可以参考此文章升级内核:https://blog.csdn.net/pky86676022/article/details/139870965
一、启用docker buildx插件
Docker Buildx 是 Docker的CLI插件,来自于Moby BuildKit 。你的docker版本不能低于19.10使用docker version命令查看docker版本
我的docker版本是26.1.4符合要求,下面启用docker buildx功能:
编辑docker的配置文件 **vim /etc/docker/daemon.json **在配置文件中新增如下标签对:
“experimental”: true ,
重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
检查docker buildx版本:
docker buildx version
在当前的x86_64架构的机器上运行一个特权 Docker 容器启用 binfmt_misc 来运行非x86架构的 Docker 镜像
docker run --rm --privileged docker/binfmt:a7996909642ee92942dcd6cff44b9b95f08dad64-amd64
运行如下命令检查是否其支持arm64架构的编译工作了
ls -al /proc/sys/fs/binfmt_misc/
接下来创建一个新的支持多架构的构建器。
docker buildx create --use --name mybuilder
docker buildx inspect mybuilder --bootstrap
docker update --restart=always buildx_buildkit_mybuilder0
检查这个构建器
docker buildx ls
如图,这个构建器可以构建linux/amd64和linux/arm64的镜像
二、写一个Dockerfile,尝试构建多架构镜像并推送到仓库中
先登录我的私服仓库,等下把多架构镜像推送到这里
我这里以制作一个Java运行环境的镜像为例演示。
vim Dockerfile
# 制作一个Java基础镜像
FROM alpine:3.18.7
LABEL maintainer="pkyit"
RUN apk add --no-cache openjdk8-jre tzdata curl
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
运行如下命令构建多架构镜像:
docker buildx build \
-t registry.cn-hangzhou.aliyuncs.com/pkyit/jre8:alpine3.18.7 \
-f Dockerfile . \
--platform linux/amd64,linux/arm64 --push
三、验证
等待片刻,显示已经构建了linux下的amd64和arm64的2个镜像并且推送到阿里云的私服仓库中了。
不妨把arm64架构的镜像拉取下来验证一下看看是不是arm64架构的:
# 拉取指定架构的镜像
docker pull --platform=linux/arm64 registry.cn-hangzhou.aliyuncs.com/pkyit/jre8:alpine3.18.7
# 检查指定镜像的架构
docker inspect registry.cn-hangzhou.aliyuncs.com/pkyit/jre8:alpine3.18.7 | grep Architecture
以上就是docker多架构构建镜像的全部流程。
参考以下链接:
https://blog.csdn.net/tanjunchen/article/details/124060471
https://blog.csdn.net/weixin_43403660/article/details/125974212
https://blog.csdn.net/m0_70748381/article/details/126865574