惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Y
Y Combinator Blog
博客园 - Franky
D
Docker
B
Blog RSS Feed
M
MIT News - Artificial intelligence
雷峰网
雷峰网
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
S
SegmentFault 最新的问题
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Martin Fowler
Martin Fowler
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
B
Blog
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
Vercel News
Vercel News
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News

博客园 - 不懂123

镜像自动注入配置解析 kafka添加用户管理认证 nodejs升级管理 elastic定时清除索引数据 sftp集成设置 kafka3.9集群部署 nginx扩展编译模块 rancher kafka部署 JumpServer使用示例 rancher kafka多监听配置 jenkins远程动态打包镜像 docker镜像仓库清理迁移 elastic单机多节点集群搭建 fastdfs编译升降版本 监控系统搭建集成实例 rancher服务启动异常 linux使用ssh免密连接windows主机 jenkins pipeline搭建 docker跨平台构建镜像 fastdfs系统异常 mongodb集群用户管理
docker多架构镜像
不懂123 · 2026-08-24 · via 博客园 - 不懂123

内核升级

       wget --no-check-certificate https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
       wget --no-check-certificate https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm
       wget --no-check-certificate https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.278-1.el7.elrepo.x86_64.rpm

       yum localinstall -y /tmp/kernel-upgrade/*.rpm
       rpm -qa | grep kernel

       awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
       grub2-set-default 0
       grub2-mkconfig -o /boot/grub2/grub.cfg

       reboot

       image

 docker 安装插件

       yum install -y docker-buildx-plugin
       docker buildx version

      安装qemu模拟器

           在amd64主机上构建arm64镜像,必须先安装QEMU模拟器来支持跨架构指令翻译,否则BuildKit无法交叉编译arm64版本镜像

           docker run --privileged --rm tonistiigi/binfmt --install all

            image

            image

         安装构建器

          docker buildx rm multicharch-builder

         创建构建器的配置文件
          cat > /home/admin/buildkitd.toml << 'EOF'
          [registry."192.168.30.113:80"]
           http = true
           insecure = true
        EOF

       启动并初始化构建器,自动加载QEMU跨架构仿真器
        docker buildx create \
        --name multicharch-builder \
        --driver docker-container \
       --driver-opt "network=host" \
       --config /home/admin/buildkitd.toml \
       --platform linux/amd64,linux/arm64 \
       --bootstrap

    查看构建器
      docker buildx ls

       image

 构建arm架构镜像

      通过构建器和QEMU模拟器来构建对应架构的镜像
      docker buildx build --builder multicharch-builder --platform linux/amd64 -o type=image,oci-mediatypes=false,push=true --provenance=false --sbom=false -t 192.168.30.113/soc-base-test/main_x86:latest .

      后续如果需要构建多架构镜像
      如果后续需要同时支持amd64和arm64两种架构,只需要把构建命令里的--platform linux/arm64改成--platform linux/amd64,linux/arm64即可,Buildx会自动构建两个架构的镜像并生成兼容的manifest列表,不同架构的机器拉取时会自动匹配对应版本

      image

 镜像迁移验证操作

        docker pull 192.168.30.113/soc-base-test/main_arch:latest  把镜像拉取到本地

        docker save -o main_arch.tar  192.168.30.113/soc-base-test/main_arch

        gzip  -9 main_arch.tar

       验证镜像架构
       # 删除本地旧镜像
      docker rmi -f 192.168.30.113/soc-base-test/main_arch:latest
      # 重新拉取新镜像
     docker pull 192.168.30.113/soc-base-test/main_arch:latest
     # 验证镜像架构
     docker inspect 192.168.30.113/soc-base-test/main_arch:latest | grep Architecture

    在指定的容器中查看服务
     docker run -ti 8e9557139197 /bin/sh
     docker run --rm -it --entrypoint=/bin/sh 8e9557139197

构建器迁移主机

    # 编辑daemon.json
    cat > /etc/docker/daemon.json <<'EOF'
    {
     "insecure-registries": ["192.168.30.113","192.168.30.113:80"]
   }
EOF
    # 重启Docker
      systemctl daemon-reload
      systemctl restart docker

    # 先停掉并删除旧的builder
      docker buildx rm multicharch-builder
   # 确认已经删除
    docker buildx ls

cat > /home/admin/buildkitd.toml <<'EOF'
[registry."192.168.30.113"]
http = true
insecure = true
tls = false
[registry."192.168.30.113:80"]
http = true
insecure = true
tls = false
EOF

重新创建buildx builder,确保配置被加载

docker buildx create \
--name multicharch-builder \
--driver docker-container \
--driver-opt "network=host" \
--config /home/admin/buildkitd.toml \
--platform linux/amd64,linux/arm64 \
--bootstrap

验证builder是否能正常访问私有仓库

docker buildx build \
--builder multicharch-builder \
--platform linux/arm64 \
-t test-pull:test \
--load \
- <<EOF
FROM 192.168.30.113/library/jdk_arch:1.8
RUN echo "success"
EOF

        image

 集成到流水线pipeline

      image

CURDIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd )
cd $CURDIR 

if [ $# -eq 1 ]; then
  arch="arm64"
  tag="_arm64"
else
  arch="amd64"
  tag=""
fi
docker buildx build \
 --builder multicharch-builder \
  --platform linux/$arch \
  -o type=image,oci-mediatypes=false,push=true   --provenance=false   --sbom=false \
  -t 192.168.30.113/soc-base-test/main$tag \
  --push \
  .

build.sh

ARG TARGETARCH
FROM 192.168.30.113/library/java:latest AS amd64-base
# x86 专属操作可以提前写在这里

FROM 192.168.30.113/library/jdk_arch:1.8 AS arm64-base
# ARM 专属操作可以提前写在这里

FROM ${TARGETARCH}-base AS final




ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
WORKDIR /
VOLUME /tmp
ADD main-prod.jar main-prod.jar
ADD license.json license.json
ADD msyhbd.ttc /usr/share/fonts/win/msyhbd.ttc
ADD msyhl.ttc /usr/share/fonts/win/msyhl.ttc
ADD msyh.ttc /usr/share/fonts/win/msyh.ttc
ADD ca.crt ca.crt
RUN bash -c 'touch /main-prod.jar'
ENTRYPOINT ["java","-Dspring.config.location=/application-prod.yml","-Djava.security.egd=file:/dev/./urandom","-jar","/main-prod.jar","/license.json"]

Dockerfile

ARG TARGETARCH

# 定义两个架构的基础镜像阶段
FROM 192.168.30.113/library/java-23 AS amd64-base
# x86 专属操作可以提前写在这里
RUN rm -fr /usr/bin/java && ln -s /usr/jdk-23.0.1/bin/java /usr/bin/java

FROM 192.168.30.113/library/jdk_arch:23 AS arm64-base
# ARM 专属操作可以提前写在这里
RUN echo "ARM 架构专属操作"

# 必须加这一行:根据当前构建架构自动选择对应基础镜像
FROM ${TARGETARCH}-base AS final

# 两个架构通用的配置
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
VOLUME /tmp
WORKDIR /

ADD mcp-server-0.0.1-SNAPSHOT.jar mcp-server-0.0.1-SNAPSHOT.jar
ADD license.json license.json
ADD ca.crt ca.crt
RUN bash -c 'touch /mcp-server-0.0.1-SNAPSHOT.jar'

# 这里不用再写if判断java路径了,因为两个基础镜像里我们已经提前配置好软链接
ENTRYPOINT ["java","-Dspring.config.location=/application-prod.yml","-Djava.security.egd=file:/dev/./urandom","-jar","/mcp-server-0.0.1-SNAPSHOT.jar","--license.path=/license.json"]

Dockerfile多架构条件判断

      构建x86的镜像并验证       sh build.sh                       docker pull 192.168.30.113/soc-base-test/main

      构建arm的镜像并验证       sh build.sh arm64           docker pull 192.168.30.113/soc-base-test/main_arm64

    image

     双架构镜像构建结束