多平臺(tái)鏡像構(gòu)建
前置條件
-
Docker 啟用 experimental
#在Docker daemon 配置文件中配置 "experimental": true開啟實(shí)驗(yàn)性功能 vi /etc/docker/daemon.json { "experimental": true }
修改Docker Daemon 配置 需要重啟docker服務(wù)
systemctl restart docker
使用 docker version 命令查看版本信息缅刽,配置生效后可以看到Server: Docker Engine中有Experimental: true
-
如果您使用的 Docker CLI 版本低于
v20.10
衰猛,執(zhí)行docker manifest
命令會(huì)看到報(bào)錯(cuò)提示docker manifest is only supported on a Docker cli with experimental cli features enabled
啡省,此時(shí)我們需要執(zhí)行export DOCKER_CLI_EXPERIMENTAL="enabled"
開啟客戶端實(shí)驗(yàn)特性支持卦睹。在
v20.10
及以上版本的 Docker CLI 會(huì)默認(rèn)開啟實(shí)驗(yàn)特性结序,無(wú)需額外操作
編譯鏡像
-
在x-86環(huán)境中構(gòu)建鏡像
docker build -t dockerhub.mycloud.top/crux/base-image:2.0.1 . #推送鏡像到倉(cāng)庫(kù) docker push dockerhub.mycloud.top/crux/base-image:2.0.1
-
在arm環(huán)境中構(gòu)建鏡像纵潦,注意鏡像名稱不一樣
docker build -t dockerhub.mycloud.top/crux/base-image-arm64:2.0.1 . #推送鏡像到倉(cāng)庫(kù) docker push dockerhub.mycloud.top/crux/base-image-arm64:2.0.1
-
創(chuàng)建多架構(gòu)鏡像
#創(chuàng)建一個(gè)新的manifest邀层,指定多架構(gòu)鏡像的名稱,和具體的不同架構(gòu)的鏡像名稱 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 # 聲明不同架構(gòu)鏡像對(duì)應(yīng)的操作系統(tǒng)和cpu架構(gòu)類型劲赠,其中x86_64需要用amd64來(lái)指定 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推送到私用倉(cāng)庫(kù)中 docker manifest push dockerhub.mycloud.top/crux/base-image:2.0.1
第二種方案使用buildx
前置條件
-
要想使用
buildx
经磅,首先要確保 Docker 版本不低于19.03
预厌,同時(shí)還要通過(guò)設(shè)置環(huán)境變量DOCKER_CLI_EXPERIMENTAL
來(lái)啟用轧叽】兀可以通過(guò)下面的命令來(lái)為當(dāng)前終端啟用 buildx 插件:export DOCKER_CLI_EXPERIMENTAL=enabled
-
驗(yàn)證是否開啟
docker buildx version github.com/docker/buildx v0.4.2-tp-docker fb7b670b764764dc4716df3eba07ffdae4cc47b2
啟用 binfmt_misc
-
如果你使用的是 Linux甥角,需要手動(dòng)啟用
binfmt_misc
。大多數(shù) Linux 發(fā)行版都很容易啟用震束,不過(guò)還有一個(gè)更容易的辦法,直接運(yùn)行一個(gè)特權(quán)容器割疾,容器里面寫好了設(shè)置腳本:docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d
建議將 Linux 內(nèi)核版本升級(jí)到 4.x 以上嘉栓,特別是 CentOS 用戶侵佃,你可能會(huì)遇到錯(cuò)誤。
-
驗(yàn)證是 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
-
驗(yàn)證是否啟用了相應(yīng)的處理器
cat /proc/sys/fs/binfmt_misc/qemu-aarch64 enabled interpreter /usr/bin/qemu-aarch64 flags: OCF offset 0 magic 7f454c460201010000000000000000000200b7 mask ffffffffffffff00fffffffffffffffffeffff
從默認(rèn)的構(gòu)建器切換到多平臺(tái)構(gòu)建器
-
Docker 默認(rèn)會(huì)使用不支持多 CPU 架構(gòu)的構(gòu)建器涌献,我們需要手動(dòng)切換燕垃。
先創(chuàng)建一個(gè)新的構(gòu)建器:
docker buildx create --use --name mybuilder
-
啟動(dòng)構(gòu)建器:
docker buildx inspect mybuilder --bootstrap
-
查看當(dāng)前使用的構(gòu)建器及構(gòu)建器支持的 CPU 架構(gòu)井联,可以看到支持很多 CPU 架構(gòu):
docker buildx ls
構(gòu)建多平臺(tái)鏡像
-
創(chuàng)建一個(gè) Dockerfile 將該應(yīng)用容器化:
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"]
-
構(gòu)建推送
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t dockerhub.mycloud.top/crux/base-image:2.0.1-test --push .