Buildxを使用してマルチアーキテクチャイメージを迅速に構築する方法

さまざまな CPU アーキテクチャでコンテナー イメージを正常に実行するのは難しい場合があります。 たとえば、Raspberry Pi などのデバイスで実行されている arm64 IoT アプリケーションを特定の基本イメージから構築できます。 ただし、Docker イメージは通常、既定でアーキテクチャをサポートします amd64 。 このシナリオでは、 過去に強調した複数のアーキテクチャをサポートするコンテナー イメージが必要です。

マルチアーキテクチャ(マルチアーキテクチャ)イメージには、通常、さまざまなアーキテクチャやOSのバリアントが含まれています。 これらのイメージは arm32v5+arm64v8s390xなどの CPU アーキテクチャもサポートする場合があります。マルチアーキテクチャイメージの魔法は、DockerがOSとCPUのペアリングに一致するバリアントを自動的に取得することです。

通常のコンテナー イメージにはマニフェストがありますが、マルチアーキテクチャ イメージにはマニフェスト リストがあります。 この一覧は、各バリアントのサイズ、アーキテクチャ、およびオペレーティング システムに関する情報を示すマニフェストを組み合わせたものです。

マルチアーキテクチャイメージは、Linux マシン上でローカルにコンテナを実行し、AWS Elastic Compute Cloud (EC2) Graviton2 CPU上で x86-64 リモートで実行する場合に役立ちます。さらに、 Rustで行ったように、言語固有のマルチアーキテクチャ画像を構築することも可能です。

マルチアーキテクチャイメージビルドの背後にある各コンポーネントについて学習し、 BuildxDockerデスクトップを使用してイメージをすばやく作成します。

Buildx と Docker デスクトップを使用したマルチアーキテクチャイメージの構築

マルチアーキテクチャイメージを構築するには、アーキテクチャごとに個別のイメージを作成し、それらを Docker Hub にプッシュし、タグ付き マニフェスト リスト内でそれらを結合するために入力します docker manifest 。その後、マニフェスト リストを Docker Hub にプッシュできます。 この方法は状況によっては有効ですが、面倒で比較的時間がかかる場合があります。

 

手記: ただし、このコマンドはテストでのみ使用し、本番環境では使用 docker manifest しないでください。 このコマンドは実験的です。 私たちは、本番環境の準備を整えながら docker manifest 、機能と関連するUXを継続的に調整しています。

 

ただし、Docker Desktop と Docker Buildx という 2 つのツールを使用すると、マルチアーキテクチャ ビルドの作成がはるかに簡単になります。 Docker Buildx を使用すると、Docker デスクトップを介して 1 つのコマンドですべてのマルチアーキテクチャ ビルド ステップを完了できます。

核心に飛び込む前に、いくつかのコアDockerテクノロジーを簡単に調べてみましょう。

ドッカーファイル

これは Dockerfile 、Dockerを使用してコンテナイメージをアセンブルしてデプロイするために必要なすべての手順を含むテキストファイルです。 最も一般的な種類の手順を要約しますが、 ドキュメント には他の手順に関する情報が含まれています。

  • 命令はそれぞれ FROM 見出しで Dockerfile、ビルドステージを初期化し、後続の命令を受け取ることができる基本イメージを設定します。
  • RUN 重要な実行可能ファイルを定義し、結果として追加の画像レイヤーを形成します。 RUN コマンドを実行するためのシェル形式もあります。
  • WORKDIR 以下の指示の作業ディレクトリを設定します。 これを明示的に設定することもできますが、Dockerはディレクトリが存在しない場合に自動的に割り当てます。
  • COPY、指定されたソースから新しいファイルをコピーし、コンテナのファイルシステムの指定された相対パスに追加します。
  • CMD には 3 つの形式があり、実行可能ファイル、パラメーター、またはシェル コマンドを定義できます。 それぞれ Dockerfile に 1 つの CMDみがあり、複数存在する場合は最新の CMD インスタンスのみが尊重されます。

 

Dockerfiles は、独自の構成に基づいて自動化されたマルチレイヤー イメージ ビルドを容易にします。 これらは比較的簡単に作成でき、複雑な指示を必要とするイメージをサポートするように拡張できます。 Dockerファイルは、イメージビルドの重要な入力です。

ビルドx

Buildx は、このコマンドを使用して、 docker build 指定された PATH または URL にあるファイルのセットから Dockerfileイメージをビルドします。BuildxはDockerデスクトップ内にパッケージ化されており、その中核となるCLIプラグインです。 BuildKitの機能セットを完全にサポートしてこのベースコマンドを拡張するため、プラグインと見なします。

Buildx は、Docker docker buildxDesktop で使用できる という CLI コマンドとして提供されています。 Linux環境では、 buildx このコマンドはターミナル上のコマンドでも build 機能します。 詳細については、Docker Buildx のドキュメント を参照してください。

ビルドキットエンジン

BuildKit は、 Moby プロジェクト フレームワーク内のコアコンポーネントの 1 つであり、オープンソースでもあります。 これは、元のDockerエンジンを改良した効率的なビルドシステムです。 たとえば、BuildKit を使用すると、 Docker Hub などのリモート リポジトリに接続でき、キャッシュによってパフォーマンスが向上します。 変更を加えた後、すべての画像レイヤーを再構築する必要はありません。

マルチアーキテクチャイメージの構築中に、BuildKit は指定されたアーキテクチャを検出し、Docker Desktop をトリガーしてそれらのアーキテクチャを構築およびシミュレートします。 このコマンドは docker buildx 、BuildKit を利用するのに役立ちます。

Docker Desktop

Docker Desktop は、Docker CLI、Docker Compose、Kubernetes、および関連ツールをバンドルしたアプリケーション (Docker Engine 上に構築) です。 これを使用して、コンテナー化されたアプリケーションを構築、共有、および管理できます。 組み込まれた Docker ダッシュボード UI を使用すると、複雑なコマンドを手動で入力する代わりに、ボタンをすばやくクリックしてタスクに取り組むことができます (ただし、これはまだ可能です)。

Docker Desktop の QEMU エミュレーションサポートにより、単一の環境で複数のアーキテクチャを構築およびシミュレートできます。 また、macOS、Windows、および Linux マシンでのビルドとテストも可能です。

各コンポーネントの実用的な知識が得られたので、チュートリアルに進みましょう。

前提 条件

このチュートリアルでは、次のものが必要です。

 

サンプル Go アプリケーションのビルド

端末にテキストを印刷する基本的なGoアプリケーションを構築することから始めましょう。 まず、という新しい multi_arch_sample フォルダを作成し、そこに移動します。

mkdir multi_arch_sample & cd multi_arch_sample

次に、次のコマンドを実行して、アプリケーションの依存関係のコード変更を追跡します。

Go mod init multi_arch_sample

端末は、次のような応答を出力します。

go: creating new go.mod: module multi_arch_sample
go: to add module requirements and sums:
  	go mod tidy

 

3 番目に、新しい main.go ファイルを作成し、次のコードを追加します。

package main
 
import (
  	"fmt"
  	"net/http"
)
 
 
func readyToLearn(w http.ResponseWriter, req *http.Request) {
  	w.Write([]byte("<h1>Ready to learn!</h1>"))
	fmt.Println("Server running...")
}
 
func main() {
     
	http.HandleFunc("/", readyToLearn)
  	http.ListenAndServe(":8000", nil)
}

 

このコードは、Web アドレスに "Ready to Learn!" と 127.0.0.1:8000出力する関数 readyToLearn を作成しました。また、フレーズ Server running… を端末に出力します。

次に、ターミナルでアプリケーションコードを実行するコマンドを入力すると、 go run main.go 応答が生成されます Ready to learn!

アプリの準備ができたので、Go アプリケーションのマルチアーキテクチャ デプロイを処理するための を準備し Dockerfile ます。

マルチアーキテクチャデプロイメント用の Dockerfile の作成

作業ディレクトリに新しいファイルを作成し、 という名前を付けます Dockerfile。 次に、そのファイルを開き、次の行を追加します。

# syntax=docker/dockerfile:1
 
# specify the base image to  be used for the application
FROM golang:1.17-alpine
 
# create the working directory in the image
WORKDIR /app
 
# copy Go modules and dependencies to image
COPY go.mod ./
 
# download Go modules and dependencies
RUN go mod download
 
# copy all the Go files ending with .go extension
COPY *.go ./
 
# compile application
RUN go build -o /multi_arch_sample
 
# network port at runtime
EXPOSE 8000
 
# execute when the container starts
CMD [ "/multi_arch_sample" ]

 

ビルドx を使用したビルド

次に、マルチアーキテクチャイメージを構築する必要があります。 このイメージは、とサーバーの両方のアーキテクチャと互換性があります amd64 arm32 。Buildx を使用しているため、ビルドキットもデフォルトで有効になっています。 その機能を利用するために、この設定をオンにしたり、追加のコマンドを入力したりする必要はありません。

ビルダーは、コンテナーを構築してプロビジョニングします。 また、再利用のためにコンテナーをパッケージ化します。 さらに、Buildx は複数の ビルダー インスタンス をサポートしているため、イメージ ビルド用のスコープ付き、分離、および切り替え可能な環境を作成するのに非常に便利です。

次のコマンドを入力して、 mybuilder新しいビルダーを作成します。

docker buildx create --name myBuilder --use --bootstrap

という端末応答 mybuilderを取得する必要があります。 コマンドを使用してビルダー docker buildx ls のリストを表示することもできます。 を入力して docker <name> buildx inspec t 新しいビルダーを検査 することもできます

ビルドのトリガー

次に、以下に示す 1 つの docker buildx コマンドでマルチアーキテクチャ ビルドをすぐに開始します。

docker buildx build --push \
--プラットフォーム linux/amd64,linux/arm64 \
--タグ your_docker_username/multi_arch_sample:buildx-latest .

 

これにより、いくつかのことが行われます。

  • ビルドを開始するコマンドを結合 build します
  • プッシュ操作を使用して Docker Hub とイメージを共有します
  • --platform フラグを使用して、ビルドするターゲット アーキテクチャを指定します。次に、BuildKit はアーキテクチャのイメージマニフェストをアセンブルします
  • フラグを使用して、 --tag イメージ名を次のように設定します。 multi_arch_sample

 

ビルドが完了すると、ターミナルに次のように表示されます。

[+]建物 123.0s (23/23) 終了しました

 

次に、Dockerデスクトップに移動し、[イメージ]>[リモートリポジトリ]に移動します。 新しく作成した画像がダッシュボードに表示されます。

 

画像1 2

 

 

 

 

 

 

 

 

 

 

 

 

結論

万丈!マルチアーキテクチャビルドを段階的に探索することに成功しました。 Docker Desktop、Buildx、BuildKit、およびその他のツールを使用して、マルチアーキテクチャ イメージを作成してデプロイする方法を見てきました。 サンプルの Go Web アプリケーションを使用しましたが、これらのプロセスを他のイメージやアプリケーションに適用できます。

独自のプロジェクトに取り組むには、 Docker の使用を開始し、Docker Desktop と Buildx を使用してより多くのマルチアーキテクチャ イメージを構築する方法について説明します。 また、Buildx を使用して カスタム レジストリ構成を作成する方法 についても説明しました。