Skip to main content

Docker Troubleshooting — Решение типичных проблем

Docker Troubleshooting — Решение типичных проблем

Описание: Эта страница содержит инструкции по диагностике и устранению наиболее распространённых проблем при работе с Docker и Docker Compose. Здесь описаны типичные ситуации: контейнер не запускается, сервис падает после старта, приложение недоступно или контейнеры не видят друг друга. Материал ориентирован на начинающих и показывает пошаговый подход к поиску и устранению проблем.


Общий алгоритм диагностики

Если сервис или контейнер работает неправильно, рекомендуется придерживаться следующего порядка проверки:

  1. проверить статус контейнеров
  2. проверить логи
  3. проверить состояние сети
  4. проверить использование ресурсов
  5. проверить конфигурацию Docker Compose

Этот подход помогает быстро определить источник проблемы.


Контейнер не запускается

Проверить статус контейнеров

docker compose ps

Пример вывода:

NAME          STATUS
project_php   Exited (1)
project_nginx Up

Если контейнер имеет статус:

Exited

это означает, что приложение внутри контейнера завершилось с ошибкой.


Проверить логи контейнера

docker compose logs <service>

Пример:

docker compose logs php

Часто в логах можно увидеть причину проблемы:

  • ошибка конфигурации
  • отсутствующий файл
  • ошибка подключения к базе данных
  • неправильные переменные окружения

Контейнер постоянно перезапускается

Иногда контейнер запускается, но сразу падает и перезапускается.

Проверить статус:

docker ps

Пример:

Restarting (1) 10 seconds ago

Посмотреть логи в реальном времени

docker compose logs -f <service>

Это позволит увидеть, на каком этапе происходит ошибка.


Порт уже используется

Ошибка запуска контейнера может выглядеть так:

Bind for 0.0.0.0:80 failed: port is already allocated

Это означает, что порт уже используется другим процессом.


Проверить, кто использует порт

sudo lsof -i :80

или

netstat -tulpn | grep 80

Возможные решения

  • остановить другой сервис
  • изменить порт в docker-compose.yml

Пример изменения порта:

ports:
  - "8080:80"

Изменения в Dockerfile не применяются

Docker активно использует кэш при сборке образов. Иногда это приводит к тому, что изменения не применяются.


Пересобрать образ без кэша

docker compose build --no-cache

После этого нужно запустить контейнеры:

docker compose up -d

Контейнер не видит изменения файлов

Если используется volume для подключения кода:

volumes:
  - ./app:/var/www/app

иногда изменения в коде могут не применяться.


Проверить содержимое внутри контейнера

docker compose exec <service> ls /var/www/app

Возможные причины

  • неправильный путь к папке
  • проблемы с правами доступа
  • файлы редактируются не в той директории

Контейнеры не видят друг друга

Если сервисы не могут взаимодействовать:

например:

php -> mysql

Проверить сеть

docker network ls

Проверить подключенные контейнеры

docker network inspect <network>

Проверить соединение внутри контейнера

docker compose exec php ping mysql

Если соединение не работает — возможно сервис не запущен или контейнеры находятся в разных сетях.


Контейнер завис

Иногда контейнер перестаёт реагировать на команды.

Попробовать перезапустить:

docker restart <container>

Если это не помогает:

docker kill <container>

Docker занимает слишком много места

Со временем Docker может занимать большое количество дискового пространства.

Проверить использование:

docker system df

Очистить неиспользуемые ресурсы

docker system prune -f

Очистить volumes

docker volume prune -f

Важно: Перед удалением volumes убедитесь, что они не содержат важных данных.


Контейнер не отвечает по HTTP

Если сайт или API не открывается:


Проверить контейнеры

docker compose ps

Проверить проброс портов

docker ps

Пример:

0.0.0.0:8080->80/tcp

Проверить доступ внутри контейнера

docker compose exec nginx curl localhost

Если внутри контейнера всё работает — проблема может быть в сетевых настройках.


Проверка конфигурации Docker Compose

Перед запуском полезно проверить итоговую конфигурацию:

docker compose config

Команда показывает:

  • итоговый YAML
  • подставленные переменные окружения
  • конфигурацию сервисов

Это помогает обнаружить:

  • ошибки YAML
  • пропущенные переменные
  • неправильные настройки сервисов

Быстрая диагностика (чеклист)

Если сервис не работает:

1 Проверить контейнеры

docker compose ps

2 Проверить логи

docker compose logs --tail=100

3 Проверить ресурсы

docker stats

4 Проверить сеть

docker network inspect <network>

5 Проверить конфигурацию

docker compose config

Частые ошибки новичков

Запуск Docker-команд не из директории проекта

Если команда docker compose выполняется не там, где лежит docker-compose.yml, Docker не сможет найти конфигурацию.


Неправильные имена сервисов

В Docker Compose используется имя сервиса, а не имя контейнера.

Пример правильного имени:

mysql

Отсутствие .env файла

Если в docker-compose.yml используются переменные окружения, но файл .env отсутствует, сервис может не запуститься.


Краткая памятка

docker compose ps                        # статус контейнеров
docker compose logs <service>            # логи сервиса
docker compose logs -f <service>         # логи в реальном времени

docker restart <container>               # перезапуск контейнера
docker kill <container>                  # принудительная остановка

docker network inspect <network>         # проверка сети
docker stats                             # использование ресурсов

docker system df                         # использование диска
docker system prune -f                   # очистка Docker

docker compose config                    # проверка конфигурации

Итог

Большинство проблем Docker можно диагностировать с помощью нескольких команд:

  • docker compose ps
  • docker compose logs
  • docker stats
  • docker network inspect
  • docker compose config

Последовательное использование этих инструментов позволяет быстро определить источник проблемы и восстановить работу контейнеров.