# 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?