はじめに
この実験では、docker system events コマンドを使用して Docker のアクティビティを効果的に監視する方法を学びます。まず、イメージのプルやコンテナの実行などのアクションによって生成されるリアルタイムの Docker イベントを監視します。
続いて、様々な基準に基づいてこれらのイベントをフィルタリングする方法を探ります。これには、--since および --until フラグを使用した時間によるフィルタリング、--filter フラグを使用したオブジェクトの種類とアクションによるフィルタリング、およびより具体的な監視のための複数のフィルターの組み合わせが含まれます。最後に、--format フラグを使用してイベント出力をより読みやすく分析しやすい形式にする方法を学びます。
リアルタイムの Docker イベントをリスンする
このステップでは、リアルタイムの Docker イベントを監視する方法を学びます。Docker イベントは、コンテナ、イメージ、またはボリュームの起動、停止、または削除などの特定のアクションが発生したときに、Docker デーモンによって生成されます。これらのイベントを監視することは、自動化、ロギング、およびデバッグに役立ちます。
Docker イベントを監視するには、docker events コマンドを使用します。デフォルトでは、このコマンドはイベントが発生するたびに連続して出力します。
まず、ターミナルを開き、docker events コマンドを実行しましょう。このコマンドはブロックされ、イベントを待ちます。
docker events
次に、新しいターミナルを開きます(最初のターミナルで docker events を実行したままにしておきます)。この新しいターミナルで、簡単な Docker コンテナを実行します。このアクションによって生成されるイベントは、最初のターミナルで確認できます。
新しいターミナルで、次のコマンドを実行して hello-world イメージをプルします。これにより pull イベントが生成されます。
docker pull hello-world
最初のターミナルに、イメージのプルイベントが発生したことを示す出力が表示されるはずです。
次に、hello-world コンテナを実行します。これにより create、start、および die イベントが生成されます。
docker run hello-world
最初のターミナルの出力を確認します。コンテナの作成、起動、そして終了(停止)に関連するイベントが表示されるはずです。
最初のターミナルで docker events コマンドを停止するには、Ctrl+C を押します。
--since と --until を使用してイベントを時間でフィルタリングする
このステップでは、--since と --until フラグを使用して、時間に基づいて Docker イベントをフィルタリングする方法を学びます。これは、特定の時間範囲内に発生したイベントを表示するのに役立ちます。
--since フラグを使用すると、特定の時間以降に発生したイベントを表示できます。--until フラグを使用すると、特定の時間までに発生したイベントを表示できます。これらのフラグを組み合わせて、時間範囲を指定することができます。
時間は、様々な形式で指定できます。RFC3339 日付形式(例:2023-10-27T10:00:00Z)、Unix タイムスタンプ(例:1698393600)、または相対時間(例:10m は 10 分前、1h は 1 時間前)などです。
まず、いくつかのイベントを生成しましょう。再度 hello-world コンテナを実行します。
docker run hello-world
次に、過去 5 分間に発生したイベントを表示してみましょう。相対時間を指定して --since フラグを使用できます。
docker events --since 5m
先ほど実行した hello-world コンテナに関連するイベントが表示されるはずです。
次に、過去 10 分間に発生したイベントのうち、過去 2 分間に発生したイベントを除いたものを表示してみましょう。相対時間を指定して --since と --until の両方のフラグを使用できます。
docker events --since 10m --until 2m
hello-world コンテナを実行した時間によっては、イベントが表示される場合と表示されない場合があります。イベントが表示されない場合は、時間範囲を調整してみてください。
絶対タイムスタンプを使用することもできます。現在の Unix タイムスタンプを取得するには、date +%s コマンドを使用できます。
現在のタイムスタンプを取得しましょう。
date +%s
次に、再度 hello-world コンテナを実行します。
docker run hello-world
再度現在のタイムスタンプを取得します。
date +%s
ここで、取得した 2 つのタイムスタンプを --since と --until フラグで使用して、その 2 つの時間の間に発生したイベントを表示します。START_TIMESTAMP と END_TIMESTAMP を、実際に記録したタイムスタンプに置き換えてください。
docker events --since START_TIMESTAMP --until END_TIMESTAMP
2 つのタイムスタンプの間に発生した hello-world コンテナの実行に関するイベントが表示されるはずです。
--filter を使用してオブジェクトの種類とアクションでイベントをフィルタリングする
このステップでは、--filter フラグを使用して、オブジェクトの種類とアクションに基づいて Docker イベントをフィルタリングする方法を学びます。これにより、コンテナイベントやイメージイベントなどの特定の種類のイベント、および create、start、stop、delete などの特定のアクションに焦点を当てることができます。
--filter フラグは key=value の形式のキーバリューペアを取ります。オブジェクトの種類でフィルタリングする場合、キーは type で、バリューは container、image、volume、network、daemon、または plugin です。アクションでフィルタリングする場合、キーは event で、バリューは特定のアクションです。
まず、コンテナイベントのみをフィルタリングしてみましょう。イベントを生成するために、再度 hello-world コンテナを実行します。
docker run hello-world
次に、--filter type=container フラグを使用した docker events コマンドを実行して、コンテナ関連のイベントのみを表示します。
docker events --filter type=container --since 5m
hello-world コンテナの create、start、die などのイベントが表示されるはずですが、イメージのプルに関連するイベントは表示されません。
次に、特定のアクション、たとえばコンテナの start イベントのみをフィルタリングしてみましょう。
docker events --filter type=container --filter event=start --since 5m
このコマンドは、hello-world コンテナの start イベントが過去 5 分以内に発生した場合にのみ表示します。
オブジェクトの名前または ID でもフィルタリングできます。たとえば、my-container という名前の特定のコンテナのイベントをフィルタリングするには、--filter container=my-container を使用します。
特定の名前で hello-world コンテナを実行しましょう。
docker run --name my-hello-container hello-world
次に、my-hello-container という名前のコンテナに関するイベントを具体的にフィルタリングします。
docker events --filter container=my-hello-container --since 5m
過去 5 分以内に my-hello-container に関連するすべてのイベントが表示されるはずです。
複数の --filter フラグを使用して複数の条件でイベントをフィルタリングする
このステップでは、複数の --filter フラグを組み合わせて、複数の条件に基づいて Docker イベントを同時にフィルタリングする方法を学びます。これにより、より具体的なフィルタを作成して、自分が関心のあるイベントを正確に見つけることができます。
複数の --filter フラグを使用すると、Docker は「AND」論理を適用します。つまり、イベントは指定されたすべてのフィルタに一致しなければ、出力に含まれません。
オブジェクトの種類とアクションによるフィルタリングを組み合わせてみましょう。コンテナの start イベントをフィルタリングします。
まず、start イベントを生成するためにコンテナを実行します。
docker run hello-world
次に、2 つの --filter フラグを使用します。1 つはオブジェクトの種類用 (type=container)、もう 1 つはアクション用 (event=start) です。また、時間範囲を制限するために --since 5m も使用します。
docker events --filter type=container --filter event=start --since 5m
hello-world コンテナの start イベントが過去 5 分以内に発生した場合、そのイベントのみが表示されるはずです。create や die などのイベントは、event=start フィルタに一致しないため除外されます。
時間、種類、アクションによるフィルタリングを組み合わせることもできます。たとえば、過去 10 分間に発生したが、過去 2 分間には発生していないコンテナの die イベントをフィルタリングしてみましょう。
docker events --filter type=container --filter event=die --since 10m --until 2m
このコマンドは、指定された時間範囲内に該当するコンテナの die イベントを表示します。
コンテナ名やイメージ名でのフィルタリングなど、さらに多くのフィルタを追加することもできます。ubuntu イメージを使用する my-specific-container という名前のコンテナの start イベントをフィルタリングしてみましょう。
まず、ubuntu イメージをプルします。
docker pull ubuntu
次に、特定の名前で ubuntu コンテナを実行します。
docker run --name my-specific-container ubuntu echo "Hello from Ubuntu"
次に、my-specific-container という名前のコンテナの start イベントをフィルタリングします。
docker events --filter type=container --filter event=start --filter container=my-specific-container --since 5m
my-specific-container の start イベントが過去 5 分以内に発生した場合、そのイベントが表示されるはずです。
--format を使用してイベント出力をフォーマットする
このステップでは、--format フラグを使用して Docker イベントの出力をフォーマットする方法を学びます。これにより、各イベントに表示される情報をカスタマイズでき、解析や閲覧が容易になります。
--format フラグは Go の text/template パッケージの構文を使用します。イベントオブジェクトの様々なフィールド、例えば .Time、.Type、.Action、.Actor.ID、.Actor.Attributes にアクセスできます。
まず、各イベントの時間、種類、アクションを表示してみましょう。
まず、hello-world コンテナを実行していくつかのイベントを生成します。
docker run hello-world
次に、--format フラグを使用した docker events コマンドを実行して、希望する出力形式を指定します。時間、種類、アクションをタブ (\t) で区切って表示します。
docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}'
以下のような出力が表示されるはずですが、タイムスタンプと ID は異なります。
2023-10-27 10:30:00.123456789 +0000 UTC container create
2023-10-27 10:30:00.987654321 +0000 UTC container start
2023-10-27 10:30:01.567890123 +0000 UTC container die
イベントをトリガーしたアクターの属性にもアクセスできます。例えば、コンテナ名を表示するには、.Actor.Attributes.name を使用できます。
再度、名前を付けて hello-world コンテナを実行しましょう。
docker run --name my-formatted-container hello-world
次に、出力をフォーマットしてコンテナ名を含めます。
docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}\t{{.Actor.Attributes.name}}'
出力にはこれでコンテナ名が含まれるはずです。
2023-10-27 10:35:00.123456789 +0000 UTC container create my-formatted-container
2023-10-27 10:35:00.987654321 +0000 UTC container start my-formatted-container
2023-10-27 10:35:01.567890123 +0000 UTC container die my-formatted-container
より複雑なフォーマットを行うために、フォーマット文字列内で様々なテンプレート関数や制御構造を使用できます。詳細については、Go の text/template ドキュメントを参照してください。
まとめ
この実験では、docker events コマンドを使用して Docker のアクティビティをリアルタイムで監視する方法を学びました。まず、すべての Docker イベントが発生するのをリスンし、簡単なコンテナのプルと実行によって生成されるイベントを観察しました。
その後、様々な条件に基づいてこれらのイベントをフィルタリングする方法を調べました。--since と --until フラグを使用して時間でイベントをフィルタリングし、特定の時間範囲内のイベントを表示する方法を学びました。また、--filter フラグを使用してオブジェクトの種類とアクションでイベントをフィルタリングする方法や、複数のフィルタを同時に適用してイベントストリームを絞り込む方法を発見しました。最後に、--format フラグを使用して docker events コマンドの出力をフォーマットし、読みやすさと解析性を向上させる方法を学びました。



