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

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

Эта страница объясняет, как отслеживать использование ресурсов Docker и как управлять дисковым пространством, занятым контейнерами, образами и volumes. Здесь разобраны команды для просмотра нагрузки на CPU и память, анализа использования диска, а также безопасной очистки неиспользуемых ресурсов. Материал ориентирован на начинающих и помогает понять, почему Docker может занимать много места на диске или ресурсов системы и как это контролировать.


Почему важно следить за ресурсами Docker

Docker активно использует ресурсы системы:

Со временем на сервере могут накапливаться:

Если их не очищать, Docker может занять десятки или даже сотни гигабайт дискового пространства.

Поэтому регулярный мониторинг и очистка — важная часть администрирования Docker.


Просмотр нагрузки контейнеров

Просмотр использования ресурсов в реальном времени

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 сетевой трафик

Когда использовать

Полезно, если:


Проверка ресурсов одного контейнера

docker stats --no-stream <container>

Флаг --no-stream выводит статистику один раз, без постоянного обновления.

Пример:

docker stats --no-stream project_php

Это удобно, если нужно быстро проверить текущую нагрузку.


Проверка процессов внутри контейнера

Иногда нагрузку создаёт конкретный процесс.

Можно посмотреть процессы внутри контейнера:

docker compose top <service>

Пример:

docker compose top php

Вывод покажет процессы, которые выполняются внутри контейнера.

Это помогает определить, что именно создаёт нагрузку:


Проверка использования диска Docker

Посмотреть сколько места занимает Docker

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 system df -v

Флаг -v (verbose) показывает более подробную информацию:


Очистка неиспользуемых ресурсов

Со временем Docker оставляет множество временных объектов:

Их можно безопасно удалить.


Удаление неиспользуемых образов

docker image prune -f

Удаляет dangling images — образы, которые больше не используются контейнерами.

Когда использовать

Если после сборок осталось много старых образов.


Полная очистка Docker

docker system prune -f

Удаляет:

Важно понимать

Эта команда не удаляет volumes.

То есть:

останутся на месте.


Очистка volumes

docker volume prune -f

Удаляет неиспользуемые volumes.

Осторожно

Volumes могут содержать:

Поэтому перед удалением нужно убедиться, что volume действительно не используется.


Очистка сетей

docker network prune -f

Удаляет неиспользуемые Docker-сети.

Эта команда безопасна, потому что:


Проверка ресурсов Docker Engine

Иногда полезно посмотреть информацию о самой Docker-системе.


Проверка доступной памяти

docker info | grep -i memory

Показывает информацию о памяти, доступной Docker.


Проверка CPU

docker info | grep -i cpu

Показывает количество доступных CPU.


Проверка лимитов контейнера

Некоторые контейнеры могут иметь ограничения по памяти.

Проверить это можно так:

docker inspect <container> | grep -i memory

Пример:

docker inspect project_php | grep -i memory

Эта команда покажет:


Типичные проблемы с ресурсами

Docker занимает слишком много места

Самая частая причина — накопившиеся:

Решение:

docker system prune -f

Заполнен диск сервера

Проверить использование:

docker system df

Затем очистить ненужные данные.


Контейнер использует слишком много CPU

Найти контейнер:

docker stats

После этого:


Контейнер использует слишком много памяти

Возможные причины:

Проверить:

docker stats

Рекомендуемая регулярная очистка

На серверах разработки полезно периодически выполнять:

docker system prune -f

Если используется активная сборка образов:

docker builder prune -f

Типичный сценарий диагностики

Если сервер начал тормозить:

1 Проверить контейнеры

docker stats

2 Проверить диск

docker system df

3 Очистить ненужные данные

docker system prune -f

4 Проверить снова

docker system df

Краткая памятка

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-сетям. Сеть позволяет контейнерам:

Например, в одном проекте могут работать контейнеры:

Все они находятся в одной сети и могут обращаться друг к другу по имени сервиса:

php -> mysql
php -> redis
nginx -> php

Пример подключения к базе внутри контейнера:

mysql:3306

Где mysql — имя сервиса из docker-compose.yml.


Список Docker-сетей

Показать все сети

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

Когда запускается проект через:

docker compose up -d

Docker автоматически создаёт сеть:

projectname_default

Например:

site1_default

Все сервисы из docker-compose.yml автоматически подключаются к этой сети.

Это позволяет контейнерам обращаться друг к другу по имени сервиса.


Проверка сети проекта

Посмотреть информацию о сети

docker network inspect <network_name>

Пример:

docker network inspect site1_default

Эта команда показывает:


Пример вывода

Внутри результата можно увидеть блок:

"Containers": {
  "php_container": {
    "Name": "site1_php",
    "IPv4Address": "172.20.0.3"
  },
  "mysql_container": {
    "Name": "site1_mysql",
    "IPv4Address": "172.20.0.4"
  }
}

Это означает, что контейнеры подключены к сети и могут взаимодействовать.


Проверка портов сервисов

Контейнер может быть доступен:

Для доступа извне используются проброшенные порты.


Проверить порт сервиса

docker compose port <service> <port>

Пример:

docker compose port nginx 80

Результат:

0.0.0.0:8080

Это означает, что контейнерный порт 80 доступен на сервере через порт 8080.


Проверка портов через docker ps

Можно также проверить порты так:

docker ps

Пример вывода:

CONTAINER ID   IMAGE      PORTS
ab12cd34       nginx      0.0.0.0:8080->80/tcp

Это означает:

сервер:8080 -> контейнер:80

Подключение контейнера к сети

Иногда контейнер нужно подключить к существующей сети.

Подключить контейнер

docker network connect <network> <container>

Пример:

docker network connect site1_default redis_container

После этого контейнер сможет взаимодействовать с сервисами сети.


Отключение контейнера от сети

docker network disconnect <network> <container>

Пример:

docker network disconnect site1_default redis_container

Контейнер больше не сможет общаться с сервисами этой сети.


Проверка сетевого доступа внутри контейнера

Если сервисы не могут взаимодействовать, нужно проверить соединение.

Подключиться к контейнеру

docker compose exec php sh

Проверить доступ к другому сервису

Например, проверить базу данных:

ping mysql

или

nc -zv mysql 3306

Если соединение работает — сеть настроена правильно.


Проверка DNS внутри Docker

Docker автоматически создаёт DNS внутри сети.

Это позволяет обращаться к сервисам по имени.

Например:

mysql
redis
php
nginx

Проверить DNS

Внутри контейнера:

nslookup mysql

или

ping mysql

Если DNS работает, контейнер получит IP.


Типичные сетевые проблемы

Контейнеры не видят друг друга

Возможные причины:

Проверить:

docker network inspect <network>

Неверное имя сервиса

В Docker Compose нужно использовать имя сервиса, а не имя контейнера.

Пример:

mysql

а не:

project_mysql_1

Порт не доступен снаружи

Проверить docker-compose.yml.

Пример правильного проброса:

ports:
  - "8080:80"

Это означает:

сервер:8080 -> контейнер:80

Контейнер запущен, но сайт не открывается

Проверить:

docker ps

Если порт не указан — он не проброшен наружу.


Типичный сценарий диагностики сети

Если сервис не работает:

1 Проверить контейнеры

docker compose ps

2 Проверить сеть

docker network ls

3 Проверить подключенные контейнеры

docker network inspect <network>

4 Проверить DNS внутри контейнера

docker compose exec php ping mysql

Краткая памятка

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

Каждый контейнер записывает стандартные потоки вывода:

Docker автоматически сохраняет эти данные как логи контейнера.

Пример логов:

[INFO] Server started
[INFO] Connection established
[ERROR] Database connection failed

Логи помогают:


Просмотр логов контейнера

Показать логи контейнера

docker logs <container>

Пример:

docker logs nginx_container

Показать последние строки логов

docker logs --tail=100 <container>

Пример:

docker logs --tail=100 nginx_container

Это покажет последние 100 строк логов.


Просмотр логов в реальном времени

docker logs -f <container>

Пример:

docker logs -f nginx_container

Флаг -f означает follow — поток логов в реальном времени.

Выход из режима просмотра:

CTRL + C

Логи Docker Compose

Если используется Docker Compose, можно смотреть логи сервисов.


Логи сервиса

docker compose logs <service>

Пример:

docker compose logs nginx

Логи в реальном времени

docker compose logs -f <service>

Последние строки логов

docker compose logs --tail=100

Где Docker хранит логи

По умолчанию Docker использует драйвер логирования:

json-file

Файлы логов находятся в директории:

/var/lib/docker/containers/

Пример пути:

/var/lib/docker/containers/<container_id>/<container_id>-json.log

Эти файлы могут со временем значительно увеличиваться.


Проверка размера логов

Если диск сервера заполняется, одной из причин могут быть логи контейнеров.

Проверить размер можно так:

du -sh /var/lib/docker/containers/*

Это покажет размер логов каждого контейнера.


Ограничение размера логов

Чтобы логи не занимали весь диск, можно настроить log rotation.


Настройка логов в docker-compose.yml

Пример конфигурации:

services:
  app:
    image: my_app
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

Что означают параметры

Параметр Назначение
max-size максимальный размер файла логов
max-file количество файлов

Пример выше означает:

максимум 3 файла по 10 MB

То есть максимум:

30 MB логов

Глобальная настройка логов Docker

Ограничение логов можно задать для всего Docker.

Файл конфигурации:

/etc/docker/daemon.json

Пример:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

После изменения нужно перезапустить Docker:

sudo systemctl restart docker

Очистка логов контейнера

Иногда логи могут стать очень большими.

Можно очистить файл логов:

truncate -s 0 /var/lib/docker/containers/<container_id>/<container_id>-json.log

Важно: Очищать логи нужно осторожно и только при необходимости.


Проверка драйвера логирования

Можно посмотреть настройки логирования контейнера:

docker inspect <container>

В выводе нужно найти раздел:

LogConfig

Альтернативные драйверы логирования

Docker поддерживает разные драйверы логов.

Драйвер Назначение
json-file стандартный
syslog системный лог
journald systemd
fluentd централизованный лог
gelf Graylog

Для production часто используют централизованные системы логирования.


Типичные проблемы с логами

Логи занимают весь диск

Если log rotation не настроен, файлы логов могут вырасти до нескольких гигабайт.

Решение:


Слишком много логов

Некоторые приложения пишут слишком подробные логи.

Решение:


Невозможно найти ошибку

Иногда полезно посмотреть логи нескольких сервисов:

docker compose logs

Типичный сценарий диагностики

Если сервис не работает:

1 Проверить контейнер

docker compose ps

2 Посмотреть логи

docker compose logs --tail=100

3 Следить за логами

docker compose logs -f

Краткая памятка

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 постоянно создаёт временные и устаревшие ресурсы:

Если их не удалять, они могут занять десятки гигабайт диска.


Проверка использования диска Docker

Перед очисткой полезно проверить, сколько места занимает Docker.

docker system df

Пример вывода:

TYPE            TOTAL     ACTIVE    SIZE
Images          12        5         3.4GB
Containers      8         4         150MB
Local Volumes   6         4         8.2GB
Build Cache     -         -         2.1GB

Это показывает:


Очистка остановленных контейнеров

Контейнеры, которые были остановлены, продолжают существовать в системе.

Удалить их можно так:

docker container prune

Docker попросит подтверждение.

Чтобы выполнить без подтверждения:

docker container prune -f

Очистка неиспользуемых образов

Если контейнеры пересобираются, старые образы остаются в системе.

Удалить их можно так:

docker image prune

Удаляются dangling images — образы без тегов.


Удаление всех неиспользуемых образов

docker image prune -a

Эта команда удаляет все образы, которые не используются контейнерами.

Важно: После удаления Docker при следующем запуске контейнера может заново скачать образ.


Очистка неиспользуемых volumes

Volumes могут занимать много места, особенно если в них хранятся базы данных.

Удалить неиспользуемые volumes:

docker volume prune

Без подтверждения:

docker volume prune -f

Важно: Удаляются только volumes, не подключённые к контейнерам.


Очистка сетей

Иногда остаются неиспользуемые Docker-сети.

Удалить их можно так:

docker network prune

Полная очистка Docker

Docker предоставляет команду для очистки большинства временных ресурсов.

docker system prune

Удаляются:

Без подтверждения:

docker system prune -f

Полная очистка включая образы

docker system prune -a

Удаляются:


Очистка build cache

Build cache создаётся при сборке Docker-образов.

Удалить cache можно так:

docker builder prune

Без подтверждения:

docker builder prune -f

Проверка больших Docker-директорий

Иногда полезно посмотреть, какие директории занимают больше всего места.

du -sh /var/lib/docker/*

Это поможет понять, где именно находятся большие файлы.


Регулярная очистка Docker

На серверах разработки рекомендуется периодически выполнять:

docker system prune -f

Если активно собираются образы:

docker builder prune -f

Пример полной очистки

Пример набора команд:

docker container prune -f
docker image prune -a -f
docker volume prune -f
docker network prune -f
docker builder prune -f

Эти команды удаляют почти все неиспользуемые ресурсы.


Типичные проблемы с очисткой

Удаление volumes с данными

Если выполнить:

docker compose down -v

Docker удалит все volumes проекта, включая базы данных.

Поэтому эту команду нужно использовать осторожно.


Удаление образов перед деплоем

Если удалить все образы, Docker будет вынужден заново скачивать их из registry.

Это может занять время.


Когда нужно выполнять очистку

Очистку стоит выполнять, если:


Краткая памятка

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 накапливает большое количество неиспользуемых ресурсов:

Регулярная очистка системы помогает: