問題の概要
Dockerを扱っていて、アプリケーションの動作が異常に遅いと感じたことはありませんか?あるいは、サーバー全体が理由もなく重くなったことは?複数のDockerコンテナが同時に動作する環境では、どの「犯人」がシステムリソース(CPU、RAM)を消費しているのかを突き止めることが非常に重要です。監視がなければ、最適化やトラブルシューティングは非常に困難になります。
幸いなことに、Dockerには強力な組み込みツールdocker statsが用意されています。また、コミュニティはよりプロフェッショナルなソリューションとしてcAdvisorを開発しました。この記事では、これら両方の使用方法を詳細に説明します。これにより、コンテナのパフォーマンス問題を簡単に監視、検出し、対処できるようになります。
コアコンセプト
docker statsとは?
docker statsは、Docker CLIに組み込まれたコマンドです。これにより、実行中のコンテナのリソース使用状況をリアルタイムで確認できます。このツールは、各コンテナのCPU、RAM、ネットワークI/O、ディスクI/Oに関する迅速な概要を提供します。パフォーマンスの問題が疑われる場合に、素早く確認するのに理想的な選択肢です。
cAdvisorとは?
cAdvisor (Container Advisor)は、Googleが提供するオープンソースツールです。実行中のコンテナからパフォーマンスとリソース情報を収集、集約、処理、エクスポートするように設計されています。docker statsがリアルタイムデータのみを表示するのに対し、cAdvisorはそれ以上の機能を提供します。視覚的なグラフと詳細な履歴データを提供するため、傾向分析や長期的または定期的なリソース問題の検出に役立ちます。
なぜCPUとRAMの監視が必要なのか?
CPUとRAMは、アプリケーションのパフォーマンスを決定する2つのコアリソースです。これは、アプリケーションがコンテナ内で実行されている場合でも同様です。あるコンテナがCPUを過剰に消費すると、同じDockerホスト上の他のプロセスが遅くなる可能性があります。同様に、RAMが過剰に消費されると、システムはスワップ(RAMからディスクへのデータ交換)を使用せざるを得なくなります。その結果、パフォーマンスが著しく低下し、「Out Of Memory」(OOM)の状態に陥り、アプリケーションが完全にクラッシュすることさえあります。
実践的な手順
1. docker statsによる迅速な監視
docker statsは、コンテナのリソース状況の概要を把握するための最速ツールです。ターミナルを開いて、以下のコマンドを試してみましょう!
基本コマンド: 全てのコンテナを表示
引数なしでdocker statsと入力するだけで、実行中の全てのコンテナのリストと、各コンテナの詳細なリソース情報が表示されます。
docker stats
返される結果は次のようになります:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8e1d5a7d0c3b my-nginx 0.00% 2.207MiB / 7.769GiB 0.03% 1.57kB / 0B 0B / 0B 2
4b2e1f9c8d7a my-app 0.23% 125MiB / 7.769GiB 1.61% 6.74MB / 1.2MB 1.5MB / 564kB 15
- CONTAINER ID / NAME: コンテナのIDと名前。
- CPU %: コンテナが使用しているCPUの割合。この値が継続的に高い(例:80%以上)場合、コンテナが過負荷になっているか、問題が発生している兆候です。
- MEM USAGE / LIMIT: コンテナが使用しているRAMの量と、割り当てられた上限(もしあれば)の比較。
- MEM %: 使用中のRAMの割合。CPUと同様に、この数値が高い(例:70-80%以上)場合、RAM不足の危険性を示します。
- NET I/O: コンテナが送受信したネットワークデータ量。
- BLOCK I/O: ディスクに読み書きされたデータ量。
- PIDS: コンテナが実行しているプロセスの総数。
特定のコンテナを監視
1つまたは特定のコンテナのみを表示するには、そのIDまたは名前をコマンドに追加するだけです:
docker stats my-nginx my-app
非ストリーミングデータ(一度限り)の取得
時々、リソース状況の「スナップショット」だけが必要で、継続的なデータストリームは不要な場合があります。その際は、--no-streamフラグを使用してください:
docker stats --no-stream my-nginx
Nginxを使った実例
簡単なNginxコンテナを実行し、そのリソースを確認してみましょう!
docker run -d --name my-nginx nginx
その後、docker stats my-nginxコマンドを実行します。アクセスがない場合、NginxのCPUとRAMは通常非常に低いレベルであることがわかります。ブラウザからNginxにアクセスしてみると、CPU使用率がわずかに増加するかもしれません。
2. cAdvisorによる詳細な監視
より深い洞察を得るため、履歴を追跡し、データを視覚化するには、cAdvisorが完璧な選択肢です。便利なことに、cAdvisorもDockerコンテナとして実行されます。
cAdvisorのインストール(Dockerコンテナ内で実行)
以下のコマンドを実行してcAdvisorを起動します。このコマンドはGoogle Container RegistryからcAdvisorイメージをダウンロードします。その後、必要なDockerシステムリソースへのアクセス権を付与して実行されます。
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
gcr.io/cadvisor/cadvisor:latest
引数の説明:
--volume=...:ro: システムディレクトリを読み取り専用モードでマウントします。これにより、cAdvisorはシステムや他のコンテナに関する情報を収集できます。--volume=/var/run:/var/run:rw: cAdvisorがDockerデーモンと対話できるように、/var/runディレクトリへの書き込み権限を付与します。--publish=8080:8080: ホスト上で8080番ポートを開放します。これにより、cAdvisorのWebインターフェースにアクセスできます。--detach=true: コンテナをバックグラウンドモードで実行します。--name=cadvisor: コンテナにcadvisorという名前を付けて、管理しやすくします。
コマンドが正常に実行されると、cAdvisorは直ちにデータの収集を開始します。ブラウザでhttp://localhost:8080にアクセスすると、そのWebインターフェースにアクセスできます。リモートサーバーで実行している場合は、http://<IP_SERVER_DOCKER>:8080を使用してください。
cAdvisorインターフェースを探索する
http://localhost:8080にアクセスすると、cAdvisorのインターフェースが表示されます。概要ページ(Overview)には、システム全体のCPUとメモリに関する一般情報が表示されます。各コンテナの詳細を表示するには、左側のサイドバーにある「Containers」タブに移動するだけです。
「Containers」タブでは、アクティブなコンテナのリストが表示されます。任意のコンテナ(例: my-nginxやcadvisor)をクリックすると、その詳細なリソースグラフが表示されます:
- CPU Usage: 時間経過に伴うCPU使用率のグラフです。これにより、ピーク時や異常な時間帯を特定できます。
- Memory Usage: RAMグラフは、コンテナが閾値を超えているか、メモリリークの兆候があるかを示します。
- Network Traffic: ネットワークトラフィックのグラフ。ネットワークI/Oに大きく依存するアプリケーションのデバッグ時に役立つ情報です。
これらのグラフが、docker statsと比較した場合のcAdvisorの強みです。傾向やリソースのピークを簡単に確認できます。そこから、履歴データに基づいて正確な最適化の決定を下すことができます。
リソースを「食い尽くす」コンテナの特定
cAdvisorを使用すると、リソースを「食い尽くす」コンテナの特定がはるかに直感的で簡単になります。コンテナのCPUグラフが長時間にわたって高いレベル(例:80-90%以上)を維持している場合、それは兆候です。同様に、メモリグラフが常に上限(もしあれば)に近づいている場合も明確な警告です。この時点で、あなたは次のことができます:
- そのコンテナのログを確認します。無限ループで実行されているエラーがないか確認します。
- コンテナが安定して動作するためにより多くのリソースを本当に必要とする場合は、リソース(CPU/RAM)の制限を増やすことを検討します。
- コンテナ内のコードまたはアプリケーション構成を最適化します。目的は、リソースの負荷を効果的に軽減することです。
Dockerでパフォーマンスの問題をデバッグする際、特にAPIからのJSONレスポンスやコンテナ設定を分析する必要がある場合、生のJSONを読むのは非常に不快だと感じています。私は常にtoolcraft.app/ja/tools/developer/json-formatterを使ってフォーマットしています。このツールは、cAdvisorや他のAPIからのレスポンスデータをはるかに迅速に理解するのに役立ちます。さらに、追加の拡張機能をインストールする必要がないため、かなりの時間を節約できます。
結論
Dockerコンテナのリソース監視は、Dockerを扱うすべての人にとって不可欠なスキルです。docker statsを使えば、コンテナの現在の状況を素早く確認できます。深い分析が必要な場合、傾向を追跡したり、潜在的な問題を探したりする場合には、cAdvisorが強力なツールとなり、視覚的で詳細な情報を提供します。
この監視を日々のワークフローに組み込みましょう。リソースを「食い尽くす」コンテナを早期に発見し対処することは、アプリケーションの安定性を高めるだけでなく、サーバーコストを大幅に最適化します。今すぐ適用を開始してコンテナをマスターし、システムが常にスムーズに動作するようにしましょう!

