Docker — Отладка контейнеров
Эта страница объясняет основные команды Docker, которые используются для диагностики и отладки контейнеров. Здесь разобраны способы посмотреть запущенные контейнеры, проверить их состояние, изучить логи, подключиться внутрь контейнера и выполнить команды для анализа проблемы. Материал рассчитан на начинающих и помогает быстро понять, что происходит внутри контейнера, если приложение работает некорректно.
Когда используется отладка контейнеров
На практике команды из этой страницы используются в следующих ситуациях:
- контейнер не запускается
- сервис падает после старта
- приложение возвращает ошибки
- сервис не отвечает
- контейнер постоянно перезапускается
- нужно проверить что происходит внутри контейнера
Типичный порядок диагностики:
- проверить список контейнеров
- проверить статус контейнера
- посмотреть логи
- зайти внутрь контейнера
- проверить процессы или выполнить команды
Просмотр контейнеров
Показать контейнеры текущего проекта
docker compose ps
Команда показывает контейнеры, которые относятся к текущему docker-compose проекту.
Пример вывода:
NAME IMAGE STATUS PORTS
project_nginx nginx:latest Up 2 hours 0.0.0.0:80->80/tcp
project_php php:8.2-fpm Up 2 hours
Что здесь можно увидеть
- имя контейнера
- используемый образ
- статус контейнера
- проброшенные порты
Когда использовать
Это первая команда, которую стоит выполнить, если нужно проверить:
- запущен ли сервис
- работает ли контейнер
- не упал ли он
Показать все запущенные контейнеры
docker ps
Эта команда показывает все запущенные контейнеры в системе, независимо от проекта.
Пример:
CONTAINER ID IMAGE STATUS PORTS
ab12cd34 nginx Up 2 hours 80/tcp
cd34ef56 redis Up 3 hours 6379/tcp
Чем отличается от docker compose ps
| Команда | Показывает |
|---|---|
docker compose ps |
контейнеры текущего проекта |
docker ps |
все контейнеры на сервере |
Показать все контейнеры (включая остановленные)
docker ps -a
Показывает:
- работающие контейнеры
- остановленные контейнеры
- контейнеры с ошибками
Пример статуса:
Exited (1) 5 minutes ago
Что это означает
Контейнер запустился, но приложение внутри завершилось с ошибкой.
В таком случае следующим шагом нужно посмотреть логи.
Табличный формат вывода
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
Этот формат удобен, если нужно быстро увидеть:
- ID контейнера
- имя
- статус
- порты
Пример вывода:
CONTAINER ID NAMES STATUS PORTS
3acb1234 project_php Up 10 minutes
7d8e5678 project_nginx Up 10 minutes 80/tcp
Просмотр логов контейнеров
Логи — это основной источник информации при отладке.
Именно здесь можно увидеть:
- ошибки приложения
- ошибки запуска
- проблемы подключения к базе
- ошибки конфигурации
Просмотр логов сервиса
docker compose logs <service>
Пример:
docker compose logs nginx
Вывод покажет весь лог контейнера.
Просмотр логов в реальном времени
docker compose logs -f <service>
Флаг -f означает follow — следить за логом в реальном времени.
Пример:
docker compose logs -f php
Это удобно, если:
- вы только что перезапустили сервис
- нужно увидеть новые ошибки
Выход из режима просмотра:
CTRL + C
Показать последние строки логов
docker compose logs --tail=100 <service>
Показывает только последние 100 строк.
Пример:
docker compose logs --tail=100 nginx
Когда использовать
Если контейнер работает давно и лог очень большой.
Логи с временными метками
docker compose logs --timestamps <service>
Пример:
docker compose logs --timestamps php
Вывод будет выглядеть примерно так:
2026-03-11T12:32:10 app started
2026-03-11T12:32:11 connected to database
Это удобно для анализа событий во времени.
Подключение внутрь контейнера
Иногда для диагностики нужно зайти внутрь контейнера, чтобы:
- посмотреть файлы
- проверить конфигурацию
- выполнить команды
- проверить сетевые подключения
Подключиться через shell
docker compose exec <service> sh
Пример:
docker compose exec php sh
После выполнения команды вы окажетесь внутри контейнера.
Использование bash
Если в контейнере установлен bash, можно использовать:
docker compose exec <service> bash
Пример:
docker compose exec php bash
Важно: Не во всех контейнерах есть
bash. Многие минимальные образы используют толькоsh.
Проверить файлы внутри контейнера
После входа можно выполнять обычные команды Linux:
ls
cd
cat
ps
top
Например:
ls /var/www/html
Просмотр процессов внутри контейнера
docker compose top <service>
Пример:
docker compose top php
Команда показывает список процессов внутри контейнера.
Пример вывода:
UID PID CMD
root 123 php-fpm
Когда использовать
Полезно, если:
- приложение зависло
- нужно проверить, запущен ли процесс
- нужно убедиться, что сервис действительно работает
Выполнение команды внутри контейнера
Можно выполнить команду без входа в shell.
Формат:
docker compose exec <service> <command>
Пример:
docker compose exec php php -v
Вывод:
PHP 8.2.4 (cli)
Ещё примеры
Проверить установленные пакеты:
docker compose exec php composer --version
Проверить Node.js:
docker compose exec node node -v
Копирование файлов из контейнера
Иногда нужно забрать файл из контейнера.
Копирование файла из контейнера
docker cp container:/path/file .
Пример:
docker cp project_php:/var/log/php.log .
Файл будет скопирован в текущую папку.
Копирование файла в контейнер
docker cp file container:/path/
Пример:
docker cp config.php project_php:/var/www/config.php
Типичный сценарий диагностики
Если сервис не работает, обычно делают следующее:
1 Проверить контейнеры
docker compose ps
2 Проверить логи
docker compose logs --tail=100
3 Если ошибка не очевидна — подключиться внутрь
docker compose exec php sh
4 Проверить процессы
docker compose top php
5 Проверить приложение вручную
Например:
curl localhost
Полезные советы для новичков
Всегда начинайте диагностику с логов
В большинстве случаев ошибка уже записана в лог.
Не путайте контейнер и сервис
В Compose:
- service — описание контейнера в
docker-compose.yml - container — фактически запущенный экземпляр
Проверяйте статус контейнера
Если статус:
Exited
контейнер уже остановился, и нужно смотреть логи.
Краткая памятка
docker compose ps # контейнеры текущего проекта
docker ps # все запущенные контейнеры
docker ps -a # все контейнеры включая остановленные
docker compose logs <service> # логи сервиса
docker compose logs -f <service> # логи в реальном времени
docker compose logs --tail=100 <service> # последние строки логов
docker compose logs --timestamps <service> # логи с временными метками
docker compose exec <service> sh # войти в контейнер
docker compose exec <service> bash # войти через bash
docker compose exec <service> <command> # выполнить команду
docker compose top <service> # процессы контейнера
docker cp container:/path/file . # копировать из контейнера
docker cp file container:/path/ # копировать в контейнер
No comments to display
No comments to display