最近、クラウドサーバー(Intel/AMD)と開発用個人PC(Apple SiliconなどのARM)のアーキテクチャが断片化されたことにより、単一環境に依存しないマルチアーキテクチャ(Multi-Architecture)コンテナイメージの必要性が高まっています。この記事では、Mac環境でPodmanのみを使用して、Intel(linux/amd64)とARM(linux/arm64)の両方のアーキテクチャで動作するイメージを構築する方法を詳しく説明します。

1. マルチアーキテクチャイメージとマニフェストの概念 🧠
一般的に、コンテナイメージはビルドを実行するホストのアーキテクチャに従います。したがって、Apple Silicon Macで単純にビルドされたイメージはIntelサーバーでは実行できません。
マルチアーキテクチャイメージは「マニフェストリスト」という概念を使用します。これは、一つのイメージタグ(例:myapp:latest)の下に複数のアーキテクチャ用イメージをまとめる目次のような役割を果たします。ユーザーがイメージをダウンロードする際、コンテナエンジンが現在のシステムのアーキテクチャを確認し、マニフェストから適切なイメージを自動的に選択します。
2. 事前準備: Mac環境のPodman Machine設定 ⚙️
Mac環境ではLinuxカーネルがないため、Podmanはネイティブでは動作せず、仮想マシン(VM)上で実行されます。MacにインストールされたPodmanは、podman machineコマンドを通じてVMを管理します。
Apple Silicon(M1、M2、M3など)Macの場合、このVM内部でQEMUまたはAppleのRosetta 2を介したx86_64(Intel)エミュレーションがデフォルトでサポートされています。したがって、Linux環境のように複雑なエミュレータパッケージをインストールする必要はなく、VMを実行するだけで十分です。
# Podman仮想マシンを初期化(初回のみ)
podman machine init
# Podman仮想マシンを実行
podman machine start
# VMの状態とエミュレーションサポートを確認
podman info
3. 実習用Containerfileの作成 📄
テストのために、アーキテクチャ情報を出力する非常にシンプルなイメージを準備します。ファイル名はContainerfileでもDockerfileでも構いません。
# Containerfile
FROM alpine:latest
# ビルドされた環境のアーキテクチャを出力するコマンド
CMD ["uname", "-m"]
4. 方法1: 単一コマンドでマルチアーキテクチャビルド(推奨) 🚀
Podmanは、–platformフラグと–manifestフラグを組み合わせて、一度のコマンドで複数のアーキテクチャイメージをビルドし、マニフェストとしてまとめる機能を提供します。
# linux/amd64とlinux/arm64プラットフォームを同時にビルドし、my-multi-app:latestマニフェストを作成
podman build --platform linux/amd64,linux/arm64 --manifest my-multi-app:latest .
このコマンドが実行される過程は以下の通りです。
- amd64アーキテクチャ環境向けに隔離されたコンテナビルドを実行します。(Macのエミュレーションを活用)
- arm64アーキテクチャ環境向けに隔離されたコンテナビルドを実行します。(Apple Siliconネイティブ)
- 2つの独立したイメージをローカルストレージに保存します。
- my-multi-app:latestという名前のマニフェストリストを作成し、先にビルドした2つのイメージを一つに結合します。
5. 方法2: 個別ビルド後にマニフェストで結合 🧩
ビルドプロセスがアーキテクチャごとに異なる場合や、すでにビルド済みの既存イメージをまとめる必要がある場合は、手動でマニフェストを制御できます。
# 1. 空のマニフェストを作成
podman manifest create my-manual-app:latest
# 2. アーキテクチャごとにイメージを個別にビルド
podman build --platform linux/amd64 -t my-manual-app:amd64 .
podman build --platform linux/arm64 -t my-manual-app:arm64 .
# 3. 作成されたマニフェストに個別のイメージを追加
podman manifest add my-manual-app:latest localhost/my-manual-app:amd64
podman manifest add my-manual-app:latest localhost/my-manual-app:arm64
6. 結果確認とレジストリへのプッシュ ☁️
生成されたマニフェストが複数のアーキテクチャを正常に含んでいるかを確認します。
# マニフェスト情報を検査
podman manifest inspect my-multi-app:latest
出力されるJSON情報のmanifests配列内にamd64とarm64の両方が存在することを確認します。確認が完了したら、外部コンテナレジストリ(Docker Hub、AWS ECRなど)にプッシュします。
# マニフェスト自体をレジストリにプッシュ
# (マニフェストにリンクされたすべてのアーキテクチャのイメージレイヤーが一度にアップロードされます)
podman manifest push my-multi-app:latest docker://docker.io/myusername/my-multi-app:latest
マニフェストのプッシュが完了すると、IntelサーバーやARM PCなど、どのデバイスからでもpodman run –rm myusername/my-multi-app:latestを実行した際に、そのデバイスのアーキテクチャに合ったコンテナが正確に起動します。
コメントを残す