Вход в контейнер и логи

Как заглянуть внутрь работающего контейнера и прочитать его логи при отладке.

docker exec запускает команду внутри уже работающего контейнера; docker logs показывает его вывод.

Просмотр логов: docker logs

Когда контейнер работает в фоне (-d), его вывод не виден в терминале. Прочитать его можно командой docker logs:

docker logs my-web

Чтобы следить за логами в реальном времени, как tail -f, добавьте -f (follow):

docker logs -f my-web

Показать только последние строки помогает --tail:

docker logs --tail 20 my-web

Логи — первое, куда смотрят, когда контейнер не работает как ожидалось или сразу падает.

Выполнение команды внутри: docker exec

Иногда нужно заглянуть внутрь работающего контейнера. Команда docker exec выполняет что-либо внутри него. Например, посмотреть содержимое директории:

docker exec my-web ls /usr/share/nginx/html

Интерактивная оболочка внутри контейнера

Чаще всего exec используют, чтобы попасть в интерактивную оболочку работающего контейнера — для отладки. Добавляем -it и запускаем оболочку:

docker exec -it my-web bash

Вы окажетесь внутри контейнера и сможете ходить по файловой системе, смотреть конфиги, проверять переменные окружения. Выйти — командой exit; сам контейнер при этом продолжит работать (в отличие от выхода из docker run -it).

В минимальных образах bash может отсутствовать — тогда используют sh:

docker exec -it my-web sh

run против exec

КомандаЧто делает
docker runсоздаёт новый контейнер из образа
docker execвыполняет команду в уже работающем контейнере

Итог

  • docker logs ИМЯ показывает вывод контейнера, с -f — в реальном времени.
  • docker exec -it ИМЯ bash открывает оболочку внутри работающего контейнера.
  • exec работает с существующим контейнером, а run создаёт новый.
Проверьте себя
1. Какой командой посмотреть вывод (логи) работающего в фоне контейнера?
Adocker output my-web
Bdocker logs my-web
Cdocker exec my-web
Ddocker ps my-web
2. Что делает docker exec -it my-web bash?
AСоздаёт новый контейнер из образа bash
BОткрывает интерактивную оболочку bash внутри работающего контейнера my-web
CОстанавливает контейнер my-web
DПоказывает логи контейнера
3. Чем docker exec отличается от docker run?
AНичем, это синонимы
Bexec выполняет команду в уже работающем контейнере, а run создаёт новый
Cexec создаёт новый контейнер, а run входит в существующий
Dexec работает только с образами
Поддержать проект