遇到一个场景,在amd64架构服务器上的导出的docker镜像,需要导入到arm64上,会遇到问题,运行失败。此是由于不同cpu架构下docker的运行问题。可以先在相同的cpu架构上build,再导到相同架构上服务器,这是一种处理方法,但是若没有相同cpu架构的服务器,会比较麻烦。docker提供了一种解决方案,支持不同cpu架构的镜像构建,目前是实验性的,可以一试。
1、docker 版本
docker 版本需>=19.03
2、docker开启实验性功能:
docker客户端开启实验室特性:
在客户端的配置文件/.docker/config.json中加入如下配置项,如果/.docker/config.json文件不存在,则创建该文件。
{
"experimental": "enabled"
}
docker服务端开启实验室特性:
在配置文件/etc/docker/daemon.json中加入如下配置项即可,如果/etc/docker/daemon.json文件不存在,则创建该文件。
{
"experimental": true
}
注意:内容不一样,一个是 “enable”、一个是 true。
完成后,重新载入docker:
systemctl daemon-reload
systemctl restart docker
查看docker版本:
docker version

3、buildx 安装
下载机器对应的二进制安装包docker buildx download;
将其拷贝至可执行目录下;
mkdir -p ~/.docker/cli-plugins
mv buildx-v0.9.1.linux-xxx ~/.docker/cli-plugins/docker-buildx
chmod +x ~/.docker/cli-plugins/docker-buildx
验证安装是否成功:
docker buildx version
docker buildx ls

4、安装架构模拟器
检查是否已安装:
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
default docker
default default running linux/amd64
# 如果Platforms列只有一个本机架构,则需要继续执行下面步骤;如果已经包含了多种平台,且包含你想要的平台,则你无需再安装。
安装模拟器:
docker run --privileged --rm tonistiigi/binfmt --install all
5、build多平台
先创建一个新的构建器:
docker buildx create --use --name mybuilder
启动构建器:
docker buildx inspect mybuilder --bootstrap
构建多平台镜像:
docker buildx build --platform linux/amd64,linux/arm64 --push -t repo/hello .
构建后的镜像image中看不到,参考:Where did the built multi-platform image go? · Issue #166 · docker/buildx · GitHub
也可执行脚本:
for arch in amd64 arm64 arm ; do
docker buildx build \
--platform $arch \
--output "type=docker,push=false,name=me/myimage:mytag-$arch,dest=myimage.tar" \
$path_to_dockerfile/
done
参考资料:
Docker buildx 安装codefreestyle的博客-CSDN博客安装buildx
跨平台构建 Docker 镜像新姿势,x86、arm 一把梭 - 腾讯云开发者社区-腾讯云 (tencent.com)
How to Build Multi-Arch Docker Images - Speedscale
如何使用 docker buildx 构建跨平台 Go 镜像 | Shall We Code? (waynerv.com)
网友评论