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

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

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

Ответ 1

Вы можете использовать команду 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)

Ответ 2

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

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

Ответ 3

сервер: докер контейнер 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