Docker Buildx を使用したマルチアーキテクチャイメージのビルド
Docker Buildx の最も強力な機能の 1 つは、複数のアーキテクチャのイメージを同時にビルドできることです。このステップでは、マルチアーキテクチャイメージを作成する方法を学びます。
マルチアーキテクチャイメージの理解
マルチアーキテクチャイメージを使用すると、同じイメージ名が異なるプラットフォーム(AMD64、ARM64 など)で動作します。イメージがプルされると、Docker はホストアーキテクチャに適したバージョンを自動的に選択します。
これは、特に以下の場合に役立ちます。
- x86 および ARM ベースのデバイスの両方をサポートする
- アプリケーションがさまざまなクラウドプロバイダーで実行されることを確認する
- さまざまなアーキテクチャを持つ IoT デバイス向けにビルドする
マルチアーキテクチャビルドの設定
Docker Buildx は、マルチアーキテクチャビルド用に設定する必要があります。まず、ビルダーがこの機能をサポートしていることを確認しましょう。
docker buildx inspect --bootstrap mybuilder
ビルダーが利用できないというエラーが表示された場合は、適切な構成で再作成しましょう。
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
マルチアーキテクチャイメージの作成
次に、複数のアーキテクチャの Nginx イメージをビルドしましょう。
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
次のようなエラーメッセージが表示される場合があります。
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
これは、デフォルトの Docker ドライバーがマルチアーキテクチャビルドをサポートしていないために発生します。アプローチを変更しましょう。
デモンストレーションのために、特定のプラットフォーム向けに個別にビルドします。
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
これにより、AMD64 アーキテクチャ専用のイメージがビルドされ、Docker のローカルイメージストアにロードされます。
ビルド引数の使用
Docker Buildx では、ビルド引数を使用してビルドをカスタマイズできます。ビルド引数を使用するように Dockerfile を変更しましょう。
nano Dockerfile
Dockerfile の内容を以下のように更新します。
FROM ubuntu:22.04
ARG PACKAGE=nginx
RUN apt-get update && apt-get install -y \
curl \
${PACKAGE} \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Ctrl+O を押して保存し、Enter を押してから、Ctrl+X を押して nano を終了します。
これで、カスタムパッケージを使用してイメージをビルドできます。
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
レジストリへのプッシュ(オプション)
マルチアーキテクチャイメージを最大限に活用するには、通常、それらをレジストリにプッシュします。これには、Docker Hub の資格情報またはプライベートレジストリが必要です。実際のシナリオでは、コマンドは次のようになります。
## 例のみ - この実験には必要ありません
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
イメージの検査
作成したイメージを調べてみましょう。
docker images | grep nginx
次のような出力が表示されるはずです。
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
イメージのテスト
最後に、イメージを使用してコンテナを実行し、動作することを確認しましょう。
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
コンテナが実行されているかどうかを確認します。
docker ps
コンテナが実行されていることを示す出力が表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdef123456 nginx-test:latest "nginx -g 'daemon of…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp test-nginx
nginx サーバーが応答していることを確認するために、curl を実行しましょう。
curl http://localhost:8080
デフォルトの Nginx ウェルカムページ HTML が表示されるはずです。
完了したら、コンテナをクリーンアップします。
docker stop test-nginx
docker rm test-nginx
おめでとうございます!Docker Buildx を正常に操作し、「requires exactly 1 argument」エラーを理解して解決し、さまざまなアーキテクチャ向けの特殊なビルドを作成する方法を学びました。