見出し画像

ホスト側からコンテナの動きを探る!straceコマンドを使ったプロセス解析術

コンテナを使っていると、「このコンテナ、ちゃんと動いてるのかな?」とか、「どんな処理が行われているんだろう?」と気になることはありませんか?特にトラブルが発生したときやパフォーマンスが悪く感じるときには、内部で何が起きているのか詳しく調べたくなるものです。

そんなときに役立つのが、ホスト側からコンテナの動きを観察する方法です。この記事では、straceコマンドを使ってコンテナ内のプロセスを詳しく調べる手順をまとめていきます!


(1) まずは対象のコンテナを探す

調査を始めるには、どのコンテナを対象にするかを特定する必要があります。

1. Podの一覧を確認する

現在稼働しているPodの一覧を取得します。

crictl pods -name <pod名>

これでPodのIDや名前、状態などが表示されます。

出力例

POD ID              NAME              NAMESPACE    STATE    CREATED           ATTEMPT
a1b2c3d4e5f6g       example-pod       default      Ready    2023-12-22T10:20  1

この例では、PodのIDはa1b2c3d4e5f6gです。

2. Pod内のコンテナを確認する

次に、特定したPod内で動いているコンテナの情報を表示します。

crictl ps --pod <POD ID>

出力例

CONTAINER ID        IMAGE                  CREATED             STATE        NAME
d7e8f9a0b1c2d       sample-app:v1.0        5 minutes ago       Running      app-container

このコンテナID d7e8f9a0b1c2d をメモしておきます。


(2) コンテナのプロセス詳細をチェックする

コンテナがどんなコマンドや引数で動いているかを確認します。

crictl inspect <CONTAINER ID> | grep args -A1

出力例

"args": [
  "/usr/bin/app", "--config=/etc/app/config.yaml"
]

この例では、プロセスは/usr/bin/appを起動し、設定ファイル/etc/app/config.yamlを使っていることがわかります。


(3) ホスト側でプロセスID(PID)を特定する

次は、ホスト側からこのプロセスのPIDを調べます。

ps aux | grep <プロセス名>

出力例

root     12345  0.0  0.3  11136  3404 ?        S    10:20   0:00 /usr/bin/app --config=/etc/app/config.yaml

この場合、プロセスIDは12345です。


(4) straceでプロセスの動きを観察する

PIDがわかったので、straceコマンドを使ってプロセスのシステムコールを追跡します。

strace -p <PID>

出力例

open("/etc/app/config.yaml", O_RDONLY) = 3
read(3, "settings: enabled\n", 512) = 20
close(3)                               = 0
connect(4, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("93.184.216.34")}, 16) = -1 ECONNREFUSED
write(1, "Error: Connection refused\n", 28) = 28

このログを見れば、設定ファイルを開いて内容を読み込み、その後外部サーバーへの接続を試みたものの拒否されていることがわかります。


(5) トラブルシューティングの実例

ケース1: 設定ファイルが見つからない

たとえば、設定ファイルが見つからない場合は以下のように表示されます。

open("/etc/app/config.yaml", O_RDONLY) = -1 ENOENT (No such file or directory)

この場合、設定ファイルの場所や名前が正しいかを確認して、必要に応じて修正します。

ケース2: ネットワークエラーが発生する

外部への通信に失敗している場合は以下のようなログが表示されます。

connect(4, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("93.184.216.34")}, 16) = -1 ECONNREFUSED

この場合は、ネットワーク設定やファイアウォールのルールに問題がないかを確認します。


まとめ

ホスト側からコンテナの動作を解析するには、以下の手順を踏みます。

  1. Podを特定する - crictl pods

  2. プロセスを確認する - crictl ps --pod <POD ID>

  3. コマンドライン引数を調べる - crictl inspect <CONTAINER ID> | grep args -A1

  4. ホスト側のPIDを特定する - ps aux | grep <プロセス名>

  5. システムコールを追跡する - strace -p <PID>

これらのコマンドを組み合わせることで、コンテナ内部の動作をホスト側から調査できます。設定ファイルやネットワークエラーの特定にも役立つため、トラブルシューティングや動作解析の際にはぜひ活用してみてください!

いいなと思ったら応援しよう!