Docker: есть ли способ перечислить открытые сокеты внутри работающего контейнера Docker?

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

Думаю, я мог бы посмотреть на файловую систему /proc напрямую, но в этот момент я мог бы с таким же успехом закрепить cp netstat в контейнере и выполнить его. Мне было интересно, есть ли какие-либо средства, которые докер может предоставить для этого.


person AdvilUser    schedule 31.10.2016    source источник


Ответы (4)


Вы можете использовать команду nsenter для запуска команды на своем хосте внутри сетевого пространства имен контейнера Docker. Просто получите PID вашего контейнера Docker:

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)

person larsks    schedule 31.10.2016
comment
Подходит ли это решение для других платформ, таких как Windows, Mac и т. д.? - person Rao; 01.11.2016
comment
@Rao, возможно: nsenter — это команда Linux, поэтому вам нужно будет войти в виртуальную машину Linux, которая фактически используется для размещения ваших контейнеров Docker. И, конечно же, на этой виртуальной машине должна быть доступна команда nsenter. - person larsks; 01.11.2016
comment
вы можете использовать этот фрагмент, чтобы получить весь netstat для всех докеров " title="при использовании докера установленные соединения не отображаются в netstat"> stackoverflow.com/questions/37171909/ - person thibault ketterer; 15.03.2018
comment
На узле AWS EKS я являюсь пользователем root, но получаю: sudo nsenter -t 14207 -n netstat возвращает nsenter: cannot open /proc/14207/ns/net: No such file or directory. Я вижу путь, о котором он говорит, что он не существует, но, кажется, не могу ничего сделать, чтобы допросить его. Кто-нибудь сталкивался с этим? - person John Humphreys; 21.04.2021

Две команды из ответа @larsks объединены в одну строку — не нужно копировать и вставлять PID (просто замените container_name_or_id):

sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat
person mikatuo    schedule 06.11.2018
comment
Примечание: нужно добавить еще один sudo, чтобы команда была ... $(sudo docker inspect ..., иначе команда завершится ошибкой, если она не будет запущена в корневой оболочке. - person ascendants; 11.06.2021

Если у вас установлен пакет iproute2, вы можете использовать

sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n ss

or

sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n ss -ltu

Он покажет TCP и UDP

person Yogesh Yadav    schedule 02.02.2021

сервер: докер-контейнер 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
person Anony    schedule 27.06.2019
comment
это не верно. это будет только пять портов, которые либо объявлены Dockerimage, либо те, которые были явно открыты (в обоих случаях не имеет значения, действительно ли процесс контейнера прослушивает...) - person Martin Rauscher; 21.12.2019