Docker Buildx対BuildKit:両者の関係
これらは競合ではありません。BuildKitは現代的なDockerのビルドエンジンであり、BuildxはBuildKitを駆動するCLIプラグインとドライバシステムです。ほぼ常に両者を一緒に使います。
よくある混乱は、BuildxとBuildKitを代替物として扱うことです。BuildKitは実際にイメージをビルドするバックエンド(並行ステージ、cacheマウント、より優れたキャッシング)であり、Buildxはその機能を公開しbuilderを管理するフロントエンドCLI(docker buildx)です。ここでは両者の関係と、CIで何を選ぶべきかを説明します。
| Docker Buildx | BuildKit | |
|---|---|---|
| 何であるか | CLIプラグイン + ドライバマネージャー | ビルドエンジン(バックエンド) |
| 役割 | ビルド、マルチプラットフォーム、builderを駆動する | ビルドグラフを実行する |
| マルチプラットフォーム | あり(--platform、エミュレーション/ノード) | マルチアーキテクチャのエンジンサポート |
| cacheエクスポート | registry/inline/localのcacheを公開 | cacheバックエンドを実装 |
| ドライバ | docker、docker-container、kubernetes、remote | 選ばれたドライバ内で動作 |
| 関係 | BuildKitへのフロントエンド | Buildxが使うバックエンド |
エンジン対フロントエンド
BuildKitはエンジンです。DockerfileをDAGに解析し、独立したステージを並列に実行し、cacheマウント(RUN --mount=type=cache)やシークレットといった高度な機能をサポートします。Buildxはユーザー向けのCLIとドライバ層であり、それらの機能へのアクセス、複数のアーキテクチャ向けのビルド、専用コンテナやKubernetes builderでのビルド実行を可能にします。
Buildxが必要になるとき
単純な単一アーキテクチャのビルドには、docker build(現在はデフォルトでBuildKitに支えられています)で十分です。マルチプラットフォームのイメージ、cacheを保持するコンテナ/リモートbuilder、またはregistryへの明示的なcacheのエクスポート/インポートが必要なときはdocker buildxに手を伸ばしましょう。docker-containerドライバこそが、クロスプラットフォームのビルドと共有可能なcacheを解き放つものです。
CIにおいて
CIでは、各実行が前回の実行のレイヤーを再利用できるよう、registryに対してdocker buildx build --cache-to/--cache-fromを使い、マルチアーキテクチャにはdocker-containerドライバを使いましょう。これにより、冷たく遅いイメージビルドが、cacheヒットの速いビルドに変わります。
結論
両者から選ぶのではありません。BuildKitはエンジンであり、Buildxはそれを駆動するCLIです。マルチプラットフォームのビルドやエクスポート可能なcacheが必要なときはdocker buildxを使いましょう。そうでなければ、BuildKitはすでにデフォルトのdocker buildを支えています。