# Глава 5 — Решение проблем

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

Эта страница содержит инструкции по диагностике и устранению наиболее распространённых проблем при работе с Docker и Docker Compose. Здесь описаны типичные ситуации: контейнер не запускается, сервис падает после старта, приложение недоступно или контейнеры не видят друг друга. Материал ориентирован на начинающих и показывает **пошаговый подход к поиску и устранению проблем**.

---

# Общий алгоритм диагностики

Если сервис или контейнер работает неправильно, рекомендуется придерживаться следующего порядка проверки:

1. проверить статус контейнеров
2. проверить логи
3. проверить состояние сети
4. проверить использование ресурсов
5. проверить конфигурацию Docker Compose

Этот подход помогает быстро определить источник проблемы.

---

# Контейнер не запускается

## Проверить статус контейнеров

```bash id="trb9k3"
docker compose ps
```

Пример вывода:

```id="z3fs3n"
NAME          STATUS
project_php   Exited (1)
project_nginx Up
```

Если контейнер имеет статус:

```id="5z0c3a"
Exited
```

это означает, что приложение внутри контейнера завершилось с ошибкой.

---

## Проверить логи контейнера

```bash id="yz2m6b"
docker compose logs <service>
```

Пример:

```bash id="3kt9q7"
docker compose logs php
```

Часто в логах можно увидеть причину проблемы:

* ошибка конфигурации
* отсутствующий файл
* ошибка подключения к базе данных
* неправильные переменные окружения

---

# Контейнер постоянно перезапускается

Иногда контейнер запускается, но сразу падает и перезапускается.

Проверить статус:

```bash id="9itp9r"
docker ps
```

Пример:

```id="swdn6a"
Restarting (1) 10 seconds ago
```

---

## Посмотреть логи в реальном времени

```bash id="42s0pc"
docker compose logs -f <service>
```

Это позволит увидеть, на каком этапе происходит ошибка.

---

# Порт уже используется

Ошибка запуска контейнера может выглядеть так:

```id="j6vttc"
Bind for 0.0.0.0:80 failed: port is already allocated
```

Это означает, что порт уже используется другим процессом.

---

## Проверить, кто использует порт

```bash id="p0h0p0"
sudo lsof -i :80
```

или

```bash id="n2ldib"
netstat -tulpn | grep 80
```

---

## Возможные решения

* остановить другой сервис
* изменить порт в `docker-compose.yml`

Пример изменения порта:

```yaml id="ozqg9u"
ports:
  - "8080:80"
```

---

# Изменения в Dockerfile не применяются

Docker активно использует кэш при сборке образов.
Иногда это приводит к тому, что изменения не применяются.

---

## Пересобрать образ без кэша

```bash id="ib3bkh"
docker compose build --no-cache
```

После этого нужно запустить контейнеры:

```bash id="y7vax4"
docker compose up -d
```

---

# Контейнер не видит изменения файлов

Если используется volume для подключения кода:

```yaml id="9tf49y"
volumes:
  - ./app:/var/www/app
```

иногда изменения в коде могут не применяться.

---

## Проверить содержимое внутри контейнера

```bash id="j9y1ru"
docker compose exec <service> ls /var/www/app
```

---

## Возможные причины

* неправильный путь к папке
* проблемы с правами доступа
* файлы редактируются не в той директории

---

# Контейнеры не видят друг друга

Если сервисы не могут взаимодействовать:

например:

```id="08s0nf"
php -> mysql
```

---

## Проверить сеть

```bash id="2rc7ds"
docker network ls
```

---

## Проверить подключенные контейнеры

```bash id="7q1mka"
docker network inspect <network>
```

---

## Проверить соединение внутри контейнера

```bash id="w7oyv9"
docker compose exec php ping mysql
```

Если соединение не работает — возможно сервис не запущен или контейнеры находятся в разных сетях.

---

# Контейнер завис

Иногда контейнер перестаёт реагировать на команды.

Попробовать перезапустить:

```bash id="t0gns8"
docker restart <container>
```

Если это не помогает:

```bash id="5f7m39"
docker kill <container>
```

---

# Docker занимает слишком много места

Со временем Docker может занимать большое количество дискового пространства.

Проверить использование:

```bash id="mym4sl"
docker system df
```

---

## Очистить неиспользуемые ресурсы

```bash id="ntcd1k"
docker system prune -f
```

---

## Очистить volumes

```bash id="snxfg6"
docker volume prune -f
```

> **Важно:**
> Перед удалением volumes убедитесь, что они не содержат важных данных.

---

# Контейнер не отвечает по HTTP

Если сайт или API не открывается:

---

## Проверить контейнеры

```bash id="69a8vk"
docker compose ps
```

---

## Проверить проброс портов

```bash id="eq74mc"
docker ps
```

Пример:

```id="m5r3tb"
0.0.0.0:8080->80/tcp
```

---

## Проверить доступ внутри контейнера

```bash id="o6bfve"
docker compose exec nginx curl localhost
```

Если внутри контейнера всё работает — проблема может быть в сетевых настройках.

---

# Проверка конфигурации Docker Compose

Перед запуском полезно проверить итоговую конфигурацию:

```bash id="5z2qkh"
docker compose config
```

Команда показывает:

* итоговый YAML
* подставленные переменные окружения
* конфигурацию сервисов

Это помогает обнаружить:

* ошибки YAML
* пропущенные переменные
* неправильные настройки сервисов

---

# Быстрая диагностика (чеклист)

Если сервис не работает:

### 1 Проверить контейнеры

```bash id="1eyx3o"
docker compose ps
```

---

### 2 Проверить логи

```bash id="b3z0yt"
docker compose logs --tail=100
```

---

### 3 Проверить ресурсы

```bash id="ppqf0q"
docker stats
```

---

### 4 Проверить сеть

```bash id="e6d38k"
docker network inspect <network>
```

---

### 5 Проверить конфигурацию

```bash id="u7y1fw"
docker compose config
```

---

# Частые ошибки новичков

## Запуск Docker-команд не из директории проекта

Если команда `docker compose` выполняется не там, где лежит `docker-compose.yml`, Docker не сможет найти конфигурацию.

---

## Неправильные имена сервисов

В Docker Compose используется **имя сервиса**, а не имя контейнера.

Пример правильного имени:

```id="2pydkr"
mysql
```

---

## Отсутствие `.env` файла

Если в `docker-compose.yml` используются переменные окружения, но файл `.env` отсутствует, сервис может не запуститься.

---

# Краткая памятка

```bash id="cc1zkp"
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`

Последовательное использование этих инструментов позволяет быстро определить источник проблемы и восстановить работу контейнеров.

# Docker Debug Flow — Что делать, если контейнер не работает

Эта страница описывает пошаговый алгоритм диагностики Docker-контейнеров. Она помогает быстро определить причину проблемы, если контейнер не запускается, сервис недоступен или приложение работает некорректно. Материал ориентирован на начинающих и представляет собой **универсальный чеклист диагностики Docker-проблем**.

---

# Общий принцип диагностики

Большинство проблем с Docker можно найти, последовательно проверив:

1. статус контейнеров
2. логи контейнеров
3. сетевые настройки
4. использование ресурсов
5. конфигурацию Docker Compose

Чаще всего проблема обнаруживается уже на **втором шаге — в логах**.

---

# Шаг 1 — Проверить контейнеры

Сначала нужно убедиться, что контейнер действительно запущен.

```bash id="fdf0fa"
docker compose ps
```

или

```bash id="q3wz9k"
docker ps
```

Пример результата:

```text id="p3dr7m"
NAME         STATUS
site_nginx   Up
site_php     Exited (1)
site_mysql   Up
```

Если контейнер имеет статус:

```text id="g7y0ox"
Exited
```

это означает, что приложение внутри контейнера завершилось с ошибкой.

---

# Шаг 2 — Проверить логи

Логи — главный источник информации о проблеме.

```bash id="n1oz5n"
docker compose logs <service>
```

Пример:

```bash id="gdr2k2"
docker compose logs php
```

Если контейнер только что перезапустился, удобно смотреть логи в реальном времени:

```bash id="c04u70"
docker compose logs -f php
```

---

# Шаг 3 — Проверить порты

Если сервис работает, но недоступен извне, нужно проверить проброс портов.

```bash id="i5k7cl"
docker ps
```

Пример:

```text id="6f4co1"
0.0.0.0:8080->80/tcp
```

Это означает:

```text id="d5oygs"
сервер:8080 → контейнер:80
```

Если порт не указан — он не открыт наружу.

---

# Шаг 4 — Проверить сеть контейнеров

Если сервисы не видят друг друга, нужно проверить Docker-сети.

```bash id="0hhm2f"
docker network ls
```

Проверить контейнеры в сети:

```bash id="q49u9a"
docker network inspect <network>
```

---

# Шаг 5 — Проверить соединение внутри контейнера

Иногда нужно зайти внутрь контейнера.

```bash id="0nhf52"
docker compose exec <service> sh
```

После этого можно проверить соединение.

Пример проверки базы данных:

```bash id="hr9sl3"
ping mysql
```

или

```bash id="h7l4do"
nc -zv mysql 3306
```

---

# Шаг 6 — Проверить ресурсы

Если сервер перегружен, контейнеры могут работать нестабильно.

Проверить использование ресурсов:

```bash id="r1jz3d"
docker stats
```

Проверить использование диска:

```bash id="q7g34c"
docker system df
```

---

# Шаг 7 — Проверить конфигурацию Compose

Ошибки в `docker-compose.yml` могут привести к неправильному запуску контейнеров.

Проверить конфигурацию:

```bash id="1svyzf"
docker compose config
```

Эта команда покажет итоговую конфигурацию после обработки переменных.

---

# Частые причины проблем

## Ошибка в конфигурации

Неправильный YAML или пропущенная переменная.

Решение:

```bash id="mj9eqk"
docker compose config
```

---

## Порт уже используется

Ошибка:

```text id="7o1b5p"
Bind for 0.0.0.0:80 failed
```

Проверить процесс:

```bash id="d1v6oy"
sudo lsof -i :80
```

---

## Контейнер падает после запуска

Проверить логи:

```bash id="6hbn7v"
docker compose logs
```

---

## Контейнеры не видят друг друга

Проверить сеть:

```bash id="6tdvkt"
docker network inspect <network>
```

---

## Закончился диск

Проверить:

```bash id="s3eb2u"
docker system df
```

Очистить Docker:

```bash id="9e0mxf"
docker system prune -f
```

---

# Быстрый алгоритм диагностики

```text id="tnmxtg"
1 Проверить контейнеры
docker compose ps

2 Проверить логи
docker compose logs

3 Проверить порты
docker ps

4 Проверить сеть
docker network inspect

5 Проверить ресурсы
docker stats

6 Проверить конфигурацию
docker compose config
```

---

# Мини-чеклист диагностики

Если сервис не работает:

* контейнер запущен?
* есть ли ошибки в логах?
* открыт ли нужный порт?
* контейнеры находятся в одной сети?
* хватает ли ресурсов серверу?
* правильная ли конфигурация Compose?