2016-10-31 9 views
11

開いているTCPソケットとその状態を確認するために、実行中のドッカーコンテナ内でnetstatを実行したいとします。しかし、私のドッカーコンテナのいくつかでは、netstatは利用できません。いくつかのドッカーAPIを介して、netstatを使用せずにオープンソケット(およびそれらのステータス、およびそれらが接続されているIPアドレス)を取得する方法はありますか? (私のコンテナはドッカープロキシを使用しています。つまり、直接ブリッジされていません)Docker:実行中のドッカー・コンテナ内にオープン・ソケットをリストする方法はありますか?

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

答えて

30

nsenterコマンドを使用して、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" 

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

+0

ありがとう!これは素晴らしい作品です! – AdvilUser

+0

このソリューションは、Windows、Macなどの他のプラットフォームにも適用できますか? – Rao

+0

@Rao、おそらく: 'nsenter'はLinuxコマンドなので、Dockerコンテナをホストするために実際に使用されているLinux VMにログインできる必要があります。もちろん、そのVMは 'nsenter'コマンドを利用できるようにする必要があります。 – larsks

関連する問題