実行中のdockerコンテナ内でnetstatを実行して、開いているTCPソケットとそのステータスを確認したいと思います。しかし、私のdockerコンテナのいくつかでは、netstatは利用できません。何らかのドッカーAPIを介して、netstatを使用せずに、開いているソケット(およびそのステータス、および接続されているIPアドレスがある場合)を取得する方法はありますか? (ところで、私のコンテナはdocker-proxyを使用しています-つまり、直接ブリッジされていません)
/ procファイルシステムを直接見ることができたと思いますが、その時点で、cp netstatをコンテナーにドッキングして実行することもできます。港湾労働者がこれを提供する施設があるかどうか疑問に思っていました。
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"
(nsenter
はutil-linux
パッケージの一部です)
@larsksからの2つのコマンドは1ライナーにマージされて回答します-PIDをコピーして貼り付ける必要はありません(container_name_or_id
を置き換えるだけです):
Sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat
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