Управление 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 . |
| Запустить 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 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 предлагайте следующие улучшения:
- Multi-stage сборки — отделите среду сборки от среды выполнения, чтобы уменьшить итоговый размер образа
- Порядок слоев — размещайте зависимости перед исходным кодом, чтобы изменения не инвалидировали кэшированные слои
- Объединяйте команды RUN — меньше слоев, меньше образ
- Используйте .dockerignore — исключите
node_modules,.git,__pycache__и т.д. - Фиксируйте версии базовых образов —
node:20-alpine, а неnode:latest - Запускайте не от root — добавьте инструкцию
USERдля безопасности - Используйте slim/alpine образы —
python:3.12-slim, а неpython:3.12