2016-10-31 7 views
11

열려있는 TCP 소켓과 그 상태를보기 위해 실행중인 도커 컨테이너 안에 netstat을 실행하고 싶습니다. 그러나 일부 도커 컨테이너에서는 netstat을 사용할 수 없습니다. 일부 도커 API를 통해 netstat를 사용하지 않고 열린 소켓 (및 해당 상태, 그리고 IP가 연결된 경우 IP 주소)을 얻을 수있는 방법이 있습니까? (BTW, 내 컨테이너는 도커 프록시를 사용합니다. 즉, 직접 연결된 것이 아닙니다.)Docker : 실행중인 도커 컨테이너 안에 열린 소켓을 나열하는 방법은 무엇입니까?

나는/proc 파일 시스템을 직접 볼 수 있지만 그 시점에서 컨테이너에 도킹 프로그램 cp netstat를 넣고 실행할 수도 있습니다. 그것. 도커가 제공 할 수있는 시설이 있는지 궁금합니다.

답변

30

nsenter 명령을 사용하여 Docker 컨테이너의 네트워크 네임 스페이스 내부에서 명령을 실행할 수 있습니다. 내 시스템에 예를 들어

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

, :

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

을 그리고 당신이 PID를하면, 대상 (-t) 옵션에 인수로 것을 사용 그냥 도커 컨테이너의 PID를 얻을 수 nsenter. 예를 들어, 컨테이너 네트워크 네임 스페이스 내에서 netstat를 실행합니다 :

이 컨테이너가 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  

주의 사항 :

$ 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