![見出し画像](https://assets.st-note.com/production/uploads/images/166825763/rectangle_large_type_2_cb189c5a60790df8cdbb3f59f6d4cbba.png?width=1200)
ホスト側からコンテナの動きを探る!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
この場合は、ネットワーク設定やファイアウォールのルールに問題がないかを確認します。
まとめ
ホスト側からコンテナの動作を解析するには、以下の手順を踏みます。
Podを特定する - crictl pods
プロセスを確認する - crictl ps --pod <POD ID>
コマンドライン引数を調べる - crictl inspect <CONTAINER ID> | grep args -A1
ホスト側のPIDを特定する - ps aux | grep <プロセス名>
システムコールを追跡する - strace -p <PID>
これらのコマンドを組み合わせることで、コンテナ内部の動作をホスト側から調査できます。設定ファイルやネットワークエラーの特定にも役立つため、トラブルシューティングや動作解析の際にはぜひ活用してみてください!