Docker
Отладка контейнера
Поиск…
Синтаксис
- docker stats [ОПЦИИ] [КОНТЕЙНЕР ...]
- докерные журналы [ОПЦИИ] КОНТЕЙНЕР
- докерный верх [ОПЦИИ] КОНТЕЙНЕР [ps OPTIONS]
Вход в рабочий контейнер
Для выполнения операций в контейнере используйте команду docker exec
. Иногда это называется «входом в контейнер», поскольку все команды выполняются внутри контейнера.
docker exec -it container_id bash
или же
docker exec -it container_id /bin/sh
И теперь у вас есть оболочка в вашем запущенном контейнере. Например, перечислите файлы в каталоге и выйдите из контейнера:
docker exec container_id ls -la
Вы можете использовать -u flag
для входа в контейнер с определенным пользователем, например uid=1013
, gid=1023
.
docker exec -it -u 1013:1023 container_id ls -la
Uid и gid не должны существовать в контейнере, но команда может привести к ошибкам. Если вы хотите запустить контейнер и немедленно войти внутрь, чтобы что-то проверить, вы можете сделать
docker run...; docker exec -it $(docker ps -lq) bash
команда docker ps -lq
выводит только идентификатор последнего (контейнера l -lq
). (это предполагает, что у вас есть bash как интерпретатор, доступный в вашем контейнере, у вас может быть sh или zsh или любой другой)
Мониторинг использования ресурсов
Проверка использования ресурсов системы - эффективный способ поиска неверных приложений. Этот пример является эквивалентом традиционной top
команды для контейнеров:
docker stats
Чтобы следить за статистикой конкретных контейнеров, перечислите их в командной строке:
docker stats 7786807d8084 7786807d8085
Статистика Docker отображает следующую информацию:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
7786807d8084 0.65% 1.33 GB / 3.95 GB 33.67% 142.2 MB / 57.79 MB 46.32 MB / 0 B
По умолчанию docker stats
отображает идентификатор контейнеров, и это не очень полезно, если вы предпочитаете отображать имена контейнера, просто выполните
docker stats $(docker ps --format '{{.Names}}')
Процессы мониторинга в контейнере
Проверка использования ресурсов системы - эффективный способ сузить проблему в реальном приложении. Этот пример является эквивалентом традиционной команды ps
для контейнеров.
docker top 7786807d8084
Чтобы отфильтровать формат вывода, добавьте опции ps
в командной строке:
docker top 7786807d8084 faux
Или, чтобы получить список процессов, выполняемых как root, что является потенциально опасной практикой:
docker top 7786807d8084 -u root
Команда docker top
оказывается особенно полезной при поиске минималистических контейнеров без оболочки или команды ps
.
Прикрепите к работающему контейнеру
«Присоединение к контейнеру» - это действие запуска терминального сеанса в контексте, в котором работает контейнер (и любые его программы). Это в основном используется для целей отладки, но может также потребоваться, если конкретные данные должны быть переданы программам, запущенным в контейнере.
Для этого используется команда attach
. Он имеет этот синтаксис:
docker attach <container>
<container>
может быть либо идентификатором контейнера, либо именем контейнера. Например:
docker attach c8a9cf1a1fa8
Или же:
docker attach graceful_hopper
Вы , возможно , потребуются sudo
выше команда, в зависимости от пользователя и как докер устанавливаются.
Примечание. Attach only позволяет одновременно подключать один сеанс оболочки к контейнеру.
Предупреждение: все ввод клавиатуры будет отправлен в контейнер. Нажатие Ctrl-c убьет ваш контейнер.
Чтобы отсоединиться от прикрепленного контейнера, последовательно нажмите Ctrl-p, затем Ctrl-q
Чтобы подключить несколько сеансов оболочки к контейнеру или просто как альтернативу, вы можете использовать exec
. Использование идентификатора контейнера:
docker exec -i -t c8a9cf1a1fa8 /bin/bash
Использование имени контейнера:
docker exec -i -t graceful_hopper /bin/bash
exec
запускает программу внутри контейнера, в этом случае /bin/bash
(оболочка, предположительно одна из которых имеет контейнер). -i
указывает на интерактивный сеанс, в то время как -t
выделяет псевдо-TTY.
Примечание. В отличие от attach , нажатие Ctrl-c завершает команду exec 'd при запуске в интерактивном режиме.
Печать журналов
Следуя журналам, это менее навязчивый способ отладки в реальном времени приложения. В этом примере воспроизводится поведение традиционного tail -f some-application.log
на контейнере 7786807d8084
.
docker logs --follow --tail 10 7786807d8084
Эта команда в основном показывает стандартный вывод процесса контейнера (процесс с pid 1).
Если ваши журналы не включают в себя --timestamps
метку, вы можете добавить флаг --timestamps
.
Можно просмотреть журналы остановленного контейнера, либо
запустите неудачный контейнер с
docker run ... ; docker logs $(docker ps -lq)
найти идентификатор или имя контейнера
docker ps -a
а потом
docker logs container-id
или
docker logs containername
так как можно просмотреть журналы остановленного контейнера
Отладка процесса контейнера докеров
Docker - просто причудливый способ запуска процесса, а не виртуальная машина. Поэтому отладка процесса «в контейнере» также возможна «на хосте», просто исследуя выполняемый процесс контейнера как пользователя с соответствующими разрешениями для проверки этих процессов на хосте (например, root). Например, можно указать каждый «контейнерный процесс» на хосте, запустив простой ps
как root:
sudo ps aux
Любые текущие контейнеры Docker будут перечислены в выводе.
Это может быть полезно при разработке приложений для отладки процесса, выполняющегося в контейнере. Как пользователь с соответствующими разрешениями, типичные утилиты отладки могут использоваться в контейнерном процессе, такие как strace, ltrace, gdb и т. Д.