はじめに
この実験では、docker manifest create コマンドを使用してマルチアーキテクチャの Docker イメージを構築および管理する方法を学びます。マルチアーキテクチャイメージは、amd64 や arm64 など、異なる CPU アーキテクチャを持つ多様な環境にアプリケーションをデプロイするために不可欠です。
この実験では、実験的機能を有効にし、マルチアーキテクチャのビルダーインスタンスを作成することで、マルチアーキテクチャイメージを準備するプロセスを案内します。次に、これらのイメージを束ねたマニフェストリストを作成し、作成したマニフェストリストを検査してその内容を検証し、最後にマニフェストリストをレジストリにプッシュして、マルチアーキテクチャイメージをさまざまなプラットフォームでのデプロイに利用可能にします。
マルチアーキテクチャイメージの準備
このステップでは、マルチアーキテクチャイメージを準備します。マルチアーキテクチャイメージを使用すると、amd64 や arm64 など、異なるアーキテクチャで実行できるイメージを構築してプッシュすることができます。これは、クラウドサーバー、エッジデバイス、ローカルマシンなど、さまざまな環境にアプリケーションをデプロイする際に便利です。
まず、Docker の実験的機能を有効にする必要があります。これにより、マルチアーキテクチャイメージを構築するために必要な buildx コマンドを使用できるようになります。これは、Docker 設定ファイルを作成または変更することで行えます。
nano を使用して Docker 設定ファイルを開きます。
nano ~/.docker/config.json
ファイルが存在しない場合、nano が作成します。以下の内容をファイルに追加します。ファイルが既に存在する場合は、メインの JSON オブジェクト内に "experimental": "enabled" 行を追加します。
{
"experimental": "enabled"
}
Ctrl + X を押し、次に Y を押し、最後に Enter を押してファイルを保存します。
次に、複数のアーキテクチャをサポートする新しいビルダーインスタンスを作成する必要があります。ビルダーインスタンスは、ビルドプロセスを管理する Docker コンポーネントです。
mybuilder という名前の新しいビルダーインスタンスを作成します。
docker buildx create --name mybuilder --use
このコマンドは、mybuilder という名前の新しいビルダーインスタンスを作成し、それを後続のビルド操作のデフォルトビルダーに設定します。出力には、ビルダーが作成され、使用されていることが表示されるはずです。
では、簡単なマルチアーキテクチャイメージを構築しましょう。Alpine Linux をベースにしたイメージを作成する基本的な Dockerfile を使用します。
プロジェクト用のディレクトリを作成し、そこに移動します。
mkdir ~/project/multiarch-demo
cd ~/project/multiarch-demo
このディレクトリに Dockerfile を作成します。
nano Dockerfile
Dockerfile に以下の内容を追加します。
FROM alpine:latest
CMD ["echo", "Hello from multi-architecture image!"]
Ctrl + X を押し、次に Y を押し、最後に Enter を押して Dockerfile を保存します。
では、linux/amd64 と linux/arm64 の両方のアーキテクチャ用のイメージを構築し、ダミーのレジストリにプッシュしましょう。レジストリのプレースホルダーとして localhost:5000 を使用します。実際のシナリオでは、これを実際のレジストリアドレスに置き換えます。
マルチアーキテクチャイメージを構築してプッシュします。
docker buildx build --platform linux/amd64,linux/arm64 -t localhost:5000/multiarch-demo:latest --push .
このコマンドは、指定されたプラットフォーム (linux/amd64 と linux/arm64) 用のイメージを構築し、localhost:5000/multiarch-demo:latest としてタグ付けし、localhost:5000 レジストリにプッシュします。出力には、各アーキテクチャのビルドプロセスとプッシュ操作が表示されます。
イメージのマニフェストリストを作成する
このステップでは、前のステップで構築したマルチアーキテクチャイメージのマニフェストリストを作成します。マニフェストリストは、それぞれ異なるアーキテクチャ用のイメージマニフェストのリストです。マニフェストリストを使用してイメージをプルすると、Docker は自動的にあなたのアーキテクチャに適したイメージを選択します。
docker manifest create コマンドを使用してマニフェストリストを作成します。このコマンドは、作成したいマニフェストリストの名前を指定し、その後にリストに含めたいイメージの名前を指定します。
localhost:5000/multiarch-demo:latest という名前のマニフェストリストを作成します。
docker manifest create localhost:5000/multiarch-demo:latest \
localhost:5000/multiarch-demo:latest@sha256:$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | head -n 1) \
localhost:5000/multiarch-demo:latest@sha256:$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | tail -n 1)
このコマンドを分解して説明しましょう。
docker manifest create localhost:5000/multiarch-demo:latest: これは、作成するマニフェストリストの名前を指定しています。localhost:5000/multiarch-demo:latest@sha256:...: これらは、マニフェストリストに追加するイメージです。イメージ名の後に@sha256:とイメージのダイジェストを指定しています。ダイジェストは特定のイメージレイヤーを一意に識別します。$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | head -n 1): このコマンドチェーンは、docker buildx imagetools inspectでリストされる最初のイメージのダイジェストを取得します。$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | tail -n 1): このコマンドチェーンは、docker buildx imagetools inspectでリストされる 2 番目のイメージのダイジェストを取得します。
docker manifest create コマンドの出力は、新しく作成されたマニフェストリストのダイジェストになります。
作成したマニフェストリストを調査する
このステップでは、前のステップで作成したマニフェストリストを調査します。マニフェストリストを調査することで、リストに含まれるイメージとその詳細(アーキテクチャやオペレーティングシステムなど)を確認できます。
docker manifest inspect コマンドを使用して、マニフェストリストの詳細を表示します。
マニフェストリスト localhost:5000/multiarch-demo:latest を調査します。
docker manifest inspect localhost:5000/multiarch-demo:latest
このコマンドの出力は、マニフェストリストを記述した JSON ドキュメントになります。「manifests」の配列が表示され、それぞれが異なるアーキテクチャ用のイメージを表しています。各マニフェストエントリ内の "platform" フィールドを見ると、アーキテクチャとオペレーティングシステムを確認できます。linux/amd64 と linux/arm64 のエントリが表示されるはずです。
この調査により、マニフェストリストには構築した異なるアーキテクチャ用のイメージが正しく含まれていることが確認できます。
マニフェストリストをレジストリにプッシュする
このステップでは、作成したマニフェストリストをレジストリにプッシュします。マニフェストリストをプッシュすることで、他の人がマルチアーキテクチャイメージをプルできるようになります。誰かがマニフェストリストのタグを使用してイメージをプルすると、Docker は自動的にそのシステムのアーキテクチャに適したイメージをダウンロードします。
docker manifest push コマンドを使用してマニフェストリストをプッシュします。
マニフェストリスト localhost:5000/multiarch-demo:latest をレジストリにプッシュします。
docker manifest push localhost:5000/multiarch-demo:latest
このコマンドは、マニフェストリストとそれが参照するすべてのイメージを指定されたレジストリ (localhost:5000) にプッシュします。最初のステップで docker buildx build --push を使用して個々のイメージをすでにプッシュしているため、このコマンドは主にマニフェストリスト自体をプッシュします。
出力には、マニフェストリストのプッシュの進捗状況が表示されます。
マニフェストリストをプッシュした後、レジストリで利用可能かどうかを確認できます。この実験環境では実行中のレジストリがないため直接クエリを実行することはできませんが、docker manifest push コマンドが正常に実行されたことは、マニフェストリストがプッシュの準備ができていることを示しています。
マルチアーキテクチャイメージをプルするシミュレーションを行い、Docker が正しいアーキテクチャを選択することを確認するには、異なるアーキテクチャのシステム(利用可能な場合)でイメージをプルしてみることができます。ただし、この実験環境では、プッシュコマンドの成功と前の調査ステップに基づいて、マニフェストリストが準備できていることを確認できます。
まとめ
この実験では、Docker を使用してマルチアーキテクチャイメージを準備する方法を学びました。これには、Docker で実験的機能を有効にして buildx コマンドを利用することが含まれます。buildx コマンドは、amd64 や arm64 などの異なるアーキテクチャに対応したイメージを構築するために不可欠です。config.json ファイルを変更して Docker クライアントを構成し、実験的機能を有効にしました。その後、docker buildx create --name mybuilder --use を使用して mybuilder という名前の新しいビルダーインスタンスを作成しました。このインスタンスは、マルチアーキテクチャビルドを管理することができます。最後に、基本的なプロジェクトディレクトリを設定し、Alpine Linux をベースにしたシンプルな Dockerfile を作成して、マルチアーキテクチャイメージを構築するための基礎を築きました。



