2016-10-31 42 views
11

Chciałbym wykonać netstat wewnątrz działającego kontenera dokera, aby zobaczyć otwarte gniazda TCP i ich statusy. Ale w niektórych moich kontenerach dokowania netstat nie jest dostępny. Czy istnieje sposób na uzyskanie otwartych gniazd (i ich statusów oraz adresów IP, z którymi są połączone) bez użycia netstat, za pośrednictwem jakiegoś API dookola? (BTW, mój kontener używa docker-proxy - to znaczy, nie jest bezpośrednio mostkowany)Docker: czy można wyświetlić listę otwartych gniazd wewnątrz działającego kontenera dokowanego?

Chyba mógłbym spojrzeć na system plików/proc bezpośrednio, ale w tym momencie mógłbym równie dobrze dokować cp netstat do kontenera i wykonać to. Zastanawiałem się, czy istniała jakakolwiek infrastruktura, która mogłaby zapewnić to dokowanie.

Odpowiedz

30

Możesz użyć polecenia nsenter, aby uruchomić polecenie na hoście w obszarze nazw sieci w kontenerze Docker. Po prostu PID kontenera Docker:

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

Na przykład w moim systemie:

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

A skoro masz PID, używać tego jako argumentu do (-t) opcja docelowej nsenter. Na przykład, aby uruchomić netstat wewnątrz przestrzeni nazw sieci pojemnik:

$ 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  

Zauważ, że to działa, mimo że pojemnik nie posiada netstat zainstalowane:

$ 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 jest częścią pakietu util-linux)

+0

Dzięki! Działa to świetnie! – AdvilUser

+0

Czy to rozwiązanie ma zastosowanie do innych platform, takich jak okna, mac itp.? – Rao

+0

@Rao, być może: 'nsenter' jest poleceniem dla systemu Linux, więc musisz mieć możliwość zalogowania się do maszyny wirtualnej Linux, która jest aktualnie używana do hostowania kontenerów Docker. Oczywiście VM musiałaby mieć dostępne polecenie 'nsenter'. – larsks