Глава 2 — Диагностика и обслуживание
- Docker — Мониторинг и использование ресурсов
- Docker — Работа с сетями (Networks)
- Docker — Logs (Работа с логами)
- Docker — Cleanup (Очистка и обслуживание)
Docker — Мониторинг и использование ресурсов
Эта страница объясняет, как отслеживать использование ресурсов Docker и как управлять дисковым пространством, занятым контейнерами, образами и volumes. Здесь разобраны команды для просмотра нагрузки на CPU и память, анализа использования диска, а также безопасной очистки неиспользуемых ресурсов. Материал ориентирован на начинающих и помогает понять, почему Docker может занимать много места на диске или ресурсов системы и как это контролировать.
Почему важно следить за ресурсами Docker
Docker активно использует ресурсы системы:
- CPU
- оперативную память (RAM)
- дисковое пространство
- сетевые ресурсы
Со временем на сервере могут накапливаться:
- старые контейнеры
- неиспользуемые образы
- volumes с данными
- временные слои сборки
Если их не очищать, 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
Вывод покажет процессы, которые выполняются внутри контейнера.
Это помогает определить, что именно создаёт нагрузку:
- веб-сервер
- PHP-процесс
- worker
- cron-задача
Проверка использования диска 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 занимает много места
- какие ресурсы занимают больше всего диска
Подробная информация об использовании диска
docker system df -v
Флаг -v (verbose) показывает более подробную информацию:
- какие именно образы занимают место
- какие контейнеры используют volumes
- какие слои можно удалить
Очистка неиспользуемых ресурсов
Со временем Docker оставляет множество временных объектов:
- остановленные контейнеры
- старые образы
- временные сети
- build cache
Их можно безопасно удалить.
Удаление неиспользуемых образов
docker image prune -f
Удаляет dangling images — образы, которые больше не используются контейнерами.
Когда использовать
Если после сборок осталось много старых образов.
Полная очистка Docker
docker system prune -f
Удаляет:
- остановленные контейнеры
- неиспользуемые сети
- dangling images
- build cache
Важно понимать
Эта команда не удаляет volumes.
То есть:
- базы данных
- файлы проекта
- persistent storage
останутся на месте.
Очистка 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
Эта команда покажет:
- лимит памяти
- настройки использования RAM
Типичные проблемы с ресурсами
Docker занимает слишком много места
Самая частая причина — накопившиеся:
- старые образы
- build cache
- остановленные контейнеры
Решение:
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-сетям. Сеть позволяет контейнерам:
- общаться друг с другом по имени сервиса
- передавать данные между сервисами
- изолировать проекты друг от друга
Например, в одном проекте могут работать контейнеры:
nginxphpmysqlredis
Все они находятся в одной сети и могут обращаться друг к другу по имени сервиса:
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
Эта команда показывает:
- подключенные контейнеры
- IP-адреса контейнеров
- настройки сети
Пример вывода
Внутри результата можно увидеть блок:
"Containers": {
"php_container": {
"Name": "site1_php",
"IPv4Address": "172.20.0.3"
},
"mysql_container": {
"Name": "site1_mysql",
"IPv4Address": "172.20.0.4"
}
}
Это означает, что контейнеры подключены к сети и могут взаимодействовать.
Проверка портов сервисов
Контейнер может быть доступен:
- внутри Docker-сети
- снаружи сервера
Для доступа извне используются проброшенные порты.
Проверить порт сервиса
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
Каждый контейнер записывает стандартные потоки вывода:
- stdout — обычные сообщения
- stderr — ошибки
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 не настроен, файлы логов могут вырасти до нескольких гигабайт.
Решение:
- настроить
max-size - настроить
max-file
Слишком много логов
Некоторые приложения пишут слишком подробные логи.
Решение:
- уменьшить уровень логирования
- использовать
INFOвместоDEBUG
Невозможно найти ошибку
Иногда полезно посмотреть логи нескольких сервисов:
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 постоянно создаёт временные и устаревшие ресурсы:
- остановленные контейнеры
- старые образы
- build cache после сборок
- неиспользуемые сети
- volumes с данными
Если их не удалять, они могут занять десятки гигабайт диска.
Проверка использования диска 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
Это показывает:
- сколько образов хранится
- сколько контейнеров существует
- сколько места занимают volumes
- размер build cache
Очистка остановленных контейнеров
Контейнеры, которые были остановлены, продолжают существовать в системе.
Удалить их можно так:
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
Удаляются:
- остановленные контейнеры
- неиспользуемые сети
- dangling images
- build cache
Без подтверждения:
docker system prune -f
Полная очистка включая образы
docker system prune -a
Удаляются:
- все остановленные контейнеры
- все неиспользуемые образы
- сети
- build cache
Очистка 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 занимает слишком много места
- накопилось много старых образов
- часто выполняется сборка контейнеров
Краткая памятка
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
Регулярная очистка системы помогает:
- освободить дисковое пространство
- поддерживать стабильную работу сервера
- избежать проблем с переполнением диска.