2016-10-31 5 views
11

Я хотел бы выполнить netstat внутри контейнера докеров, чтобы увидеть открытые TCP-сокеты и их статусы. Но, на некоторых из моих докерных контейнеров, netstat недоступен. Есть ли способ получить открытые сокеты (и их статусы и какие IP-адреса они подключены, если они есть) без использования netstat, через какой-либо API докеров? (BTW, мой контейнер использует docker-proxy, то есть не напрямую связан с мостом)Docker: любой способ перечислить открытые сокеты внутри работающего контейнера докеров?

Я думаю, что я мог бы посмотреть файловую систему/proc напрямую, но в этот момент я мог бы также добавить docker 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" 

(nsenter является частью util-linux пакета)

+0

Спасибо! Это отлично работает! – AdvilUser

+0

Это решение применимо для других платформ, таких как windows, mac и т. Д.,? – Rao

+0

@Rao, возможно: 'nsenter' - это команда Linux, поэтому вам нужно будет войти в виртуальную машину Linux, которая фактически используется для размещения ваших контейнеров Docker. И, конечно же, для этой виртуальной машины потребуется команда 'nsenter'. – larsks

Смежные вопросы