はじめに
この実験では、Docker イメージのビルドトレースを表示・分析するためにdocker buildx history traceを使用する方法を学びます。まず、シンプルな Docker イメージをビルドし、標準的な Docker コマンドを使用してそのビルド履歴を記録することから始めます。
最初のビルド後、記録されたビルド履歴レコードを一覧表示する方法を探り、その後特定のビルドレコードの詳細な OpenTelemetry トレースを表示する方法について深く掘り下げます。最後に、2 つの異なるビルドレコードのトレースを比較する方法を学び、ビルドプロセスと潜在的な最適化に関する貴重な知見を得ます。
イメージをビルドして履歴を記録する
このステップでは、Docker イメージをビルドし、そのビルド履歴を記録する方法を学びます。Docker イメージはDockerfileからビルドされます。Dockerfileは、イメージを構築するためにコマンドラインで呼び出す可能性のあるすべてのコマンドを含むテキストファイルです。
まず、シンプルなDockerfileを作成しましょう。まだ~/projectディレクトリにいない場合は移動してください。
cd ~/project
次に、nanoエディタを使用してDockerfileという名前のファイルを作成します。
nano Dockerfile
Dockerfileに以下の内容を追加します:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends fortune-mod
CMD ["/usr/games/fortune"]
このDockerfileは最新の Ubuntu イメージをベースにし、パッケージリストを更新してfortune-modパッケージをインストールし、デフォルトコマンドとしてfortuneプログラムを実行するように設定しています。
ファイルを保存してnanoを終了します(Ctrl + Xを押し、次にY、そしてEnterを押します)。
次に、docker buildコマンドを使用して Docker イメージをビルドします。イメージにmy-fortune-imageというタグを付け、現在のディレクトリ(.)をビルドコンテキストとして使用します。
docker build -t my-fortune-image .
ベースイメージのダウンロードやapt-getコマンドの実行など、ビルドプロセスを示す出力が表示されます。
ビルド履歴を記録するには、docker historyコマンドを使用できます。このコマンドはイメージの履歴を表示します。
docker history my-fortune-image
出力には、イメージを構成するレイヤーのリストが表示され、各レイヤーを作成するために使用されたコマンド、レイヤーのサイズ、作成日時が含まれます。この履歴は、イメージのビルド方法を理解したり、デバッグしたりするのに役立ちます。
ビルド履歴レコードの一覧表示
このステップでは、Docker イメージのビルド履歴レコードを一覧表示する方法についてさらに学びます。前のステップで見たように、docker historyコマンドはイメージを構成するレイヤーの詳細なビューを提供します。
前のステップでビルドしたmy-fortune-imageに対して、再度docker historyコマンドを実行してみましょう。
docker history my-fortune-image
出力には以下の列が表示されます:
- IMAGE: イメージレイヤーの ID
- CREATED: レイヤーが作成されたタイムスタンプ
- CREATED BY: レイヤーを作成したコマンド
- SIZE: レイヤーのサイズ
- COMMENT: レイヤーに関連付けられたコメント
出力の各行はイメージ内の 1 つのレイヤーを表します。レイヤーは最新のもの(上部)から最も古いもの(下部)の順にリストされます。ベースイメージ(この場合はubuntu:latest)は最下層になります。
-qフラグを使用すると、イメージ ID のみを表示することもできます。
docker history -q my-fortune-image
これはスクリプティングやその他の目的でレイヤーID のみが必要な場合に便利です。
docker historyコマンドは、Docker イメージの構成を理解したり、イメージレイヤーに関連する問題をデバッグしたりするための強力なツールです。
ビルドレコードの OpenTelemetry トレースを表示
このステップでは、Docker ビルドレコードの OpenTelemetry トレースを表示する方法を学びます。OpenTelemetry は、ソフトウェアのパフォーマンスと動作を分析するためのテレメトリデータ(メトリクス、ログ、トレース)を計測、生成、収集、エクスポートするためのツール、API、SDK のコレクションです。Docker は OpenTelemetry と統合して、ビルドプロセスの詳細なトレースを提供できます。
OpenTelemetry トレースを表示するには、イメージビルド時にトレースを有効にする必要があります。トレースを有効にしてmy-fortune-imageを再ビルドします。
まず、~/projectディレクトリにいることを確認してください。
cd ~/project
次に、再度イメージをビルドしますが、今回はBUILDKIT_TRACE環境変数を設定してトレースを有効にします。また、--progress=plainフラグを使用してビルド出力を直接確認します。
BUILDKIT_TRACE=trace.json docker build --progress=plain -t my-fortune-image .
このコマンドはイメージを再ビルドし、OpenTelemetry トレースデータを現在のディレクトリのtrace.jsonというファイルに保存します。
ビルドが完了したら、trace.jsonファイルの内容を表示できます。このファイルには JSON 形式のトレースデータが含まれています。
cat trace.json
出力は、各ステップの所要時間、依存関係、その他のメタデータなど、ビルドプロセスに関する詳細情報を含む大きな JSON オブジェクトになります。このトレースデータは、可視化と分析のために Jaeger や Zipkin などの OpenTelemetry 互換のトレーシングバックエンドにインポートできます。
この実験では完全なトレーシングバックエンドを設定しませんが、トレースファイルを生成する方法を理解することは、Docker ビルド分析に OpenTelemetry を活用するための第一歩です。
2 つのビルドレコードのトレース比較
このステップでは、2 つの異なる Docker ビルドレコードから OpenTelemetry トレースを生成して比較する方法を学びます。トレースを比較することで、特にDockerfileやビルド環境に変更を加えた後に、ビルド間のパフォーマンスの違いを特定するのに役立ちます。
まず、~/projectディレクトリにいることを確認してください。
cd ~/project
前回のビルドからtrace.jsonファイルが既に存在します。これを保持するためにtrace1.jsonにリネームしましょう。
mv trace.json trace1.json
次に、Dockerfileに小さな変更を加えてイメージを再ビルドし、2 つ目のトレースファイルを生成します。Dockerfileに簡単なLABEL命令を追加します。
Dockerfileを編集用に開きます。
nano Dockerfile
CMD命令の後に以下の行を追加してください:
LABEL version="1.0"
更新後のDockerfileは以下のようになります:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends fortune-mod
CMD ["/usr/games/fortune"]
LABEL version="1.0"
ファイルを保存してnanoを終了します。
次に、イメージを再ビルドし、trace2.jsonという新しいトレースファイルを生成します。
BUILDKIT_TRACE=trace2.json docker build --progress=plain -t my-fortune-image .
ビルドが完了すると、trace1.jsonとtrace2.jsonの 2 つのトレースファイルが得られます。
生の JSON ファイルを直接比較するのは難しい場合がありますが、これらのファイルは OpenTelemetry トレーシングバックエンドで処理されるように設計されています。実際のシナリオでは、trace1.jsonとtrace2.jsonの両方を Jaeger などのトレーシング可視化ツールにインポートします。このツールを使用すると、2 つのビルドのタイムラインとスパンを視覚的に比較でき、実行時間の違いを簡単に確認したり、変更によって影響を受けたステップを特定したりできます。
例えば、Jaeger でこれらのトレースを表示すると、Docker ビルドの個々のステップ(FROM、RUN、CMD、LABELなど)がスパンとして表示されます。その後、これらのスパンの所要時間を 2 つのトレース間で比較し、LABEL命令の追加がビルド時間に測定可能な影響を与えたかどうかを確認できます。
この実験ではトレーシングバックエンドを設定していないため、両方のトレースファイルが存在することを確認するだけに留めます。
まとめ
この実験では、docker buildコマンドを使用してDockerfileから Docker イメージをビルドし、識別しやすいようにイメージにタグを付ける方法を学びました。その後、docker historyコマンドを使用して作成したイメージのビルド履歴を確認し、ビルドプロセスで使用されたレイヤーやコマンドに関する洞察を得ました。
さらに、この実験ではより詳細なビルド履歴レコードの表示方法を解説し、docker historyコマンドを通じて利用可能な情報を実証しました。また、特定のビルドレコードの OpenTelemetry トレースを表示する方法を学び、ビルドプロセスの詳細な分析が可能になりました。最後に、2 つの異なるビルドレコードのトレースを比較する実践を行い、変更内容の理解やビルド問題のデバッグに役立つ手法を習得しました。



