docker stats で「このコンテナがCPU食ってる/メモリ増えてる」は分かっても、次に知りたいのは “中で何が動いてるのか?” です。
そこで活躍するのが docker top <container>。
- コンテナ内の プロセス一覧(PID / コマンド / CPU など) をホスト側から確認できる
- “その場で”状態を把握でき、障害調査の初動が速くなる
docker execで中に入らなくても、まず状況を掴める
この記事では、docker top の基本から、実務の調査パターン、ハンズオンまでまとめます。
docker top とは?
docker top <container> は、指定コンテナ内で動いているプロセスを表示します。
docker top <container>
これは「コンテナの中の ps コマンド相当」と考えると分かりやすいです。
表示される列(UID/PID/CPU/TIME/CMD など)は環境依存ですが、少なくとも PID と CMD が見えれば調査に十分役立ちます。
いつ使う?(実務で刺さる場面)
1) docker stats で “重いコンテナ” を見つけた後
docker stats→ どのコンテナが負荷高いか特定docker top→ そのコンテナの中で、どのプロセスが動いているか確認
2) “想定外のプロセス” が走っていないか確認したい
- 余計なデーモン
- バッチが暴走
- 意図しないコマンドが残っている
3) PIDが急増している(PIDSが増えている)
- ワーカー/スレッド/子プロセスが増えすぎている可能性
→docker topで「増えている実体」を確認する
docker top の基本的な使い方
1) コンテナ名を指定して表示
docker top web1
2) ps のオプションを渡して表示内容を変える
docker top は内部的に ps に近い表示をします。多くの環境で、ps オプションを追加できます。
例:よく使う列だけ(PID / CPU / MEM / CMD)
docker top web1 -eo pid,ppid,pcpu,pmem,etime,cmd
例:ツリーっぽく見たい(環境による)
docker top web1 -ef
※ どの ps オプションが使えるかはOS/環境で差があります。通らない場合は、まず素の docker top で確認してください。
ハンズオン:docker top を“使える”状態にする
ここからは、意図的にプロセスを増やしたり、CPUを使わせたりして、docker top で見えることを確認します。
0) 事前準備:検証用コンテナを起動
A) Nginx(常駐プロセスが分かりやすい)
docker run -d --name web-top -p 8081:80 nginx:alpine
B) Alpine(複数プロセスをわざと起動する)
docker run -d --name proc-top alpine:3.20 sh -c "sleep 999999"
1) docker top で “中のプロセス” を確認する
Nginx を見る
docker top web-top
Nginx 系だと、以下のようなイメージのプロセスが見えます(環境により表示は変わります)。
- master プロセス(親)
- worker プロセス(子)
Alpine を見る
docker top proc-top
sleep が1つ見えるはずです。
2) コンテナ内でプロセスを増やして “増え方” を確認する
docker exec で中でバックグラウンドプロセスを複数起動します。
docker exec proc-top sh -c "sleep 1000 & sleep 1000 & sleep 1000 &"
もう一度 docker top。
docker top proc-top
sleep が複数見えるはずです。
この感覚が大事で、実務でも「PIDS増えてるけど何が増えてる?」を即確認できます。
3) CPUを燃やすプロセスを起動して “犯人” を見つける
CPUを使う yes を起動します。
docker exec proc-top sh -c "yes > /dev/null &"
ここで、別ターミナルで docker stats を見ると proc-top の CPU が上がります。
docker stats proc-top
次に docker top に戻ります。
docker top proc-top
yes が見えるはずです。
これが「重いコンテナの中で、どのコマンドが動いているか」を突き止める一連の流れです。
実務テンプレ:docker stats → docker top → 次の一手
1) まず負荷を特定
docker stats --no-stream
2) 重いコンテナの中身を確認
docker top <container>
3) プロセスの詳細が欲しい場合
docker execでps aux/top/apk add procps(Alpine)など- もしくはアプリのログ、メトリクス、APMで絞る
よくある落とし穴(重要)
1) docker top では “スレッド詳細” までは分かりにくい
マルチスレッド(例:Java、Nodeのワーカなど)はプロセス数が少なく見えることがあります。
その場合は docker exec で top やアプリ側メトリクスを併用します。
2) Alpine には ps の詳細機能が少ないことがある
ps オプションが足りない場合、procps を入れると改善します(検証用)。
docker exec proc-top sh -c "apk add --no-cache procps"
後片付け(ハンズオン削除)
docker rm -f web-top proc-top
コメントを残す