DockerのBuildKitとは何ですか、そしてそれがなぜ重要なのですか?
Docker BuildKitはオプトインのイメージビルディングエンジンであり、従来のプロセスに対して大幅な改善を提供します。BuildKitは、イメージのレイヤーを並行して作成し、全体のビルドプロセスを加速します。
BuildKitとは何ですか?
BuildKitは、特別なコンテナシステムを再発明することなく「組み立てる」ためのDockerの取り組みであるMobyプロジェクトの一環として開発されました。それは2017年に発表され、2018年のバージョン18.09でDocker Engineと共に出荷され始めました。
BuildKitは、ビルドパフォーマンス、ストレージ管理、および拡張性の向上に焦点を当てています。その主な特徴は、並列処理、より高度なキャッシュ、プラグイン可能なアーキテクチャ、自動ガベージコレクションです。これらは、元のエンジンよりも効率的で拡張性のあるビルドシステムを構成します。
お互いに影響を与えないレイヤーは同時に構築できるため、ステージが完了するのを待つ時間が短縮されます。BuildKitは、参照するローカルファイルへのアクセスも最適化します。
COPY
指示。それはあなたが行った変更を追跡し、前回のビルド以来変更されたファイルのみをコピーします。全体のビルドコンテキストを転送するのではなく。
BuildKitは、マルチプラットフォームビルドも簡素化します。供給することができます
--platformビルド対象を指定するためのフラグです。BuildKitは、指定されたすべてのアーキテクチャをカバーする適切なイメージマニフェストを自動的に組み立てます。
docker buildx --create --platform linux/amd64,linux/arm64 .BuildKitはどのように機能しますか?
BuildKitのパフォーマンス向上は、LLBと呼ばれる低レベルのビルド定義フォーマットの使用によって促進されています。これは、複雑なビルド定義を結びつけるグラフベースのバイナリフォーマットです。
レイヤーが直接リンクされているため、BuildKitはビルドグラフとそれに含まれるコンテンツの比較を迅速に行うことができます。デフォルトのDockerfileビルダーは、2つのイメージが比較可能かどうかを判断するために不正確なヒューリスティックに依存する必要があります。
LLBはBuildKitの「フロントエンド」とは完全に独立しています。フロントエンドは、Dockerfile のような人間が読める形式のイメージを受け取り、それをLLBグラフに変換します。一度LLBが生成されると、それはエクスポートされ、環境間を移動することができます。レジストリにエクスポートすることで、フロントエンドクライアントは既存のLLBを取得し、初回ビルドパフォーマンスをさらに向上させることができます。
LLBの技術的詳細はかなり複雑です。基盤となる技術はグラフ理論とチェックサム比較に基づいています。それを理解する必要はありません。その力を生かすために:エンドユーザーとしては、ビルドは従来通り、docker buildコマンドで動作します。
BuildKitは依然としてOCI準拠のイメージを作成し、さまざまなコンテナ環境で移植可能です。BuildKitを使用して、LinuxベースのDockerイメージを作成できます。Windowsイメージは現在サポートされていません。
BuildKitサポートの有効化
BuildKitを有効にする方法は2つあります。機能を使って単一のイメージをビルドしたい場合は、シェルでDOCKER_BUILDKIT環境変数を設定してください:
DOCKER_BUILDKIT=1 docker build .長期的な使用のために、DockerデーモンをデフォルトでBuildKitを使用するように設定します。/etc/docker/daemon.jsonファイルを作成または編集し、以下の内容をトップレベルの設定オブジェクトに追加します:
{
"features": {
"buildkit": true
}
}
デーモンの設定を再読み込みして変更を適用します:
systemctl reload dockerdocker build コマンドを実行すると、デフォルトのビルドエンジンの代わりに BuildKit が使用されるようになります。
BuildKitがアクティブなときは、通常のエンジンとは異なるCLI出力を生成するので、それを確認できます。BuildKitの進捗表示は、可読性が向上し、各ステージが開始および完了するタイミングを明確に視覚化します。情報には、各レイヤーの構築にかかった時間の内訳が含まれています。
"docker buildx"
BuildKitとは、docker buildxコマンドを通じてもインタラクションできます。これらは常にBuildKitを使用します。dockerxコマンドグループは、リモートホストでビルドする機能を含む高度なBuildKit機能を公開しています。
単一のBuildKitクライアントは、いくつかの異なるイメージビルダーインスタンスとやり取りできます。これにより、対象とするアーキテクチャごとにビルダーを追加することで、マルチプラットフォームビルドが容易になります。
ここでは、リモートホストをBuildKitターゲットとして追加する例を示します。これは、ターゲットマシンがTCPポート2375上でDockerソケットを公開していることを前提としています。ホストは、任意のDockerエンドポイント識別子またはDockerコンテキストの名前(docker context lsから取得できます)を使用して参照できます。後者により、互換性のあるクラウド環境でビルドを行うことができ、それらをコンテキストとして追加できます。
docker buildx create --name remote-builder tcp://my-docker-host:2375docker buildx use コマンドで使用するビルダーを選択できます:
docker buildx use remote-builderその後、選択したビルダーインスタンスで画像をビルドするために build コマンドを使用できます:
docker buildx build .ビルダーのインスタンスは、ビルダーの名前を渡して docker buildx rm を使用することで削除できます。ビルダーは docker buildx ls を使用して一覧表示され、特定のビルダーの詳細情報を取得するには docker buildx inspect を使用できます。
BuildKitのディスク使用量を確認したい場合は、docker buildx duコマンドを実行してください。ストレージを解放するためにビルドキャッシュをクリアするには、docker buildx pruneを使用できます。これにより、次回イメージを再構築する際にパフォーマンスが低下する可能性があります。なぜなら、以前にキャッシュされたレイヤーが再構築されるからです。
機能を構築する
BuildKitは、Dockerfileのステップを簡素化するために、いくつかの追加のビルド時機能を追加します。
秘密のデータは --secret フラグを使用して渡すことができます。これにより、Dockerfile はイメージの内部に保存せずに機密値にアクセスできます。この値はビルド時にのみ利用可能です。
docker build --secret id=demo-secret,src=demo-secret.txt .FROM my-image:latest
RUN --mount=type=secret,id=demo-secret cat /run/secrets/demo-secrets
この Dockerfile は demo-secret というシークレットを参照しています。その値は docker build を実行するときに demo-secret.txt ファイルから読み込まれます。 RUN 命令に --mount フラグを付けることで、シークレットにアクセスできます。このファイルは一時的に /run/secrets ディレクトリにマウントされます。
BuildKitは、ホストのSSHエージェントを転送することもできるため、ビルド指示が既存のリモート接続と対話できます。docker buildに--sshフラグを渡し、DockerfileのRUN命令に--mount=type=sshを追加します:
docker build --ssh .RUN --mount=type=ssh git clone git@example.com:/project.gitこれらの機能により、全体的なセキュリティに影響を与えることなく、イメージビルディングがより便利になります。SSHエージェントフォワーディングとシークレットマウントはBuildKitでのみ利用可能で、デフォルトのビルドエンジンにはそれに相当するものはありません。
結論
BuildKitは、グラフ形式のバイナリフォーマットを使用してビルドを劇的に加速する次世代のDockerイメージビルダーです。各Dockerfileごとに性能は大きく異なる可能性がありますが、イメージレイヤーの並列処理が可能な場合には、顕著な速度向上が期待できます。
BuildKitのアーキテクチャは、最新のDockerfile機能のいくつかを最適化しています。マルチステージビルドは、未使用のステージをスキップすることで、標準のビルダーよりもプロセスを効率的にします。
BuildKitは現在安定していますが、Dockerは依然としてデフォルトで有効にしていません。機能を使用したい場合は、Dockerクライアントでそれを有効にすることを確認してください。BuildKitを標準ビルドエンジンにするための活発な提案がありますが、切り替えを妨げている未解決の問題がまだ残っています。

