Skip to content
Latchkey

Docker Buildx対BuildKit:両者の関係

これらは競合ではありません。BuildKitは現代的なDockerのビルドエンジンであり、BuildxはBuildKitを駆動するCLIプラグインとドライバシステムです。ほぼ常に両者を一緒に使います。

よくある混乱は、BuildxとBuildKitを代替物として扱うことです。BuildKitは実際にイメージをビルドするバックエンド(並行ステージ、cacheマウント、より優れたキャッシング)であり、Buildxはその機能を公開しbuilderを管理するフロントエンドCLI(docker buildx)です。ここでは両者の関係と、CIで何を選ぶべきかを説明します。

Docker BuildxBuildKit
何であるか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を支えています。

関連ガイド