web-dev-qa-db-ja.com

Docker:実行中のdockerコンテナー内で開いているソケットをリストする方法はありますか?

実行中のdockerコンテナ内でnetstatを実行して、開いているTCPソケットとそのステータスを確認したいと思います。しかし、私のdockerコンテナのいくつかでは、netstatは利用できません。何らかのドッカーAPIを介して、netstatを使用せずに、開いているソケット(およびそのステータス、および接続されているIPアドレスがある場合)を取得する方法はありますか? (ところで、私のコンテナはdocker-proxyを使用しています-つまり、直接ブリッジされていません)

/ procファイルシステムを直接見ることができたと思いますが、その時点で、cp netstatをコンテナーにドッキングして実行することもできます。港湾労働者がこれを提供する施設があるかどうか疑問に思っていました。

35
AdvilUser

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

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

たとえば、私のシステムでは:

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

そして、PIDを取得したら、それをnsenterのターゲット(-t)オプションの引数として使用します。たとえば、コンテナネットワーク名前空間内で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"

nsenterutil-linuxパッケージの一部です)

82
larsks

@larsksからの2つのコマンドは1ライナーにマージされて回答します-PIDをコピーして貼り付ける必要はありません(container_name_or_idを置き換えるだけです):

Sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat

8
mikatuo

server:docker container ls

CONTAINER ID    IMAGE              COMMAND                  CREATED          STATUS           PORTS       NAMES

80acfa804b59    admirito/gsad:10   "docker-entrypoint.s…"   18 minutes ago   Up 10 minutes    80/tcp      gvmcontainers_gsad_1
0
Anony