# 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   # лимиты контейнера
```