多平台镜像构建
前置条件
-
Docker 启用 experimental
#在Docker daemon 配置文件中配置 "experimental": true开启实验性功能 vi /etc/docker/daemon.json { "experimental": true }
修改Docker Daemon 配置 需要重启docker服务
systemctl restart docker
使用 docker version 命令查看版本信息,配置生效后可以看到Server: Docker Engine中有Experimental: true
-
如果您使用的 Docker CLI 版本低于
v20.10
,执行docker manifest
命令会看到报错提示docker manifest is only supported on a Docker cli with experimental cli features enabled
,此时我们需要执行export DOCKER_CLI_EXPERIMENTAL="enabled"
开启客户端实验特性支持。在
v20.10
及以上版本的 Docker CLI 会默认开启实验特性,无需额外操作
编译镜像
-
在x-86环境中构建镜像
docker build -t dockerhub.mycloud.top/crux/base-image:2.0.1 . #推送镜像到仓库 docker push dockerhub.mycloud.top/crux/base-image:2.0.1
-
在arm环境中构建镜像,注意镜像名称不一样
docker build -t dockerhub.mycloud.top/crux/base-image-arm64:2.0.1 . #推送镜像到仓库 docker push dockerhub.mycloud.top/crux/base-image-arm64:2.0.1
-
创建多架构镜像
#创建一个新的manifest,指定多架构镜像的名称,和具体的不同架构的镜像名称 docker manifest create dockerhub.mycloud.top/crux/base-image:2.0.1 dockerhub.mycloud.top/crux/base-image:2.0.1 dockerhub.mycloud.top/crux/base-image-arm64:2.0.1 # 声明不同架构镜像对应的操作系统和cpu架构类型,其中x86_64需要用amd64来指定 docker manifest annotate dockerhub.mycloud.top/crux/base-image:2.0.1 dockerhub.mycloud.top/crux/base-image:2.0.1 --os linux --arch amd64 docker manifest annotate dockerhub.mycloud.top/crux/base-image:2.0.1 dockerhub.mycloud.top/crux/base-image-arm64:2.0.1 --os linux --arch arm64 #将manifest推送到私用仓库中 docker manifest push dockerhub.mycloud.top/crux/base-image:2.0.1
第二种方案使用buildx
前置条件
-
要想使用
buildx
,首先要确保 Docker 版本不低于19.03
,同时还要通过设置环境变量DOCKER_CLI_EXPERIMENTAL
来启用。可以通过下面的命令来为当前终端启用 buildx 插件:export DOCKER_CLI_EXPERIMENTAL=enabled
-
验证是否开启
docker buildx version github.com/docker/buildx v0.4.2-tp-docker fb7b670b764764dc4716df3eba07ffdae4cc47b2
启用 binfmt_misc
-
如果你使用的是 Linux,需要手动启用
binfmt_misc
。大多数 Linux 发行版都很容易启用,不过还有一个更容易的办法,直接运行一个特权容器,容器里面写好了设置脚本:docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d
建议将 Linux 内核版本升级到 4.x 以上,特别是 CentOS 用户,你可能会遇到错误。
-
验证是 binfmt_misc 否开启
ls -al /proc/sys/fs/binfmt_misc/ 总用量 0 drwxr-xr-x 2 root root 0 3月 2 14:03 . dr-xr-xr-x 1 root root 0 3月 2 11:43 .. -rw-r--r-- 1 root root 0 3月 2 14:03 qemu-aarch64 -rw-r--r-- 1 root root 0 3月 2 14:03 qemu-arm -rw-r--r-- 1 root root 0 3月 2 14:03 qemu-ppc64le -rw-r--r-- 1 root root 0 3月 2 14:03 qemu-s390x --w------- 1 root root 0 3月 2 14:03 register -rw-r--r-- 1 root root 0 3月 2 14:03 status
-
验证是否启用了相应的处理器
cat /proc/sys/fs/binfmt_misc/qemu-aarch64 enabled interpreter /usr/bin/qemu-aarch64 flags: OCF offset 0 magic 7f454c460201010000000000000000000200b7 mask ffffffffffffff00fffffffffffffffffeffff
从默认的构建器切换到多平台构建器
-
Docker 默认会使用不支持多 CPU 架构的构建器,我们需要手动切换。
先创建一个新的构建器:
docker buildx create --use --name mybuilder
-
启动构建器:
docker buildx inspect mybuilder --bootstrap
-
查看当前使用的构建器及构建器支持的 CPU 架构,可以看到支持很多 CPU 架构:
docker buildx ls
构建多平台镜像
-
创建一个 Dockerfile 将该应用容器化:
FROM openjdk:8-jre-alpine #FROM dockerhub.mycloud.top/public/openjdk:8-jre-alpine ARG PINPOINT_VERSION=${PINPOINT_VERSION:-2.0.3} ARG SKYWALKING_VERSION=${SKYWALKING_VERSION:-6.6.0} ARG INSTALL_URL=https://zwfile.mycloud.tech/share/pinpoint/releases/download/v${PINPOINT_VERSION}/pinpoint-agent-${PINPOINT_VERSION}.tar.gz ARG SKYWALKING_URL=https://zwfile.mycloud.tech/share/skywalking/skywalking-agent-${SKYWALKING_VERSION}.tar.gz ADD . / RUN apk add --update curl bash \ && chmod a+x /usr/local/bin/configure-agent.sh \ && mkdir -p /pinpoint-agent \ && chmod -R o+x /pinpoint-agent \ && curl -SL ${INSTALL_URL} -o pinpoint-agent.tar.gz \ && gunzip pinpoint-agent.tar.gz \ && tar -xf pinpoint-agent.tar -C /pinpoint-agent \ && mv /pinpoint-agent/pinpoint-agent-${PINPOINT_VERSION}/* /pinpoint-agent \ && rm -rf /pinpoint-agent/pinpoint-agent-${PINPOINT_VERSION} \ && rm pinpoint-agent.tar \ && curl -SL ${SKYWALKING_URL} -o skywalking-agent-${SKYWALKING_VERSION}.tar.gz \ && tar -zxf skywalking-agent-${SKYWALKING_VERSION}.tar.gz -C / \ && rm /skywalking-agent-${SKYWALKING_VERSION}.tar.gz \ && rm /var/cache/apk/* ENV CRUX_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/app/aspectjweaver.jar" ENV PINPOINT_AGENT="-javaagent:/pinpoint-agent/pinpoint-bootstrap-${PINPOINT_VERSION}.jar" ENV SKYWALKING_AGENT="-javaagent:/skywalking/agent/skywalking-agent.jar" ENV JAVA_OPTS="" ENTRYPOINT ["/usr/local/bin/configure-agent.sh"]
-
构建推送
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t dockerhub.mycloud.top/crux/base-image:2.0.1-test --push .