Как подключиться к Docker контейнеру с помощью nsenter

К заметкам на тему дебага Docker контейнеров, когда мы к ним цепляемся и запускаем различные утилиты, были комментарии на тему того, что можно просто подключиться к пространству имён (namespace) контейнера с хоста и запустить всё, что нужно.

Мне лично идея со специальными контейнерами кажется более удобной, потому что там все инструменты уже собраны и на сам хост ничего ставить не надо. Но для полноты картины расскажу и про способ с namespaces. Там всё очень просто.

Узнаём PID процесса в контейнере nginx:

# docker inspect -f '{{ .State.Pid }}' nginx

1009

Запускаем нужную нам утилиту в пространстве контейнера:

# nsenter -n -t 1009 netstat -tulnp

Соответственно, видим процесс nginx, слушающий 80-й порт.

nsenter

Так можно любую утилиту с хоста запустить. Вот вариант в одну строку:

# nsenter -n -t $(docker inspect -f '{{ .State.Pid }}' nginx) ip a

Сразу увидели ip адрес контейнера. Это то же самое, что:

# docker inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' nginx

Какую команду проще и быстрее запомнить, судить не берусь. Правда, конкретно с IP я смотрю вот так:

# docker inspect nginx | grep IP

Сразу видно адрес. Думаю, идею поняли. Вот ещё пример. Надо посмотреть, как и через какой dns контейнер резолвит домены:

# nsenter -n -t $(docker inspect -f '{{ .State.Pid }}' nginx) dig ya.ru MX

Не нужны никакие дополнительные настройки и инструменты. Всё работает с хоста, где запущены контейнеры.