docker top 入門:コンテナ内プロセスを確認して原因を特定する

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 execps aux / top / apk add procps(Alpine)など
  • もしくはアプリのログ、メトリクス、APMで絞る

よくある落とし穴(重要)

1) docker top では “スレッド詳細” までは分かりにくい

マルチスレッド(例:Java、Nodeのワーカなど)はプロセス数が少なく見えることがあります。
その場合は docker exectop やアプリ側メトリクスを併用します。

2) Alpine には ps の詳細機能が少ないことがある

ps オプションが足りない場合、procps を入れると改善します(検証用)。

docker exec proc-top sh -c "apk add --no-cache procps"

後片付け(ハンズオン削除)

docker rm -f web-top proc-top

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です