Docker Buildx: ビルドを次のレベルへと引き上げる
身に覚えはありませんか?docker buildを実行すると、処理が永遠に続く。或者は、複数のアーキテクチャ用に同じイメージをビルドする必要がある場合 - 例えば、linux/amd64で動作するメインサーバー用と、linux/arm/v7で動作する複数のRaspberry Pi用。在这种情况下,要么构建两个独立的镜像,要么不得不在異なるマシンでビルドを実行する必要があります。こんな経験があるなら、この記事はあなたのために書かれています!
Docker Buildxとは?なぜ必要なのか?
Buildxを紹介します - Docker CLI用の公式プラグインで、おなじみのdocker buildコマンドを本格的なオールインワンイメージビルドマシンに変えます。内部的には、BuildxはBuildKit上で動作します - Moby Project(Dockerの裏にいる同じチーム)が開発した、高性能で機能が豊富なコンテナビルドエンジンです。Buildxは、本質的にBuildKitのすべてのクールな機能へのアクセスの橋渡し役となり、Dockerコマンドラインから直接使えるようにしながら、おなじみの構文を維持します。
誰がこれを必要とするのか?Dockerを定期的に使用する開発者であれば、ほぼ誰でも必要です。もしあなたが:
- 異なるアーキテクチャ(x86、ARM)用のイメージをビルドする。
- ビルドプロセスを大幅に高速化したい。
- CI/CDを使用し、最大限の効率を追求している。
- 複数のマイクロサービスを含む複雑なプロジェクトで作業している。
...であれば、Buildxはあなたの必須ツールになります。
ビルドアプローチを変える主要機能
BuildxはDockerビルドプロセスに有用な機能のセットをもたらします。最も興味深いものを見てみましょう。
1. マルチプラットフォームイメージ:1回ビルドすればどこでも実行!
これは、おそらく最も求められている機能の一つです。以前は、linux/amd64とlinux/arm/v7の両方で動作するイメージを取得するために、2つの別々のイメージをビルドするか、複雑なスクリプトを使用する必要がありました。Buildxはこのタスクを根本的に簡素化します。ビルド時に複数のターゲットプラットフォームを指定でき、Buildxは「マニフェストリスト」(すべての指定されたアーキテクチャのバージョンを含む単一のイメージ)を作成します。Dockerは実行時に正しいバージョンを自動的に選択します!
例:
docker buildx build --platform linux/amd64,linux/arm64 -t my-app:latest .
強力なサーバーからコンパクトなIoTデバイスまで、異なるハードウェアタイプ間でアプリケーションのメンテナンスがどれほど簡単になるか想像してみてください。もうどのイメージをどこに使うべきか 걱정する必要はありません - docker buildx build --platform linux/amd64,linux/arm/v7 -t myapp:latest .を実行すれば、Dockerが残りのすべてを処理します。
2. 分離ビルダーとビルドファーム
Buildxでは、ビルダーインスタンスを作成して管理できます。これはどういう意味ですか?メインドッカーデーモンに影響しない別のビルド環境を設定できます。これはCI/CDに非常に便利で、各ビルドはできるだけ分離されて再現可能である必要があります。さらに、複数のリモートノードを単一の「ビルドファーム」に組み合わせて、負荷を分散しプロセスを高速化できます。
たとえば、新しいビルダーを作成するには:
docker buildx create --name my-ci-builder --driver docker-container
docker buildx use my-ci-builder
docker buildx build .
これで、すべてのビルドはホスト上ではなく、新しい分離されたコンテナ内で実行されます。そしてdocker-containerドライバーを追加してリモートホストを指定すれば、本当の分散ビルドシステムを作成できます!
3. Docker Bakeによる高レベルビルド
複数のサービスとDockerfileで構成される複雑なプロジェクトで作業する人のために、BuildxはDocker Bakeとの統合を提供します。これはビルドプロセスの宣言的記述のためのツールです。複雑なbashスクリプトを書く代わりに、docker-compose.ymlファイルで何をどのようにビルドするかを記述し、Buildx Bakeは並列依存関係ビルドや出力管理を含むすべての面倒な作業を引き受けます。
これはMakefilesに似ていますが、DockerとBuildKit向けに調整されており、ビルドをオーケストレーションするための強力なツールを提供します。
4. スマートキャッシュと最適化
BuildKit自体はレイヤーのキャッシュが非常に効率的です。Buildxは分散キャッシュ>の使用を可能にすることでこれらの機能を拡張します。つまり、あなたやあなたのチームが同様のイメージをすでにビルドしている場合、Buildxはそれらが異なるノードやリモートストレージにあっても、キャッシュされたレイヤーを再利用できません。結果は、頻繁なコード変更 особенноで、ビルド時間の大幅な短縮です。
内部動作の仕組み
BuildxはDockerをゼロから書き換えるのではありません - BuildKit>の能力を使用して拡張します。BuildKitは単なるビルドエンジンではなく、ファイルシステムの操作、コマンドの実行、依存関係の管理のための低レベルプリミティブを提供するフレームワーク全体です。セキュリティ、パフォーマンス、マルチプラットフォームサポートの現代的な要件を考慮して設計されています。
Buildxではビルダーに異なるドライバー>を選択できます:
- docker:ローカルのDockerデーモンを使用(デフォルト)。
- docker-container:分離を提供する別のコンテナでBuildKitを実行。
- kubernetes:Kubernetesクラスタ内で直接BuildKitビルドを実行し、そのリソースを使用。
- remote:リモートBuildKitデーモンに接続。
特に興味深いのは、Buildxがマルチプラットフォームビルドを処理する方法です。3つの主要な戦略があります:
- QEMUエミュレーション:最もシンプルなアプローチ。ホストシステムにエミュレーションが設定されている場合(たとえばbinfmt_miscを使用)、BuildKitはQEMUを使用して他のアーキテクチャ用のバイナリを実行できます。Docker Desktopにはすでにこのサポートが含まれています。
- ネイティブノード:最高のパフォーマンスと複雑なシナリオのために、ネイティブアーキテクチャで動作する複数のノードで構成されるビルダーを作成できます(たとえば、1つはlinux/amd64、もう1つはlinux/arm64)。Buildxはタスクを分散します。
- Dockerfileでのクロスコンパイル:プログラミング言語がクロスコンパイルをサポートしている場合、Dockerfileのマルチステージビルドを使用して、ビルダーのネイティブアーキテクチャでターゲットプラットフォーム用のバイナリをビルドできます。Buildxはこのようなシナリオのための特別な引数(TARGETARCH、BUILDARCH)を提供します。
実践的な応用例:Buildxが真価を発揮する場所
- IoTと組込みシステム開発:ARMプロセッサ搭載のデバイス(Raspberry Piなど)用のソフトウェアを作成している場合、Buildxはメインマシンでイメージをビルドできるため、ビルドとテストのプロセスを大幅に簡素化します。
- クラウドアプリケーション:現代のクラウドは多くの場合、コスト削減のためにARMプロセッサを含むさまざまなインスタンスタイプを使用しています。Buildxはいたるところで動作する汎用イメージを作成できます。
- CI/CDパイプライン:より高速なビルド、分離された環境での実行(たとえばKubernetes内)、集中化されたキャッシュ - これらはすべて効果的なCI/CDに不可欠です。
- Apple M1/M2/M3での開発:Apple Siliconチップ搭載のMacを使用している場合、多くのDockerイメージが歴史的にlinux/amd64向けに最適化されているという事実に出くわしたことがあるでしょう。Buildxを使用すると、linux/arm64にネイティブのイメージを簡単にビルドして使用したり、汎用マニフェストリストを作成したりできます。
結論:Buildxに移行する価値はあるか?
もちろんです!Docker Buildxは単なる良い追加機能ではありません - 現代のDocker開発者にとって必須のツールです。それは長年にわたって私たちが取り組んでいた多くの問題を解決し、より効率的で高速、かつ柔軟なビルドプロセスへの扉を開きます。
まだdocker buildのみを使用している場合でも、docker buildx buildへの移行は、スキルをレベルアップしワークフローを大幅に改善するための最も簡単で最も効果的な方法の1つです。試してみてください。Dockerビルドがどれほど高速で便利になったかにきっと驚くでしょう!インストールはシンプルで、特にDocker DesktopまたはDocker Engineバージョン19.03以降をすでに持っている場合は簡単です。ビルドを真に変更してください。
関連プロジェクト