在業界目前的雲原生實踐中,“建構一次,随處部署”的機制已經得到了普遍應用。借助容器化和Docker,我們可以為任何環境建構應用和服務,并在運作時再設定配置。
不過,這種适應性還是有一些限制。作業系統和應用程式仍然需要編譯才能在特定的架構類型上執行。例如,為AMD64處理器編譯的軟體不能在基于ARM的機器上運作,為 Linux建構的軟體也不能在Windows上運作。
Docker通過支援多架構(multi-arch)鏡像滿足了容器應用的多CPU架構的需求。您可以為需要支援的每個架構建構單獨的鏡像,然後作為一個集合将所有鏡像綁定在Docker清單的清單中。然後,您可以通過其名稱和标簽部署生成的多架構鏡像——Docker用戶端将自動選擇與目标架構比對的鏡像。
基于Artifactory的Docker倉庫可以很友善地建構多架構鏡像,而且可以像管理其他任何Docker鏡像一樣來管理這些多架構鏡像。本文我們将向您展示如何在開發/傳遞流程流程中來建立和管理多架構Docker鏡像。
多架構鏡像
在本文的例子中,我們需要建立一個應用程式,必須能夠在Linux 作業系統下如下的兩種處理器架構上運作:
x86-64環境,例如 Linux 桌面;
AWS EC2上基于ARM的A1 執行個體。
為了能夠在任何一個上運作,我們需要一個支援amd64和arm64架構的多架構鏡像。
基于Buildx建立多架構鏡像
首先,我們的DockerFile必須配置為根據所需的架構來建立示例鏡像,如下所示:
ARG ARCH=
FROM ${ARCH}debian:buster-slim
RUN apt-get update \
&& apt-get install - y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ “curl” ]
如果我們使用這個DockerFile運作docker build指令,并使用--build-arg選項來設定ARCH參數,我們可以為每個所需的架構建構一個獨立的鏡像。然後我們需要建構一個單獨的清單清單(使用docker manifest指令)将它們綁定到一個多架構鏡像中。
除此之外,還有一種更簡單、更推薦的方法。使用Docker CLI的Buildx插件(參見https://docs.docker.com/buildx/working-with-buildx/),您可以直接建立一個多架構鏡像,并利用同一條Docker CLI指令行将建構好的多架構鏡像推送到Artifactory中的Docker倉庫裡。如下所示:
$ docker buildx build \
--push \
--platform linux/amd64,linux/arm64 \
--output=type=image,push=true,registry.insecure=true \
--tag myartifactory/docker-local /multiarch-image:tag .
如果您使用的是Mac或Windows上的Docker Desktop,那麼Buildx已經随着裝好了。如果您使用的是Linux,則可以從GitHub安裝Buildx。
(參見https://github.com/docker/buildx)
Artifactory裡的多架構鏡像
以下是上一節建立的multiarch-image多架構鏡像在Artifactory中的存儲方式,該鏡像存儲在名為docker-local的Docker倉庫中。
► Docker清單清單
Docker生成的清單清單(list.manifest.json)是多架構鏡像“鏡像清單的清單”,也稱為“富清單”,它辨別了集合中的 Docker 鏡像以及每個鏡像要運作的架構(作業系統和處理器組合)。
當multiarch-image應用運作時,Docker CLI将首先拉取清單清單,然後使用它來選擇拉取和部署哪個鏡像,以比對目标地的作業系統和架構。
► 架構鏡像
每個被支援架構的鏡像都有自己的标簽,可以通過它來尋址,這個标簽是Artifactory通過組合釋出标簽和架構名稱來建立的。由于我們的示例使用釋出标簽“tag”,是以架構鏡像的标簽是tag-linux-amd64和tag-linux-arm64。
每個鏡像也有自己的清單,用于辨別組成它的層。
一旦您的多架構鏡像位于Artifactory的Docker倉庫并通過了測試,您就可以将該鏡像晉級到下一個成熟度的Docker倉庫,就像其他任何類型的制品倉庫一樣。
如下的JFrog CLI指令将我們在docker-local倉庫中建立的多架構映像晉級到docker-target倉庫中:
$ jfrog rt docker-promote --copy \
multiarch-image docker-local docker-target
與任何通常的Docker鏡像一樣,您也可以将晉級限制為鏡像中的某個标簽。如果您選擇在晉級中重命名标簽,它将為多架構鏡像中的每個架構重命名。指令如下:
--source-tag “latest” --target-tag “latest-new” \
在整個軟體開發生命周期(SDLC)中傳遞多架構鏡像可能意味着更複雜的測試和驗證,因為每個受支援的架構都可能需要在其目标平台上單獨驗證。
但是通過 Artifactory 對多架構鏡像的支援,您工作流程的最佳實踐将得以保留。您仍然可以隻建構一次,然後在開發、測試和生産階段晉級您的不可變、多架構鏡像。