Отладка контейнеров
Цель: Научиться находить и чинить 3 типа проблем: падающий контейнер, сетевая недоступность, потерянные файлы. Практика на сломанных примерах.
В реальной жизни контейнеры падают. В этом уроке мы специально “сломаем” контейнеры и научимся их чинить, используя инструменты диагностики.
Сценарий 1: Контейнер падает сразу после старта
Попробуем запустить “сломанный” образ.
-
Запустите:
docker run -d --name broken-app alpine:3.18 sh -c "echo Starting... && sleep 1 && exit 1" -
Проверьте статус:
docker ps -a # STATUS: Exited (1) ... -
Диагностика:
- Смотрим логи:
docker logs broken-app. Видим “Starting…“. Но почему упал? - Смотрим детали:
Кодdocker inspect broken-app --format='{{.State.ExitCode}}'1означает ошибку приложения.
- Смотрим логи:
-
Отладка: Запустим контейнер в интерактивном режиме, перезаписав команду, чтобы “зайти и осмотреться”.
docker run -it --rm --entrypoint sh alpine:3.18 # Теперь мы внутри. Можно пробовать запускать команды вручную.
Сценарий 2: Нет связи с базой данных (Сетевая магия)
Создадим ситуацию, когда приложение не видит БД.
-
Создайте сеть:
docker network create my-net -
Запустите Redis в этой сети:
docker run -d --name my-redis --network my-net redis -
Запустите “приложение” (Alpine) В ДРУГОЙ сети (дефолтной):
docker run -it --rm --name my-client alpine -
Попробуйте пинговать Redis изнутри
my-client:ping my-redis # ping: bad address 'my-redis'Проблема: Контейнеры в разных сетях изолированы.
-
Решение (на лету): Не выходя из контейнера
my-client(откройте новый терминал хоста):# Подключаем работающий контейнер к сети docker network connect my-net my-client -
Вернитесь в терминал
my-clientи попробуйте снова:ping my-redis # PING my-redis (172.18.0.2): 56 data bytes... (УСПЕХ!)
Сценарий 3: “Где мои файлы?” (Volume Inspect)
Вы запустили базу данных, но не знаете, где физически лежат файлы на вашем Mac/Linux.
-
Запустите Postgres с томом:
docker run -d --name pg-db -v pg-data:/var/lib/postgresql/data postgres:15-alpine -
Найдите точку монтирования:
docker volume inspect pg-data- Linux: Вы увидите путь
/var/lib/docker/volumes/pg-data/_data. - Mac/Windows: Вы увидите путь внутри виртуальной машины Docker. Вы не можете открыть его в Finder/Explorer напрямую.
- Linux: Вы увидите путь
-
Хак для просмотра данных (работает везде): Используйте временный контейнер:
docker run --rm -v pg-data:/data alpine ls -la /dataВы увидите файлы базы (
base,global,pg_hba.conf…).
Итоги
- Если контейнер падает (
Exited), смотритеdocker logsиExitCode. - Если нет связи (
pingfails), проверьтеdocker network lsи подключение контейнеров. - Если нужно проверить данные в Volume, используйте
docker run --rm -v ... alpine ls.
Типичные ошибки при отладке
| Ошибка | Симптом | Решение |
|---|---|---|
| Не смотрят логи | «Контейнер не работает, не знаю почему» | Всегда начинай с docker logs <container> |
| Ищут проблему в коде, а не в Docker | Код работает локально, не в контейнере | Проверить: переменные окружения? Порты? Сеть? Права на файлы? |
docker exec вместо анализа | Починили внутри контейнера, после рестарта сломалось снова | Исправлять в Dockerfile/compose, не в runtime |
| Не проверяют exit code | Не понимают почему контейнер упал | docker inspect --format='{{.State.ExitCode}}': 137=OOM, 1=ошибка |