
Docker buildxでマルチプラットフォームイメージをAWS ECRにプッシュする完全ガイド【Apple Silicon対応】
はじめに
2022年当時、「Intel MacでもM1 Macでも使えるDockerイメージを作りたい」という記事で、docker manifest コマンドを使ったマルチプラットフォームイメージの作り方を紹介しました。
あれから4年が経ち、状況は大きく変わりました。
- Apple Silicon(M1/M2/M3/M4)への移行がほぼ完了
docker buildxがDockerの標準ビルダーとして統合- MySQL 5.7がEOL(2023年10月)→ MySQL 8.xが標準に
- AWS CLI v2が主流に
当時は「Intel用とM1用を別々にビルドして、docker manifest で束ねる」という手順が必要でしたが、今はdocker buildxのワンコマンドでマルチプラットフォームイメージのビルドからプッシュまで完了します。
この記事では2026年現在のベストプラクティスとして、docker buildx を使ったマルチプラットフォームイメージのビルドから、Docker Hub・AWS ECRへのプッシュまでを一気通貫で解説します。
前提条件
- Docker Desktop 4.x 以降(buildx同梱済み)
- AWS CLI v2(ECRを使う場合)
- Docker HubアカウントまたはAWS ECRリポジトリ
# バージョン確認
docker --version
# Docker version 27.x.x, build ...
docker buildx version
# github.com/docker/buildx v0.x.x ...
aws --version
# aws-cli/2.x.x Python/3.x.x ...(ECRを使う場合)
1. buildxビルダーの準備
Docker Desktop 4.x以降ではbuildxが標準搭載されていますが、マルチプラットフォームビルド専用のビルダーを作成しておくと管理しやすくなります。
# マルチプラットフォーム対応のビルダーを作成して有効化
docker buildx create --name multiarch-builder --driver docker-container --bootstrap --use
# ビルダーの確認
docker buildx ls
# NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
# multiarch-builder * docker-container running linux/amd64, linux/arm64, linux/arm/v7, ...
* が付いているビルダーが現在アクティブなビルダーです。
2. Dockerfileの準備(MySQL 8.xの例)
FROM --platform=$TARGETPLATFORM mysql:8.0
# カスタム設定ファイルをコピー
COPY my.cnf /etc/mysql/conf.d/
# 必要に応じて初期化スクリプトを配置
COPY init.sql /docker-entrypoint-initdb.d/
--platform=$TARGETPLATFORM を指定することで、docker buildx build 実行時に指定したプラットフォームに応じたベースイメージが自動的に選択されます。
MySQL 5.7から8.xへの移行について
MySQL 5.7は2023年10月にEOLを迎えました。ARM対応の公式イメージも8.0以降のみ提供されています。
移行時の主な注意点:
| 変更点 | 詳細 |
|---|---|
| 文字セット | utf8mb4 がデフォルトに |
| 認証プラグイン | caching_sha2_password がデフォルトに(旧: mysql_native_password) |
| GROUP BY | 暗黙的ソートが廃止 |
NO_ENGINE_SUBSTITUTION |
デフォルトで有効 |
旧Dockerfileで --platform linux/amd64 を明示指定していた場合は削除して $TARGETPLATFORM に変更してください。
3. マルチプラットフォームビルド&Docker Hubへプッシュ
# まずDocker Hubにログイン
docker login
# linux/amd64とlinux/arm64の両方をビルドしてプッシュ
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t your-dockerhub-user/mysql-custom:8.0 \
--push \
.
たったこれだけです。以前は各プラットフォームごとにビルドしてdocker manifestで手動マニフェストを作成する手順が必要でしたが、buildxならワンコマンドでマルチプラットフォームイメージのビルドからDocker Hubへのプッシュまで完了します。
旧手順(docker manifest)との比較
| 旧手順(docker manifest) | 新手順(docker buildx) | |
|---|---|---|
| ビルド | プラットフォームごとに個別ビルド | ワンコマンドで同時ビルド |
| プッシュ | 個別push → manifest create → manifest push | --push で一括 |
| 手順数 | 6〜8ステップ | 1〜2ステップ |
| キャッシュ | 手動管理 | BuildKitが自動管理 |
ビルドの進捗確認
--progress=plain オプションを付けるとビルドの詳細ログが表示されます:
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t your-dockerhub-user/mysql-custom:8.0 \
--push \
--progress=plain \
.
4. AWS ECRへのプッシュ
ECRにプッシュするには、まずAWS CLIでECRの認証を行い、ECRリポジトリを用意します。
4-1. ECRリポジトリの作成
CLIで作成する場合:
aws ecr create-repository \
--repository-name myapp \
--region ap-northeast-1
実行結果にリポジトリURIが表示されます:
{
"repository": {
"repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp",
...
}
}
コンソールで作成する場合:
AWSコンソールでAmazon ECRを開き「リポジトリを作成」ボタンを押します。

作成後、「プッシュコマンドの表示」ボタンから正確なECR URIやログインコマンドを確認できます。

4-2. ECRへのログイン(AWS CLI v2)
aws ecr get-login-password --region ap-northeast-1 \
| docker login --username AWS --password-stdin \
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded と表示されればログイン完了です。
コンソールの「プッシュコマンドの表示」モーダルにも同様のコマンドが表示されています。

注意: 旧コマンド(
$(aws ecr get-login --no-include-email))はAWS CLI v2では廃止されています。必ず上記の形式を使用してください。
4-3. マルチプラットフォームイメージをECRにプッシュ
ECR_URI=123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag ${ECR_URI}:latest \
--push \
.
4-4. プッシュ結果の確認
# リポジトリ内のイメージ一覧
aws ecr describe-images \
--repository-name myapp \
--region ap-northeast-1
# マニフェストの確認
# imageManifestMediaType が "application/vnd.oci.image.index.v1+json" なら
# マルチプラットフォームイメージとして登録されている
aws ecr batch-get-image \
--repository-name myapp \
--image-ids imageTag=latest \
--region ap-northeast-1
ECRコンソールでも、マルチプラットフォーム対応のイメージとして表示されます(OS/Arch列にMultiと表示されます)。

5. Docker HubとECRの両方に同時プッシュ
複数のレジストリに同時プッシュしたい場合は、複数の -t タグを指定します:
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t your-dockerhub-user/mysql-custom:8.0 \
-t 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/mysql-custom:8.0 \
--push \
.
ビルドは一度だけで、複数のレジストリに同時プッシュできます。
6. ECRからプルして動作確認
マルチプラットフォームマニフェストを登録すると、プルする環境のアーキテクチャに応じて自動的に適切なイメージがダウンロードされます。
# Apple Silicon MacではARMイメージが、IntelマシンではAMD64イメージが取得される
docker pull 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest
# プルされたイメージのアーキテクチャを確認
docker inspect 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest \
--format '{{.Architecture}}'
# arm64 または amd64
7. CI/CDでの活用(GitHub Actions)
本番環境へのデプロイを自動化する場合はGitHub Actionsで構成します:
name: Build and Push Multi-Platform Image
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Login to Amazon ECR
uses: aws-actions/amazon-ecr-login@v2
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: |
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/mysql-custom:8.0
cache-from: type=gha
cache-to: type=gha,mode=max
GitHub ActionsはAMD64ランナー(ubuntu-latest)で動作しますが、docker/setup-qemu-actionを追加することでARM64イメージのビルドも可能になります。
まとめ
| 項目 | コマンド |
|---|---|
| ECRログイン | aws ecr get-login-password \| docker login --username AWS --password-stdin <ECR_URI> |
| マルチプラットフォームビルド&プッシュ | docker buildx build --platform linux/amd64,linux/arm64 --push -t <TAG> . |
| 複数レジストリへ同時プッシュ | -t タグを複数指定するだけ |
2026年現在、docker buildx のおかげでマルチプラットフォームDockerイメージの作成は驚くほど簡単になりました。以前のように docker manifest で手動マニフェストを作る必要はもうありません。
MySQL 5.7を使っていた方は、この機会に8.xへの移行もあわせて検討してください。





