Если вам нужно продебажить какой-то контейнер, в котором нет никаких инструментов для диагностики (а это почти всегда так), то для этого можно воспользоваться специально собранным для этих целей контейнером - Network-Multitool. Его ещё любят в кубернетисе запускать для отладки. Известная штука.
Работает он примерно так. Запускаем контейнер, внутри которого ничего нет, кроме nginx:
Подключаем к нему network-multitool:
Дальше всё остальное можно запускать: ping, dig, tcpdump и т.д.
Я тут выбрал самую жирную сборку alpine-extra, где максимальный набор инструментов, в том числе tshark, ApacheBench, mysql & postgresql client, git и т.д. Если всё это не надо, то используйте alpine-minimal. Описание сборок в репозитории.
Похожую функциональность имеет cdebug. У него принцип работы такой же, только он для удобства собран в бинарник. А подключается он к контейнерам точно так же.
Кстати, с помощью network-multitool можно и хост дебажить, если не хочется его засорять различными утилитами. Запускаем его в сети хоста и пользуемся:
На хост ничего ставить не надо. Полезная штука, берите на вооружение.
#docker #devops
Работает он примерно так. Запускаем контейнер, внутри которого ничего нет, кроме nginx:
# docker run --name nginx -d -p 8080:80 nginx# docker exec -it nginx bash# ps axfbash: ps: command not foundПодключаем к нему network-multitool:
# docker run --rm -it \ --network=container:nginx \ --pid container:nginx \wbitt/network-multitool:alpine-extra bash# ps axf PID TTY STAT TIME COMMAND 47 pts/0 Ss 0:00 bash 60 pts/0 R+ 0:00 \_ ps axf 1 ? Ss 0:00 nginx: master process nginx -g daemon off; 29 ? S 0:00 nginx: worker process 31 ? S 0:00 nginx: worker process 30 ? S 0:00 nginx: worker process 32 ? S 0:00 nginx: worker processДальше всё остальное можно запускать: ping, dig, tcpdump и т.д.
Я тут выбрал самую жирную сборку alpine-extra, где максимальный набор инструментов, в том числе tshark, ApacheBench, mysql & postgresql client, git и т.д. Если всё это не надо, то используйте alpine-minimal. Описание сборок в репозитории.
Похожую функциональность имеет cdebug. У него принцип работы такой же, только он для удобства собран в бинарник. А подключается он к контейнерам точно так же.
Кстати, с помощью network-multitool можно и хост дебажить, если не хочется его засорять различными утилитами. Запускаем его в сети хоста и пользуемся:
# docker run --rm -it --network=host wbitt/network-multitool:alpine-extra bash# tcpdumpНа хост ничего ставить не надо. Полезная штука, берите на вооружение.
#docker #devops
👍185👎1
К обоим заметкам на тему дебага Docker контейнеров, когда мы к ним цепляемся и запускаем различные утилиты, были комментарии на тему того, что можно просто подключиться к пространству имён (namespace) контейнера с хоста и запустить всё, что нужно. Вот мои прошлые заметки по этой теме:
- Network-Multitool
- Cdebug
Мне лично идея со специальными контейнерами кажется более удобной, потому что там все инструменты уже собраны и на сам хост ничего ставить не надо. Но для полноты картины расскажу и про способ с namespaces. Там всё очень просто.
Узнаём PID процесса в контейнере nginx:
Запускаем нужную нам утилиту в пространстве контейнера:
Соответственно, видим процесс nginx, слушающий 80-й порт. Так можно любую утилиту с хоста запустить. Вот вариант в одну строку:
Сразу увидели ip адрес контейнера. Это то же самое, что:
Какую команду проще и быстрее запомнить, судить не берусь. Правда, конкретно с IP я смотрю вот так:
Сразу видно адрес. Думаю, идею поняли. Вот ещё пример. Надо посмотреть, как и через какой dns контейнер резолвит домены:
Вообще, про nsenter и в целом про namespaces имеет смысл отдельную заметку написать. Думаю, сделаю это в ближайшее время.
#docker
- Network-Multitool
- Cdebug
Мне лично идея со специальными контейнерами кажется более удобной, потому что там все инструменты уже собраны и на сам хост ничего ставить не надо. Но для полноты картины расскажу и про способ с namespaces. Там всё очень просто.
Узнаём PID процесса в контейнере nginx:
# docker inspect -f '{{ .State.Pid }}' nginx1009Запускаем нужную нам утилиту в пространстве контейнера:
# nsenter -n -t 1009 netstat -tulnpСоответственно, видим процесс nginx, слушающий 80-й порт. Так можно любую утилиту с хоста запустить. Вот вариант в одну строку:
# 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Вообще, про nsenter и в целом про namespaces имеет смысл отдельную заметку написать. Думаю, сделаю это в ближайшее время.
#docker
👍76👎1