Docker Management
Управление Docker-контейнерами, образами, томами и Compose.
Метаданные навыка
| Источник | Опциональный — установить командой hermes skills install official/devops/docker-management |
| Путь | optional-skills/devops/docker-management |
| Версия | 1.0.0 |
| Автор | sprmn24 |
| Лицензия | MIT |
| Платформы | linux, macos, windows |
| Теги | docker, containers, devops, infrastructure, compose, images, volumes, networks, debugging |
Справочник: полный SKILL.md
Ниже — полное определение навыка, которое Hermes Agent загружает при его активации. Именно это агент видит как инструкции, когда навык включён.
Docker Management
Управление контейнерами, образами, томами, сетями и Compose-стеками через стандартные команды Docker CLI. Дополнительных зависимостей, кроме самого Docker, не требуется.
Когда использовать
- Запуск, остановка, перезапуск, удаление или инспекция контейнеров
- Сборка, загрузка (pull), выгрузка (push), тегирование или очистка образов Docker
- Работа с Docker Compose (многосервисные стеки)
- Управление томами или сетями
- Отладка падающего контейнера или разбор логов
- Проверка использования диска Docker или освобождение места
- Разбор или оптимизация Dockerfile
Требования
- Docker Engine установлен и запущен
- Пользователь добавлен в группу
docker(либо используйтеsudo) - Docker Compose v2 (входит в современные сборки Docker)
Быстрая проверка:
docker --version && docker compose version
Краткий справочник
| Задача | Команда |
|---|---|
| Запуск контейнера (в фоне) | docker run -d --name NAME IMAGE |
| Остановка и удаление | docker stop NAME && docker rm NAME |
| Просмотр логов (с отслеживанием) | docker logs --tail 50 -f NAME |
| Шелл внутри контейнера | docker exec -it NAME /bin/sh |
| Список всех контейнеров | docker ps -a |
| Сборка образа | docker build -t TAG . |
| Запуск Compose | docker compose up -d |
| Остановка Compose | docker compose down |
| Использование диска | docker system df |
| Очистка висячих объектов | docker image prune && docker container prune |
Порядок действий
1. Определить область задачи
Разберитесь, к какой категории относится запрос:
- Жизненный цикл контейнера → run, stop, start, restart, rm, pause/unpause
- Взаимодействие с контейнером → exec, cp, logs, inspect, stats
- Управление образами → build, pull, push, tag, rmi, save/load
- Docker Compose → up, down, ps, logs, exec, build, config
- Тома и сети → create, inspect, rm, prune, connect
- Устранение неполадок → разбор логов, коды завершения, проблемы с ресурсами
2. Операции с контейнерами
Запуск нового контейнера:
# Отсоединённый сервис с пробросом порта
docker run -d --name web -p 8080:80 nginx
# С переменными окружения
docker run -d -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=mydb --name db postgres:16
# С постоянными данными (именованный том)
docker run -d -v pgdata:/var/lib/postgresql/data --name db postgres:16
# Для разработки (bind-монтирование исходного кода)
docker run -d -v $(pwd)/src:/app/src -p 3000:3000 --name dev my-app
# Интерактивная отладка (авто-удаление при выходе)
docker run -it --rm ubuntu:22.04 /bin/bash
# С лимитами ресурсов и политикой перезапуска
docker run -d --memory=512m --cpus=1.5 --restart=unless-stopped --name app my-app
Основные флаги: -d — фоновый режим, -it — интерактивный + tty, --rm — авто-удаление, -p — порт (host:container), -e — переменная окружения, -v — том, --name — имя, --restart — политика перезапуска.
Управление запущенными контейнерами:
docker ps # запущенные контейнеры
docker ps -a # все (включая остановленные)
docker stop NAME # мягкая остановка
docker start NAME # запустить остановленный контейнер
docker restart NAME # остановить и запустить снова
docker rm NAME # удалить остановленный контейнер
docker rm -f NAME # принудительно удалить запущенный контейнер
docker container prune # удалить ВСЕ остановленные контейнеры
Взаимодействие с контейнерами:
docker exec -it NAME /bin/sh # доступ к shell (если есть — /bin/bash)
docker exec NAME env # просмотр переменных окружения
docker exec -u root NAME apt update # выполнить от имени конкретного пользователя
docker logs --tail 100 -f NAME # следить за последними 100 строками
docker logs --since 2h NAME # логи за последние 2 часа
docker cp NAME:/path/file ./local # скопировать файл из контейнера
docker cp ./file NAME:/path/ # скопировать файл в контейнер
docker inspect NAME # полные сведения о контейнере (JSON)
docker stats --no-stream # снимок потребления ресурсов
docker top NAME # запущенные процессы
3. Управление образами
# Сборка
docker build -t my-app:latest .
docker build -t my-app:prod -f Dockerfile.prod .
docker build --no-cache -t my-app . # чистая пересборка
DOCKER_BUILDKIT=1 docker build -t my-app . # быстрее с BuildKit
# Загрузка и публикация
docker pull node:20-alpine
docker login ghcr.io
docker tag my-app:latest registry/my-app:v1.0
docker push registry/my-app:v1.0
# Инспекция
docker images # список локальных образов
docker history IMAGE # посмотреть слои
docker inspect IMAGE # полные сведения
# Очистка
docker image prune # удалить висячие (без тегов) образы
docker image prune -a # удалить ВСЕ неиспользуемые образы (осторожно!)
docker image prune -a --filter "until=168h" # неиспользуемые образы старше 7 дней
4. Docker Compose
# Запуск и остановка
docker compose up -d # запустить все сервисы в фоне
docker compose up -d --build # пересобрать образы перед запуском
docker compose down # остановить и удалить контейнеры
docker compose down -v # также удалить тома (УНИЧТОЖАЕТ ДАННЫЕ)
# Мониторинг
docker compose ps # список сервисов
docker compose logs -f api # следить за логами конкретного сервиса
docker compose logs --tail 50 # последние 50 строк всех сервисов
# Взаимодействие
docker compose exec api /bin/sh # shell в запущенном сервисе
docker compose run --rm api npm test # разовая команда (новый контейнер)
docker compose restart api # перезапустить конкретный сервис
# Валидация
docker compose config # проверить и отобразить итоговый конфиг
Минимальный пример compose.yml:
services:
api:
build: .
ports:
- "3000:3000"
environment:
# Пароль берётся из секрета POSTGRES_PASSWORD, а не из URL
- DATABASE_URL=postgres://mydb_user@db:5432/mydb
depends_on:
db:
condition: service_healthy
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 10s
timeout: 5s
retries: 5
volumes:
pgdata:
5. Тома и сети
# Тома
docker volume ls # список томов
docker volume create mydata # создать именованный том
docker volume inspect mydata # детали (точка монтирования и т.д.)
docker volume rm mydata # удалить (не получится, если том используется)
docker volume prune # удалить неиспользуемые тома
# Сети
docker network ls # список сетей
docker network create mynet # создать bridge-сеть
docker network inspect mynet # детали (подключённые контейнеры)
docker network connect mynet NAME # подключить контейнер к сети
docker network disconnect mynet NAME # отключить контейнер от сети
docker network rm mynet # удалить сеть
docker network prune # удалить неиспользуемые сети
6. Использование диска и очистка
Перед очисткой всегда начинайте с диагностики:
# Проверить, что занимает место
docker system df # сводка
docker system df -v # подробная разбивка
# Точечная очистка (безопасно)
docker container prune # остановленные контейнеры
docker image prune # висячие образы
docker volume prune # неиспользуемые тома
docker network prune # неиспользуемые сети
# Агрессивная очистка (сначала уточните у пользователя!)
docker system prune # контейнеры + образы + сети
docker system prune -a # также неиспользуемые образы
docker system prune -a --volumes # ВСЁ — включая именованные тома
Внимание: никогда не запускайте docker system prune -a --volumes без подтверждения от пользователя. Эта команда удаляет именованные тома, где могут лежать важные данные.
Подводные камни
| Проблема | Причина | Решение |
|---|---|---|
| Контейнер сразу завершается | Главный процесс отработал или упал | Проверьте docker logs NAME, попробуйте docker run -it --entrypoint /bin/sh IMAGE |
| «port is already allocated» | Порт занят другим процессом | Найдите его через docker ps или lsof -i :PORT |
| «no space left on device» | Диск Docker заполнен | docker system df, затем точечный prune |
| Не удаётся подключиться к контейнеру | Приложение слушает 127.0.0.1 внутри контейнера | Приложение должно слушать 0.0.0.0, проверьте проброс -p |
| Permission denied на томе | Несовпадение UID/GID хоста и контейнера | Используйте --user $(id -u):$(id -g) или исправьте права |
| Сервисы Compose не видят друг друга | Не та сеть или имя сервиса | Сервисы используют имя сервиса как хост, проверьте docker compose config |
| Кэш сборки не работает | Неверный порядок слоёв в Dockerfile | Ставьте редко меняющиеся слои раньше (зависимости до исходного кода) |
| Слишком большой образ | Нет multi-stage сборки, нет .dockerignore | Используйте multi-stage сборки, добавьте .dockerignore |
Проверка
После любой операции с Docker проверьте результат:
- Контейнер запущен? →
docker ps(статус должен быть «Up») - Логи чистые? →
docker logs --tail 20 NAME(нет ошибок) - Порт доступен? →
curl -s http://localhost:PORTилиdocker port NAME - Образ собран? →
docker images | grep TAG - Стек Compose в порядке? →
docker compose ps(все сервисы «running» или «healthy») - Место освобождено? →
docker system df(сравните до и после)
Советы по оптимизации Dockerfile
При разборе или создании Dockerfile предлагайте такие улучшения:
- Multi-stage сборки — отделите окружение сборки от рантайма, чтобы уменьшить итоговый размер образа
- Порядок слоёв — ставьте зависимости перед исходным кодом, чтобы изменения не сбрасывали кэш слоёв
- Объединяйте команды RUN — меньше слоёв, меньше образ
- Используйте .dockerignore — исключите
node_modules,.git,__pycache__и т. п. - Фиксируйте версии базовых образов —
node:20-alpine, а неnode:latest - Запускайте не от root — добавьте инструкцию
USERдля безопасности - Берите slim/alpine-базы —
python:3.12-slim, а неpython:3.12