docker statsの問題点 — なぜ別のツールが必要なのか
ターミナルを開いてdocker statsと入力すると、数字が延々とスクロールし続ける画面が現れる。特定のコンテナを探したい?フィルターはない。その場でログを確認したい?別のターミナルを開く必要がある。CPUでソートしたい?それもできない。
実際のプロジェクトでDocker Composeを初めて使ったとき、今思えば笑えるような基本的なミスをたくさんしていた。その一つが、特定のコンテナの数値を確認するたびにCtrl+Cしてdocker statsを実行し直すことだった。後になってctopの存在を知り、まさにこの問題を解決してくれるツールだと気づいた。
ctop(container top)は、実行中のすべてのコンテナのメトリクスをリアルタイムで表示するTUI(Terminal UI)インターフェースだ。インタラクティブに操作でき、フィルタリング、ソート、ログ確認まで — すべて一つのターミナル画面で完結する。
5分でctopをインストールして起動する
Linux(バイナリを直接ダウンロード)
最も手軽な方法 — バイナリをダウンロードしてすぐ実行できる。追加インストール不要:
# 最新バイナリをダウンロード(github.com/bcicen/ctopでバージョン確認)
sudo wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 \
-O /usr/local/bin/ctop
# 実行権限を付与
sudo chmod +x /usr/local/bin/ctop
# 動作確認
ctop
sudo権限がない環境(共有VPSなど)で実行する場合は、ローカルディレクトリにダウンロードする:
mkdir -p ~/.local/bin
wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 \
-O ~/.local/bin/ctop
chmod +x ~/.local/bin/ctop
export PATH="$HOME/.local/bin:$PATH" # ~/.bashrcに追加して永続化
macOS
brew install ctop
Dockerで実行(インストール不要)
バイナリをインストールせずにサーバーで一時的に使いたいときに便利な方法:
docker run --rm -ti \
-v /var/run/docker.sock:/var/run/docker.sock \
quay.io/vektorlab/ctop:latest
ctopを初めて起動する
ctopと入力すると、実行中・停止中を問わず、すべてのコンテナがリスト表示される。デフォルトではアクティブなコンテナのみが表示されるので、aを押してすべて表示に切り替えよう。
ctopのインターフェースを理解する
メトリクスの各列
各行は1つのコンテナを表し、以下の列で構成される:
- NAME — コンテナ名
- CID — コンテナIDの先頭12文字
- CPU — CPU使用率(リアルタイム、1秒ごとに更新)
- MEM — 使用RAM / 制限値(
--memoryを設定している場合) - NET RX/TX — コンテナ起動からの受信/送信ネットワーク量
- IO R/W — ディスク読み取り/書き込み
- PIDS — コンテナ内で実行中のプロセス数
CPU列の色は使用率に応じて変化する:緑(低)→ 黄色 → 赤(高)。一目でどのコンテナがリソースを消費しているか分かる。
基本的なキーバインド
| キー | 操作 |
|---|---|
↑ ↓ |
コンテナ間を移動 |
Enter |
シングルコンテナビューを開く(詳細表示) |
l |
選択中のコンテナのログを表示 |
e |
コンテナにシェルで入る(exec -it bash) |
s |
コンテナを停止 |
r |
コンテナを再起動 |
a |
停止済みコンテナの表示/非表示を切り替え |
f |
コンテナ名でフィルター |
H |
ヘッダーの表示/非表示を切り替え |
q |
終了 |
高度な機能
任意の列でソート
oを押すとソート列の選択メニューが開く。CPUまたはMEMでソートすると、どのコンテナがリソースを消費しているかがすぐに分かる:
Sort options:
[c] cpu [m] mem [n] net [b] block io
[p] pids [N] name [s] state
選択後、リストは自動的にソートされ、リアルタイムの値に応じて継続的に更新される。
シングルコンテナビュー
コンテナを選択してEnterを押すと、ctopはCPUとMEMのスパークラインチャートを表示する詳細画面に切り替わる。ここからlを押せば、画面を抜けることなくログのストリーミングをリアルタイムで確認できる。
コンテナ名でフィルター
fを押してキーワードを入力すると、ctopはコンテナ名をリアルタイムでフィルタリングする。例えばnginxと入力すると、名前に「nginx」を含むコンテナのみが表示される。Escを押してフィルターをクリアできる。
CLIオプションで起動
# 実行中のコンテナのみ表示(停止済みを除外)
ctop -a
# 起動時からメモリでソート
ctop -s mem
# TCP socketで別のDockerホストに接続
ctop -H tcp://192.168.1.100:2375
# メトリクスをJSONファイルにエクスポート(スクリプト用)
ctop -json 2>/dev/null | head -20
Dockerリモートホストに接続
複数のVPSを管理する際によく使う機能で、ローカルマシンでctopを実行しながらサーバー上のDockerを監視できる:
# サーバー側でDocker TCP socketを有効化する必要がある
# /etc/docker/daemon.json:
# { "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }
# ローカルマシンから接続
export DOCKER_HOST=tcp://your-server-ip:2375
ctop
セキュリティの注意: TCP socketは暗号化されていないため、内部ネットワーク内またはSSHトンネル経由でのみ使用すること。本番環境ではSSHトンネルを使うこと:
# まずSSHトンネルを作成
ssh -L 2375:localhost:2375 user@your-server -N &
# その後に接続
export DOCKER_HOST=tcp://localhost:2375
ctop
実践的なTips
ctop vs docker stats vs Portainerの使い分け
- docker stats: シンプルな出力で非インタラクティブ。スクリプトへのパイプやログ記録に適している
- ctop: インタラクティブなTUI。ターミナルでの素早いデバッグや監視に最適
- Portainer: フル機能のWeb UI。長期管理やチームでの利用に適している。Portainerのセットアップについては別の記事を参照してほしい。
この3つのツールは排他的ではない。サーバーにSSH接続中に問題のあるコンテナをすぐに確認したいときはctopを使い、定期的な管理はブラウザでPortainerを使うという使い方をしている。
ctopでメモリリークをデバッグする
コンテナのメモリリークが疑われる場合は、ctopを開いてMEMでソート(o → m)し、5〜10分ほど画面を見続ける。そのコンテナのMEM列が一定して増加し続けて下がらない場合は、ほぼ確実にリークが発生している。そこからEnterを押して詳細ビューに入り、時系列のMEMグラフでより明確に確認できる。
便利なエイリアス
# ~/.bashrcまたは ~/.zshrcに追加
alias dps='ctop' # 通常のdocker psの代替
alias ctop-cpu='ctop -s cpu' # CPU順でソートして起動
alias ctop-mem='ctop -s mem' # メモリ順でソートして起動
ctopを終了せずにログをすばやく確認
よく使うワークフロー:ctopを起動 → CPUスパイクが異常なコンテナを見つける → Enterを押す → lを押す → ログをリアルタイムで確認。新しいターミナルを開く必要も、長いコンテナIDを入力する必要もない。確認が終わったらqを押してリストに戻る。
tmuxセッションでctopを実行する
本番VPSでは、ctopを専用のtmuxウィンドウで常駐させておくことが多い:
# "monitor"という名前のtmuxセッションを作成
tmux new-session -d -s monitor -n ctop
tmux send-keys -t monitor:ctop 'ctop' Enter
# いつでもアタッチできる
tmux attach -t monitor
ctopは一度使ったら、もうdocker statsには戻れないと思わせるツールの一つだ。インストールは30秒、コンテナのデバッグのたびに何分もの時間を節約できる。
