# Глава 2 — Диагностика и обслуживание

# Docker — Мониторинг и использование ресурсов

Эта страница объясняет, как отслеживать использование ресурсов Docker и как управлять дисковым пространством, занятым контейнерами, образами и volumes. Здесь разобраны команды для просмотра нагрузки на CPU и память, анализа использования диска, а также безопасной очистки неиспользуемых ресурсов. Материал ориентирован на начинающих и помогает понять, **почему Docker может занимать много места на диске или ресурсов системы** и как это контролировать.

---

# Почему важно следить за ресурсами Docker

Docker активно использует ресурсы системы:

* CPU
* оперативную память (RAM)
* дисковое пространство
* сетевые ресурсы

Со временем на сервере могут накапливаться:

* старые контейнеры
* неиспользуемые образы
* volumes с данными
* временные слои сборки

Если их не очищать, Docker может занять **десятки или даже сотни гигабайт дискового пространства**.

Поэтому регулярный мониторинг и очистка — важная часть администрирования Docker.

---

# Просмотр нагрузки контейнеров

## Просмотр использования ресурсов в реальном времени

```bash
docker stats
```

Эта команда показывает статистику всех работающих контейнеров.

Пример вывода:

```
CONTAINER ID   NAME            CPU %   MEM USAGE / LIMIT   MEM %   NET I/O
a12bc34d       project_php     2.5%    120MiB / 2GiB       5.8%    1.2MB / 500KB
b45de67f       project_nginx   0.2%    15MiB / 2GiB        0.7%    200KB / 100KB
```

### Что показывает эта команда

| Поле      | Описание                        |
| --------- | ------------------------------- |
| CPU %     | загрузка процессора контейнером |
| MEM USAGE | используемая память             |
| MEM %     | процент от доступной памяти     |
| NET I/O   | сетевой трафик                  |

### Когда использовать

Полезно, если:

* сервер начал тормозить
* приложение потребляет слишком много ресурсов
* нужно найти контейнер с высокой нагрузкой

---

## Проверка ресурсов одного контейнера

```bash
docker stats --no-stream <container>
```

Флаг `--no-stream` выводит статистику **один раз**, без постоянного обновления.

Пример:

```bash
docker stats --no-stream project_php
```

Это удобно, если нужно быстро проверить текущую нагрузку.

---

# Проверка процессов внутри контейнера

Иногда нагрузку создаёт конкретный процесс.

Можно посмотреть процессы внутри контейнера:

```bash
docker compose top <service>
```

Пример:

```bash
docker compose top php
```

Вывод покажет процессы, которые выполняются внутри контейнера.

Это помогает определить, что именно создаёт нагрузку:

* веб-сервер
* PHP-процесс
* worker
* cron-задача

---

# Проверка использования диска Docker

## Посмотреть сколько места занимает Docker

```bash
docker system df
```

Пример вывода:

```
TYPE            TOTAL     ACTIVE    SIZE
Images          12        4         3.2GB
Containers      8         4         120MB
Local Volumes   6         5         5.6GB
Build Cache     -         -         2.1GB
```

### Что означает каждая строка

| Тип         | Описание          |
| ----------- | ----------------- |
| Images      | Docker-образы     |
| Containers  | контейнеры        |
| Volumes     | постоянные данные |
| Build Cache | кэш сборки Docker |

### Когда использовать

Эта команда помогает понять:

* почему Docker занимает много места
* какие ресурсы занимают больше всего диска

---

## Подробная информация об использовании диска

```bash
docker system df -v
```

Флаг `-v` (verbose) показывает более подробную информацию:

* какие именно образы занимают место
* какие контейнеры используют volumes
* какие слои можно удалить

---

# Очистка неиспользуемых ресурсов

Со временем Docker оставляет множество временных объектов:

* остановленные контейнеры
* старые образы
* временные сети
* build cache

Их можно безопасно удалить.

---

# Удаление неиспользуемых образов

```bash
docker image prune -f
```

Удаляет **dangling images** — образы, которые больше не используются контейнерами.

### Когда использовать

Если после сборок осталось много старых образов.

---

# Полная очистка Docker

```bash
docker system prune -f
```

Удаляет:

* остановленные контейнеры
* неиспользуемые сети
* dangling images
* build cache

### Важно понимать

Эта команда **не удаляет volumes**.

То есть:

* базы данных
* файлы проекта
* persistent storage

останутся на месте.

---

# Очистка volumes

```bash
docker volume prune -f
```

Удаляет **неиспользуемые volumes**.

### Осторожно

Volumes могут содержать:

* базы данных
* пользовательские файлы
* кэш приложения

Поэтому перед удалением нужно убедиться, что volume действительно не используется.

---

# Очистка сетей

```bash
docker network prune -f
```

Удаляет неиспользуемые Docker-сети.

Эта команда безопасна, потому что:

* сети удаляются только если они не используются контейнерами

---

# Проверка ресурсов Docker Engine

Иногда полезно посмотреть информацию о самой Docker-системе.

---

## Проверка доступной памяти

```bash
docker info | grep -i memory
```

Показывает информацию о памяти, доступной Docker.

---

## Проверка CPU

```bash
docker info | grep -i cpu
```

Показывает количество доступных CPU.

---

# Проверка лимитов контейнера

Некоторые контейнеры могут иметь ограничения по памяти.

Проверить это можно так:

```bash
docker inspect <container> | grep -i memory
```

Пример:

```bash
docker inspect project_php | grep -i memory
```

Эта команда покажет:

* лимит памяти
* настройки использования RAM

---

# Типичные проблемы с ресурсами

## Docker занимает слишком много места

Самая частая причина — накопившиеся:

* старые образы
* build cache
* остановленные контейнеры

Решение:

```bash
docker system prune -f
```

---

## Заполнен диск сервера

Проверить использование:

```bash
docker system df
```

Затем очистить ненужные данные.

---

## Контейнер использует слишком много CPU

Найти контейнер:

```bash
docker stats
```

После этого:

* проверить логи
* посмотреть процессы внутри контейнера

---

## Контейнер использует слишком много памяти

Возможные причины:

* утечка памяти
* неправильная конфигурация приложения
* слишком большие кэши

Проверить:

```bash
docker stats
```

---

# Рекомендуемая регулярная очистка

На серверах разработки полезно периодически выполнять:

```bash
docker system prune -f
```

Если используется активная сборка образов:

```bash
docker builder prune -f
```

---

# Типичный сценарий диагностики

Если сервер начал тормозить:

### 1 Проверить контейнеры

```bash
docker stats
```

---

### 2 Проверить диск

```bash
docker system df
```

---

### 3 Очистить ненужные данные

```bash
docker system prune -f
```

---

### 4 Проверить снова

```bash
docker system df
```

---

# Краткая памятка

```bash
docker stats                         # нагрузка контейнеров в реальном времени
docker stats --no-stream <container> # разовая статистика

docker compose top <service>         # процессы внутри контейнера

docker system df                     # использование диска Docker
docker system df -v                  # подробная информация

docker image prune -f                # удалить неиспользуемые образы
docker system prune -f               # очистка контейнеров, сетей и cache
docker volume prune -f               # удалить неиспользуемые volumes
docker network prune -f              # удалить неиспользуемые сети

docker info | grep -i memory         # информация о памяти
docker info | grep -i cpu            # информация о CPU
docker inspect <container> | grep -i memory   # лимиты контейнера
```

# Docker — Работа с сетями (Networks)

Эта страница объясняет, как Docker управляет сетями и как контейнеры взаимодействуют друг с другом. Здесь разобраны основные команды для просмотра сетей, диагностики сетевых проблем и проверки портов сервисов. Материал ориентирован на начинающих и помогает понять, **как контейнеры находят друг друга внутри Docker-проекта и как сервисы становятся доступными снаружи**.

---

# Как работают сети в Docker

По умолчанию каждый контейнер подключается к одной или нескольким Docker-сетям.
Сеть позволяет контейнерам:

* общаться друг с другом по имени сервиса
* передавать данные между сервисами
* изолировать проекты друг от друга

Например, в одном проекте могут работать контейнеры:

* `nginx`
* `php`
* `mysql`
* `redis`

Все они находятся в одной сети и могут обращаться друг к другу по имени сервиса:

```
php -> mysql
php -> redis
nginx -> php
```

Пример подключения к базе внутри контейнера:

```
mysql:3306
```

Где `mysql` — имя сервиса из `docker-compose.yml`.

---

# Список Docker-сетей

## Показать все сети

```bash
docker network ls
```

Пример вывода:

```
NETWORK ID     NAME                DRIVER
9a8b7c6d5e     bridge              bridge
8f7e6d5c4b     host                host
7e6d5c4b3a     project_default     bridge
```

### Что означает каждая сеть

| Сеть            | Назначение                      |
| --------------- | ------------------------------- |
| bridge          | стандартная сеть Docker         |
| host            | контейнер использует сеть хоста |
| project_default | сеть Docker Compose проекта     |

---

# Сеть Docker Compose

Когда запускается проект через:

```bash
docker compose up -d
```

Docker автоматически создаёт сеть:

```
projectname_default
```

Например:

```
site1_default
```

Все сервисы из `docker-compose.yml` автоматически подключаются к этой сети.

Это позволяет контейнерам обращаться друг к другу **по имени сервиса**.

---

# Проверка сети проекта

## Посмотреть информацию о сети

```bash
docker network inspect <network_name>
```

Пример:

```bash
docker network inspect site1_default
```

Эта команда показывает:

* подключенные контейнеры
* IP-адреса контейнеров
* настройки сети

---

## Пример вывода

Внутри результата можно увидеть блок:

```
"Containers": {
  "php_container": {
    "Name": "site1_php",
    "IPv4Address": "172.20.0.3"
  },
  "mysql_container": {
    "Name": "site1_mysql",
    "IPv4Address": "172.20.0.4"
  }
}
```

Это означает, что контейнеры подключены к сети и могут взаимодействовать.

---

# Проверка портов сервисов

Контейнер может быть доступен:

* **внутри Docker-сети**
* **снаружи сервера**

Для доступа извне используются **проброшенные порты**.

---

## Проверить порт сервиса

```bash
docker compose port <service> <port>
```

Пример:

```bash
docker compose port nginx 80
```

Результат:

```
0.0.0.0:8080
```

Это означает, что контейнерный порт `80` доступен на сервере через порт `8080`.

---

# Проверка портов через docker ps

Можно также проверить порты так:

```bash
docker ps
```

Пример вывода:

```
CONTAINER ID   IMAGE      PORTS
ab12cd34       nginx      0.0.0.0:8080->80/tcp
```

Это означает:

```
сервер:8080 -> контейнер:80
```

---

# Подключение контейнера к сети

Иногда контейнер нужно подключить к существующей сети.

## Подключить контейнер

```bash
docker network connect <network> <container>
```

Пример:

```bash
docker network connect site1_default redis_container
```

После этого контейнер сможет взаимодействовать с сервисами сети.

---

# Отключение контейнера от сети

```bash
docker network disconnect <network> <container>
```

Пример:

```bash
docker network disconnect site1_default redis_container
```

Контейнер больше не сможет общаться с сервисами этой сети.

---

# Проверка сетевого доступа внутри контейнера

Если сервисы не могут взаимодействовать, нужно проверить соединение.

## Подключиться к контейнеру

```bash
docker compose exec php sh
```

---

## Проверить доступ к другому сервису

Например, проверить базу данных:

```bash
ping mysql
```

или

```bash
nc -zv mysql 3306
```

Если соединение работает — сеть настроена правильно.

---

# Проверка DNS внутри Docker

Docker автоматически создаёт DNS внутри сети.

Это позволяет обращаться к сервисам **по имени**.

Например:

```
mysql
redis
php
nginx
```

---

## Проверить DNS

Внутри контейнера:

```bash
nslookup mysql
```

или

```bash
ping mysql
```

Если DNS работает, контейнер получит IP.

---

# Типичные сетевые проблемы

## Контейнеры не видят друг друга

Возможные причины:

* контейнеры находятся в разных сетях
* неправильное имя сервиса
* сервис не запущен

Проверить:

```bash
docker network inspect <network>
```

---

## Неверное имя сервиса

В Docker Compose нужно использовать **имя сервиса**, а не имя контейнера.

Пример:

```
mysql
```

а не:

```
project_mysql_1
```

---

## Порт не доступен снаружи

Проверить `docker-compose.yml`.

Пример правильного проброса:

```yaml
ports:
  - "8080:80"
```

Это означает:

```
сервер:8080 -> контейнер:80
```

---

## Контейнер запущен, но сайт не открывается

Проверить:

```bash
docker ps
```

Если порт не указан — он не проброшен наружу.

---

# Типичный сценарий диагностики сети

Если сервис не работает:

### 1 Проверить контейнеры

```bash
docker compose ps
```

---

### 2 Проверить сеть

```bash
docker network ls
```

---

### 3 Проверить подключенные контейнеры

```bash
docker network inspect <network>
```

---

### 4 Проверить DNS внутри контейнера

```bash
docker compose exec php ping mysql
```

---

# Краткая памятка

```bash
docker network ls                       # список сетей
docker network inspect <network>        # информация о сети

docker compose port <service> <port>    # проверить проброс порта

docker network connect <network> <container>     # подключить контейнер
docker network disconnect <network> <container>  # отключить контейнер

docker ps                               # посмотреть проброшенные порты
```

# Docker — Logs (Работа с логами)

Эта страница объясняет, как Docker хранит и обрабатывает логи контейнеров. Здесь разобраны команды для просмотра логов, способы ограничения их размера, настройка log rotation и рекомендации по работе с логами в production. Материал рассчитан на начинающих и помогает понять, **где хранятся Docker-логи и как предотвратить переполнение диска из-за их роста**.

---

# Что такое Docker Logs

Каждый контейнер записывает стандартные потоки вывода:

* **stdout** — обычные сообщения
* **stderr** — ошибки

Docker автоматически сохраняет эти данные как **логи контейнера**.

Пример логов:

```text
[INFO] Server started
[INFO] Connection established
[ERROR] Database connection failed
```

Логи помогают:

* диагностировать ошибки
* отслеживать работу приложения
* анализировать поведение сервисов

---

# Просмотр логов контейнера

## Показать логи контейнера

```bash
docker logs <container>
```

Пример:

```bash
docker logs nginx_container
```

---

## Показать последние строки логов

```bash
docker logs --tail=100 <container>
```

Пример:

```bash
docker logs --tail=100 nginx_container
```

Это покажет последние 100 строк логов.

---

## Просмотр логов в реальном времени

```bash
docker logs -f <container>
```

Пример:

```bash
docker logs -f nginx_container
```

Флаг `-f` означает **follow** — поток логов в реальном времени.

Выход из режима просмотра:

```
CTRL + C
```

---

# Логи Docker Compose

Если используется Docker Compose, можно смотреть логи сервисов.

---

## Логи сервиса

```bash
docker compose logs <service>
```

Пример:

```bash
docker compose logs nginx
```

---

## Логи в реальном времени

```bash
docker compose logs -f <service>
```

---

## Последние строки логов

```bash
docker compose logs --tail=100
```

---

# Где Docker хранит логи

По умолчанию Docker использует драйвер логирования:

```text
json-file
```

Файлы логов находятся в директории:

```text
/var/lib/docker/containers/
```

Пример пути:

```text
/var/lib/docker/containers/<container_id>/<container_id>-json.log
```

Эти файлы могут со временем **значительно увеличиваться**.

---

# Проверка размера логов

Если диск сервера заполняется, одной из причин могут быть логи контейнеров.

Проверить размер можно так:

```bash
du -sh /var/lib/docker/containers/*
```

Это покажет размер логов каждого контейнера.

---

# Ограничение размера логов

Чтобы логи не занимали весь диск, можно настроить **log rotation**.

---

# Настройка логов в docker-compose.yml

Пример конфигурации:

```yaml
services:
  app:
    image: my_app
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
```

---

# Что означают параметры

| Параметр | Назначение                      |
| -------- | ------------------------------- |
| max-size | максимальный размер файла логов |
| max-file | количество файлов               |

Пример выше означает:

```text
максимум 3 файла по 10 MB
```

То есть максимум:

```
30 MB логов
```

---

# Глобальная настройка логов Docker

Ограничение логов можно задать для всего Docker.

Файл конфигурации:

```text
/etc/docker/daemon.json
```

Пример:

```json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
```

После изменения нужно перезапустить Docker:

```bash
sudo systemctl restart docker
```

---

# Очистка логов контейнера

Иногда логи могут стать очень большими.

Можно очистить файл логов:

```bash
truncate -s 0 /var/lib/docker/containers/<container_id>/<container_id>-json.log
```

> **Важно:**
> Очищать логи нужно осторожно и только при необходимости.

---

# Проверка драйвера логирования

Можно посмотреть настройки логирования контейнера:

```bash
docker inspect <container>
```

В выводе нужно найти раздел:

```text
LogConfig
```

---

# Альтернативные драйверы логирования

Docker поддерживает разные драйверы логов.

| Драйвер   | Назначение           |
| --------- | -------------------- |
| json-file | стандартный          |
| syslog    | системный лог        |
| journald  | systemd              |
| fluentd   | централизованный лог |
| gelf      | Graylog              |

Для production часто используют централизованные системы логирования.

---

# Типичные проблемы с логами

## Логи занимают весь диск

Если log rotation не настроен, файлы логов могут вырасти до нескольких гигабайт.

Решение:

* настроить `max-size`
* настроить `max-file`

---

## Слишком много логов

Некоторые приложения пишут слишком подробные логи.

Решение:

* уменьшить уровень логирования
* использовать `INFO` вместо `DEBUG`

---

## Невозможно найти ошибку

Иногда полезно посмотреть логи нескольких сервисов:

```bash
docker compose logs
```

---

# Типичный сценарий диагностики

Если сервис не работает:

### 1 Проверить контейнер

```bash
docker compose ps
```

---

### 2 Посмотреть логи

```bash
docker compose logs --tail=100
```

---

### 3 Следить за логами

```bash
docker compose logs -f
```

---

# Краткая памятка

```bash
docker logs <container>                 # логи контейнера
docker logs -f <container>              # логи в реальном времени
docker logs --tail=100 <container>      # последние строки

docker compose logs                     # логи всех сервисов
docker compose logs -f <service>        # логи сервиса

du -sh /var/lib/docker/containers/*     # размер логов

truncate -s 0 logfile                   # очистить лог
```

# Docker — Cleanup (Очистка и обслуживание)

Эта страница описывает команды и практики очистки Docker-окружения. Со временем на сервере накапливаются остановленные контейнеры, старые образы, build-cache и неиспользуемые volumes. Здесь разобраны способы безопасной очистки этих ресурсов и рекомендации по регулярному обслуживанию Docker-системы.

---

# Почему Docker со временем занимает много места

При работе Docker постоянно создаёт временные и устаревшие ресурсы:

* остановленные контейнеры
* старые образы
* build cache после сборок
* неиспользуемые сети
* volumes с данными

Если их не удалять, они могут занять **десятки гигабайт диска**.

---

# Проверка использования диска Docker

Перед очисткой полезно проверить, сколько места занимает Docker.

```bash id="7p0vfd"
docker system df
```

Пример вывода:

```text id="ny1s4p"
TYPE            TOTAL     ACTIVE    SIZE
Images          12        5         3.4GB
Containers      8         4         150MB
Local Volumes   6         4         8.2GB
Build Cache     -         -         2.1GB
```

Это показывает:

* сколько образов хранится
* сколько контейнеров существует
* сколько места занимают volumes
* размер build cache

---

# Очистка остановленных контейнеров

Контейнеры, которые были остановлены, продолжают существовать в системе.

Удалить их можно так:

```bash id="r3cqlj"
docker container prune
```

Docker попросит подтверждение.

Чтобы выполнить без подтверждения:

```bash id="2v9u3n"
docker container prune -f
```

---

# Очистка неиспользуемых образов

Если контейнеры пересобираются, старые образы остаются в системе.

Удалить их можно так:

```bash id="p3h1y1"
docker image prune
```

Удаляются **dangling images** — образы без тегов.

---

# Удаление всех неиспользуемых образов

```bash id="n0oq1d"
docker image prune -a
```

Эта команда удаляет все образы, которые не используются контейнерами.

> **Важно:**
> После удаления Docker при следующем запуске контейнера может заново скачать образ.

---

# Очистка неиспользуемых volumes

Volumes могут занимать много места, особенно если в них хранятся базы данных.

Удалить неиспользуемые volumes:

```bash id="z3ibk9"
docker volume prune
```

Без подтверждения:

```bash id="pcx9o7"
docker volume prune -f
```

> **Важно:**
> Удаляются только volumes, не подключённые к контейнерам.

---

# Очистка сетей

Иногда остаются неиспользуемые Docker-сети.

Удалить их можно так:

```bash id="v6j8hd"
docker network prune
```

---

# Полная очистка Docker

Docker предоставляет команду для очистки большинства временных ресурсов.

```bash id="f0e67x"
docker system prune
```

Удаляются:

* остановленные контейнеры
* неиспользуемые сети
* dangling images
* build cache

Без подтверждения:

```bash id="v9qakf"
docker system prune -f
```

---

# Полная очистка включая образы

```bash id="z6y9qt"
docker system prune -a
```

Удаляются:

* все остановленные контейнеры
* все неиспользуемые образы
* сети
* build cache

---

# Очистка build cache

Build cache создаётся при сборке Docker-образов.

Удалить cache можно так:

```bash id="1scnqs"
docker builder prune
```

Без подтверждения:

```bash id="8n9y2n"
docker builder prune -f
```

---

# Проверка больших Docker-директорий

Иногда полезно посмотреть, какие директории занимают больше всего места.

```bash id="2r5y1s"
du -sh /var/lib/docker/*
```

Это поможет понять, где именно находятся большие файлы.

---

# Регулярная очистка Docker

На серверах разработки рекомендуется периодически выполнять:

```bash id="0trvru"
docker system prune -f
```

Если активно собираются образы:

```bash id="6a2vpc"
docker builder prune -f
```

---

# Пример полной очистки

Пример набора команд:

```bash id="l8s5a8"
docker container prune -f
docker image prune -a -f
docker volume prune -f
docker network prune -f
docker builder prune -f
```

Эти команды удаляют почти все неиспользуемые ресурсы.

---

# Типичные проблемы с очисткой

## Удаление volumes с данными

Если выполнить:

```bash id="4fr4cf"
docker compose down -v
```

Docker удалит **все volumes проекта**, включая базы данных.

Поэтому эту команду нужно использовать осторожно.

---

## Удаление образов перед деплоем

Если удалить все образы, Docker будет вынужден заново скачивать их из registry.

Это может занять время.

---

# Когда нужно выполнять очистку

Очистку стоит выполнять, если:

* диск сервера заполняется
* Docker занимает слишком много места
* накопилось много старых образов
* часто выполняется сборка контейнеров

---

# Краткая памятка

```bash id="88duh4"
docker system df                # использование диска Docker

docker container prune          # удалить остановленные контейнеры
docker image prune              # удалить dangling images
docker image prune -a           # удалить неиспользуемые образы

docker volume prune             # удалить неиспользуемые volumes
docker network prune            # удалить неиспользуемые сети

docker builder prune            # очистить build cache

docker system prune             # очистка системы Docker
docker system prune -a          # полная очистка
```

---

# Итог

Со временем Docker накапливает большое количество неиспользуемых ресурсов:

* контейнеров
* образов
* volumes
* build cache

Регулярная очистка системы помогает:

* освободить дисковое пространство
* поддерживать стабильную работу сервера
* избежать проблем с переполнением диска.