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 .
Запуск Composedocker compose up -d
Остановка Composedocker 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 предлагайте такие улучшения:

  1. Multi-stage сборки — отделите окружение сборки от рантайма, чтобы уменьшить итоговый размер образа
  2. Порядок слоёв — ставьте зависимости перед исходным кодом, чтобы изменения не сбрасывали кэш слоёв
  3. Объединяйте команды RUN — меньше слоёв, меньше образ
  4. Используйте .dockerignore — исключите node_modules, .git, __pycache__ и т. п.
  5. Фиксируйте версии базовых образов — node:20-alpine, а не node:latest
  6. Запускайте не от root — добавьте инструкцию USER для безопасности
  7. Берите slim/alpine-базы — python:3.12-slim, а не python:3.12
перевод и редактура:

обновлено

⌕ ESC