1. ホーム
  2. docker

[解決済み] Docker: 実行中のDockerコンテナ内のオープンソケットをリストアップする方法はありますか?

2023-05-01 16:07:11

質問

実行中の docker コンテナ内で netstat を実行して、開いている TCP ソケットとその状態を確認したいと思います。しかし、私の docker コンテナのいくつかでは、netstat は利用できません。netstat を使わずに、docker API を使ってオープンソケット(とその状態、もしあればどの IP アドレスに接続されているか)を取得する方法はないでしょうか?(ちなみに、私のコンテナは docker-proxy を使用しており、直接ブリッジしていません)。

proc ファイルシステムを直接見ることはできると思いますが、その時点では、docker cp netstat をコンテナに入れて実行したほうがよいかもしれません。私は、docker がこのために提供するような機能があるかどうか疑問に思っていました。

どのように解決するのでしょうか?

を使用することができます。 nsenter コマンドを使用すると、Dockerコンテナのネットワーク名前空間内のホスト上でコマンドを実行することができます。 DockerコンテナのPIDを取得するだけです。

docker inspect -f '{{.State.Pid}}' container_name_or_id

例えば、私のシステムで

$ docker inspect -f '{{.State.Pid}}' c70b53d98466
15652

そして、PIDを取得したら、それをターゲットの引数として使用します( -t ) オプションの引数として使用します。 nsenter . 例えば netstat をコンテナ・ネットワーク名前空間内で実行します。

$ sudo nsenter -t 15652 -n netstat
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     

コンテナに netstat がインストールされていなくても動作することに注意してください。

$ docker exec -it c70b53d98466 netstat
rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"exec: \\\"netstat\\\": executable file not found in $PATH\"\n"

( nsenter の一部である util-linux パッケージ)