多いほど良い: BuildxとArtifactoryでマルチアーキテクチャDockerマニフェストを

「一度作成すれば、どこにでもデプロイできる」というクラウドネイティブの約束事は、ほぼ満たされたと言えるでしょう。コンテナ化とDockerにより、あらゆる環境に対応したアプリケーションやサービスを構築し、実行時に構成の設定が可能になりました。

ほとんどはそうだと思います。オペレーティングシステムやアプリケーションは特定のアーキテクチャタイプで実行するようにコンパイルする必要があります。AMD64プロセッサ用にコンパイルされたソフトウェアはARMベースのマシンでは動作しませんし、Linux用に作られたソフトウェアはWindowsでは動作しません。

DockerはコンテナアプリケーションがマルチCPUアーキテクチャをサポートするというこのニーズに対してマルチアーキテクチャイメージで対応します。サポートが必要なアーキテクチャごとにイメージを構築し、そのセットをDockerマニフェストリストにバンドルすることができます。作成されたマルチアーキテクチャイメージは名前とタグを使用してデプロイすることができます。Dockerクライアントはターゲットのアーキテクチャにマッチするイメージを自動的に選択します。

ArtifactoryのDockerレジストリにマルチアーキテクチャイメージを構築し、他のDockerイメージと同様に容易に管理できます。その方法と、これらのイメージをSDLCに適用する方法をご紹介します。

マルチアーキテクチャイメージ

ここではLinux OS下で2つのプロセッサ・アーキテクチャ上で動作するアプリケーションを前提にしています。

  1. x86-64環境のLinuxデスクトップ
  2. AWS EC2上のARMベースのA1インスタンス

どちらでも実行できるようにする為にはamd64arm64のアーキテクチャをサポートするマルチアーキテクチャイメージが必要です。

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を使うことで、単一の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をインストールできます。

Artifactoryのマルチアーキテクチャイメージ

ここでは完成したmultiarch-imageがArtifactoryに保存されているdocker-localのDockerリポジトリを示しています。

マニフェストリスト

Dockerによって生成されるマニフェストリスト(list.manifest.json)はマルチアーキテクチャイメージの「マニフェストのマニフェスト」です。「ファットマニフェスト」とも呼ばれ、セット内のDockerイメージ、各イメージがどのアーキテクチャ(OSとプロセッサの組み合わせ)上で動作するかを特定します。

multiarch-imageアプリケーションが実行された場合、Docker CLIはまずマニフェストリストを取得し、それを使用して対象のOSやアーキテクチャに合わせて、どのイメージを取得してデプロイするのかを選択します。

アーキテクチャイメージ

サポートされているアーキテクチャのイメージにはそれぞれ対応するタグがあり、Artifactoryではパブリッシュタグとアーキテクチャ名を組み合わせて作成しています。ここではパブリッシュタグに「tag」を使っていますので、アーキテクチャイメージのタグはtag-linux-amd64tag-linux-arm64になります。

また、各イメージには、そのイメージを構成するレイヤーを示すマニフェストがあります。

マルチアーキテクチャイメージのプロモート

マルチアーキテクチャイメージがArtifactoryのDockerリポジトリにあり、テストのパス後、他のDockerリポジトリと同様、イメージを別のDockerリポジトリにプロモートさせることができます。

このJFrog CLIコマンドはdocker-localリポジトリで作成したマルチアーキテクチャイメージのコピーを作成します。

$ jfrog rt docker-promote --copy \
multiarch-image docker-local docker-target

 

他のDockerイメージと同様、イメージ内の特定のタグにプロモーションを制限することもできます。プロモーションでタグの名前を変更することを選択した場合、マルチアーキテクチャイメージ内の各アーキテクチャごとに名前が変更されます。

$ jfrog rt docker-promote --copy \
--source-tag “latest” --target-tag “latest-new” \
multiarch-image docker-local docker-target

ベストプラクティスの維持

マルチアーキテクチャイメージをSDLCで運用する場合、サポートされる各アーキテクチャをターゲットプラットフォーム上で個別に検証する必要があるため、テストや検証がより複雑になる可能性があります。

しかし、Artifactoryのマルチアーキテクチャイメージのサポートにより、ベストプラクティスのワークフローが維持されます。一度ビルドした後、開発、テスト、本番の各段階で不変的なイメージをプロモートすることができます。

それは簡単に試すことができます。まだArtifactoryをお使いでない方はJFrogの無料版クラウドを今すぐはじめてみませんか。