はじめに
この実験では、docker compose events コマンドを使用してコンテナイベントを監視する方法を学びます。まず、Docker Compose のインストールと基本的な docker-compose.yml ファイルの作成を含む、シンプルな Docker Compose プロジェクトの準備から始めます。
セットアップが完了したら、プロジェクトで定義されたサービスを起動し、生成される基本的なイベントを観察します。その後、--json フラグを使用してこれらのイベントを構造化された JSON 形式で出力する方法を探ります。最後に、Docker Compose アプリケーション内の特定のサービスに関連するイベントのみを監視するためのフィルタリング方法を学びます。
シンプルな Docker Compose プロジェクトの準備
このステップでは、シンプルな Docker Compose プロジェクトを準備します。LabEx 環境には Docker Compose がプリインストールされていないため、まずインストールを行います。Docker Compose は、マルチコンテナの Docker アプリケーションを定義・実行するためのツールです。Compose では YAML ファイルを使用してアプリケーションのサービスを設定し、単一のコマンドで設定からすべてのサービスを作成・起動できます。
まず、Docker Compose をインストールしましょう。Docker Compose バイナリをダウンロードし、実行可能にします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
インストール後、バージョンを確認してインストールを検証できます。
docker-compose --version
Docker Compose version v2.20.2のような出力が表示されるはずです。
次に、プロジェクト用のディレクトリを作成し、移動します。ここでは単一サービスを持つシンプルなプロジェクトを作成します。
mkdir ~/project/my-compose-app
cd ~/project/my-compose-app
このディレクトリにdocker-compose.ymlファイルを作成します。このファイルでサービスを定義します。nanoエディタを使用してファイルを作成・編集します。
nano docker-compose.yml
nanoエディタで、以下の内容を貼り付けます。この設定はnginx:latestイメージを使用するwebという名前のサービスを定義しています。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
このdocker-compose.ymlファイルの内容を分解してみましょう:
version: '3.8'Docker Compose ファイルフォーマットのバージョンを指定services:アプリケーションを構成するサービスを定義web:サービス名image: nginx:latestこのサービスで使用する Docker イメージを指定(公式 Nginx イメージの最新版)ports:ホストとコンテナ間のポートマッピング。"80:80"はホストの 80 番ポートをコンテナの 80 番ポートにマッピング
Ctrl + X、Y、Enterの順でファイルを保存します。
サービスを起動する前に、nginx:latestイメージをプルしましょう。Docker Compose はイメージが存在しない場合に自動的にプルしますが、事前に明示的にプルしておくと便利な場合があります。
docker pull nginx:latest
イメージがプルされ、ダウンロードされることを示す出力が表示されるはずです。
これでdocker-compose.ymlファイルの準備と必要なイメージの取得が完了しました。次のステップでは、このファイルで定義されたサービスを起動します。
サービスの起動と基本イベントの観察
このステップでは、docker-compose.ymlファイルで定義したサービスを起動し、Docker が生成する基本イベントを観察します。Docker イベントは、コンテナの作成、起動、停止、破棄など、Docker デーモンとコンテナで発生している事象に関するリアルタイム情報です。
まず、前のステップでdocker-compose.ymlファイルを作成した~/project/my-compose-appディレクトリにいることを確認してください。
cd ~/project/my-compose-app
次に、docker-compose upコマンドを使用してサービスを起動します。-dフラグはコンテナをデタッチドモードで実行し、バックグラウンドで動作させてターミナルをブロックしません。
docker-compose up -d
ネットワークとwebサービスコンテナが作成・起動されることを示す出力が表示されるはずです。
[+] Running 2/2
⠿ Network my-compose-app_default Created
⠿ Container my-compose-app-web-1 Started
基本的な Docker イベントを観察するために、docker eventsコマンドを使用します。このコマンドは Docker デーモンからのイベントをストリーム表示します。
docker events
Docker 環境に関連するイベントの継続的なストリームが表示されます。コンテナを起動したばかりなので、my-compose-app-web-1コンテナに関連する作成、起動、その他のアクションに関するイベントが見られるはずです。出力は以下のようになります(タイムスタンプと詳細は異なります):
2023-10-27T10:00:00.123456789Z container create 1234567890abcdef... (image=nginx:latest, name=my-compose-app-web-1, ...)
2023-10-27T10:00:01.987654321Z container start 1234567890abcdef... (image=nginx:latest, name=my-compose-app-web-1, ...)
...
docker eventsコマンドは実行を継続し、新しいイベントが発生すると表示します。コマンドを停止してターミナルプロンプトに戻るには、Ctrl + Cを押してください。
また、docker psコマンドを使用して実行中のコンテナを確認できます。
docker ps
my-compose-app-web-1コンテナがUpのステータスで表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
... nginx:latest "nginx -g 'daemon off" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp my-compose-app-web-1
このステップでは、Docker Compose サービスを正常に起動し、Docker が生成する基本イベントを観察しました。次のステップでは、これらのイベントを JSON 形式で出力する方法を探ります。
--json フラグを使用してイベントを JSON 形式で出力
このステップでは、docker eventsコマンドに--jsonフラグを追加して Docker イベントを JSON 形式で出力する方法を学びます。イベントを JSON 形式で出力することは、プログラムによる処理や他のツールとの連携に有用です。
まず、~/project/my-compose-appディレクトリにいることを確認してください。
cd ~/project/my-compose-app
次に、docker eventsコマンドに--jsonフラグを付けて実行します。これにより、イベントが JSON 形式でストリーム表示されます。
docker events --json
JSON オブジェクトの継続的なストリームが表示され、各オブジェクトが Docker イベントを表します。出力は以下のようになります(詳細は異なります):
{"status":"create","id":"1234567890abcdef...","from":"nginx:latest","Type":"container","Action":"create","Actor":{"ID":"1234567890abcdef...","Attributes":{"image":"nginx:latest","name":"my-compose-app-web-1"}},"scope":"local","time":1678886400,"timeNano":1678886400123456789}
{"status":"start","id":"1234567890abcdef...","from":"nginx:latest","Type":"container","Action":"start","Actor":{"ID":"1234567890abcdef...","Attributes":{"image":"nginx:latest","name":"my-compose-app-web-1"}},"scope":"local","time":1678886401,"timeNano":1678886401987654321}
...
各行は有効な JSON オブジェクトで、イベントのstatus、影響を受けるオブジェクトのid、Type、Action、イメージ名やコンテナ名などのAttributesを含むActorの詳細など、イベントに関する詳細情報が含まれています。
これらのイベントをキャプチャするデモンストレーションとして、docker events --jsonコマンドが別のターミナルまたはバックグラウンドで実行されている間に、webサービスを停止してから再起動してみましょう。この実験では単一のターミナルを使用しているため、まずCtrl + Cを押してdocker events --jsonコマンドを停止します。
では、webサービスを停止します。
docker-compose stop web
webコンテナが停止中であることを示す出力が表示されるはずです。
[+] Stopping 1/1
⠿ Container my-compose-app-web-1 Stopped
次に、docker events --jsonをバックグラウンドで実行してから、サービスを再起動します。&記号を使用してコマンドをバックグラウンドで実行します。
docker events --json &
プロセス ID(PID)が表示され、コマンドがバックグラウンドで実行されていることがわかります。
では、webサービスを再起動します。
docker-compose start web
webコンテナが起動中であることを示す出力が表示されるはずです。
[+] Starting 1/1
⠿ Container my-compose-app-web-1 Started
バックグラウンドで実行されているdocker events --jsonコマンドは、stopとstartイベントをキャプチャします。バックグラウンドプロセスの出力を確認するには、fgコマンドを使用してフォアグラウンドに戻すか、バックグラウンドプロセスが停止した後にターミナルの出力を確認する必要があります。ただし、このステップの目的では、単に--jsonフラグを付けてコマンドを実行するだけで形式を理解するには十分です。
バックグラウンドのdocker events --jsonプロセスを停止するには、jobsコマンドでバックグラウンドジョブをリスト表示し、kill %<ジョブ番号>を使用します。または、ps aux | grep 'docker events --json'でプロセス ID を検索し、PID を指定してkillコマンドを使用します。この文脈では、バックグラウンドプロセスが大きな干渉をしないため、次のステップに進むだけで十分です。
このステップでは、--jsonフラグを使用して Docker イベントを構造化された JSON 形式で表示することに成功しました。これは自動化や分析に非常に価値があります。
特定サービスのイベントフィルタリング
このステップでは、Docker イベントをフィルタリングして特定のサービスやコンテナに関連するイベントのみを表示する方法を学びます。これは、多数のコンテナが存在する環境で特定のアプリケーションやサービスのイベントのみを監視したい場合に非常に有用です。
docker eventsコマンドは--filterフラグを使用したフィルタリングをサポートしています。container、image、event、labelなど、さまざまな基準でフィルタリングできます。
まず、~/project/my-compose-appディレクトリにいることを確認してください。
cd ~/project/my-compose-app
docker-compose.ymlファイルで定義したサービス名はwebで、Docker Compose が生成するコンテナ名は通常<プロジェクト名>_<サービス名>_<インスタンス番号>の形式になります。今回の場合、プロジェクト名はmy-compose-app(ディレクトリ名から派生)、サービス名はweb、インスタンス番号は1なので、コンテナ名はmy-compose-app-web-1となります。
webコンテナに関連するイベントのみを表示するようにフィルタリングしてみましょう。コンテナ名を指定してcontainerフィルタを使用します。
docker events --filter container=my-compose-app-web-1
このコマンドを実行すると、影響を受けるオブジェクトがmy-compose-app-web-1という名前のコンテナであるイベントのみが表示されます。実際に動作を確認するために、このコマンドを実行しながらwebサービスを停止して再起動してみましょう。
まず、Ctrl + Cを押してdocker eventsコマンドを停止します。
次に、フィルタリングされたdocker eventsコマンドをバックグラウンドで実行します。
docker events --filter container=my-compose-app-web-1 &
バックグラウンドプロセスの ID が表示されます。
Docker Compose を使用してwebサービスを停止します。
docker-compose stop web
コンテナが停止中であることを示す出力が表示されます。バックグラウンドで実行中のdocker eventsコマンドは、my-compose-app-web-1コンテナのstopイベントをキャプチャするはずです。
次に、webサービスを再起動します。
docker-compose start web
コンテナが起動中であることを示す出力が表示されます。バックグラウンドのdocker eventsコマンドは、my-compose-app-web-1コンテナのstartイベントをキャプチャするはずです。
他の基準でフィルタリングすることも可能です。例えば、イメージでフィルタリングするには--filter image=nginx:latestを使用できます。
バックグラウンドのdocker eventsプロセスを停止するには、jobsとkill %<ジョブ番号>を使用するか、PID を検索してkill <PID>を使用します。この実験では、そのまま進めても構いません。
最後に、Docker Compose で作成された実行中のコンテナとネットワークをクリーンアップしましょう。
docker-compose down
このコマンドは、docker-compose.ymlファイルで定義されたコンテナ、ネットワーク、ボリュームを停止して削除します。
[+] Running 2/1
⠿ Container my-compose-app-web-1 Removed
⠿ Network my-compose-app_default Removed
このステップでは、--filterフラグを使用して Docker イベントをフィルタリングする方法を学びました。これは、忙しい Docker 環境で特定のコンポーネントを監視するために不可欠です。また、実験中に作成されたリソースのクリーンアップも行いました。
まとめ
この実験では、docker compose eventsコマンドを使用してコンテナイベントを監視する方法を学びました。まず、Docker Compose のインストールと基本的な Nginx サービスを定義したdocker-compose.ymlファイルの作成を含む、シンプルな Docker Compose プロジェクトの準備から始めました。
プロジェクトのセットアップ後、サービスを起動し、Docker Compose によって生成される基本的なイベントを観察しました。その後、--jsonフラグを使用してこれらのイベントを JSON 形式で出力し、解析と分析を容易にする方法を探求しました。最後に、Docker Compose プロジェクト内の特定のサービスに関連するイベントのみを監視するためのフィルタリング方法を学びました。



