# 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`

Последовательное использование этих инструментов позволяет быстро определить источник проблемы и восстановить работу контейнеров.