Перейти к основному содержимому

Управление Docker

Управление контейнерами, образами, томами, сетями и стеками Docker Compose — операции жизненного цикла, отладка, очистка и оптимизация Dockerfile.

Метаданные навыка​

ИсточникОпционально — установка через vibeos 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​

к сведению

Ниже приведено полное определение навыка, которое VibeOS загружает при его активации. Это те инструкции, которые видит агент, когда навык активен.

Управление Docker

Управление контейнерами, образами, томами, сетями и стеками Docker 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
Войти в контейнер (shell)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 mount исходного кода)
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 порт (хост:контейнер), -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

# Загрузка (pull) и отправка (push)
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:
- DATABASE_URL=postgres://user:pass@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, затем целевая очистка
Нет подключения к контейнеруПриложение внутри контейнера слушает 127.0.0.1Приложение должно слушать 0.0.0.0, проверьте проброс -p
Отказано в доступе к томуНесовпадение UID/GID хоста и контейнераИспользуйте --user $(id -u):$(id -g) или исправьте права
Сервисы Compose не видят друг другаНеправильная сеть или имя сервисаСервисы используют имя сервиса как hostname, проверьте 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