Docker buildxでマルチプラットフォームイメージをAWS ECRにプッシュする完全ガイド【Apple Silicon対応】

2022年1月12日

はじめに

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リポジトリを作成

作成後、「プッシュコマンドの表示」ボタンから正確な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 と表示されればログイン完了です。

コンソールの「プッシュコマンドの表示」モーダルにも同様のコマンドが表示されています。

ECRログインコマンドのモーダル

注意: 旧コマンド($(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と表示されます)。

マニフェスト後のECRイメージ確認

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への移行もあわせて検討してください。

Docker,Mac,MySQL,PC関連

Posted by GENDOSU