打混合镜像

多平台镜像构建

前置条件

  • 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 .
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容