architect/standards/4-policy/policy-docker.md

type: standard
aspect: policy
title: "Docker Policy — Политика управления образами и данными"
version: 1.0.0
date: 2026-02-19
status: active


Docker Policy — Политика управления образами и данными

Версия: 1.0.0
Дата: 2025-12-24


ЧТО ТАКОЕ DOCKER ОБРАЗЫ

Docker образ = шаблон для контейнера (как установочный ISO).

┌──────────────────────────────────────────────────┐
  ОБРАЗ (template)                                
  postgres:15-alpine                              
  Размер: 273MB                                   
  Хранится: /var/lib/docker/overlay2/             
└──────────────────────────────────────────────────┘
                     docker run
┌──────────────────────────────────────────────────┐
  КОНТЕЙНЕР (running instance)                    
  pirofey-db                                      
  Использует образ: postgres:15-alpine            
  Данные: в volume (может быть на S3)             
└──────────────────────────────────────────────────┘

Аналогия:
- Образ = установочный Windows ISO
- Контейнер = запущенная Windows
- Volume = диск C:\ с данными


РАЗДЕЛЕНИЕ ОТВЕТСТВЕННОСТИ

Что Где Почему
Образы /var/lib/docker/ Системный кэш, нельзя перемещать
Конфигурация $WORKSPACE Под git (docker-compose.yaml)
Данные $DATASPACE S3/volumes (базы, файлы)

ПРАВИЛО: Образы = КЭШ (как npm/pip кэш), их нельзя переместить.


ПРОБЛЕМА: НЕИСПОЛЬЗУЕМЫЕ ОБРАЗЫ

Как появляются

# Было:
docker pull postgres:14
docker run postgres:14  # контейнер работает

# Обновление:
docker pull postgres:15
docker run postgres:15  # новый контейнер

# Старый образ postgres:14 остался!
# Занимает 273MB, но НЕ используется

Признаки

docker images    # 13 образов
docker ps        # 11 контейнеров
# → 2 образа лишние

ПОЛИТИКА ОЧИСТКИ

Уровень 0: Безопасная (автоматическая)

Когда: Каждую неделю (cron)
Что: Только dangling образы (без тегов)

docker image prune -f

Освобождает: 100-500MB
Риск: Нет (удаляет мусор)

Уровень 1: Умеренная (по запросу)

Когда: Диск > 85%
Что: Неиспользуемые образы с тегами

docker image prune -a -f

Освобождает: 2-6GB
Риск: Если образ понадобится — нужно качать заново (5-10 мин)

Уровень 2: Агрессивная (ручная)

Когда: Критический дефицит места
Что: Всё что можно + volumes

docker system prune -a --volumes -f

Освобождает: 5-10GB
Риск: ВЫСОКИЙ — может удалить данные volumes!


ПОЛИТИКА ОБРАЗОВ ДЛЯ ПЛАТФОРМЫ

Правило 1: Не более 3 версий одного образа

✅ ХОРОШО:
postgres:15-alpine   (используется)
postgres:14-alpine   (резервная версия)

❌ ПЛОХО:
postgres:15-alpine
postgres:14-alpine
postgres:13-alpine   ← удалить
postgres:12-alpine   ← удалить

Правило 2: Удалять после смены версии

# После обновления pirofey-v1 → pirofey-v2:
docker rmi docker-v1  # удалить старый образ

Правило 3: Тегировать свои образы

# ❌ ПЛОХО (образ без тега = мусор)
docker build .

# ✅ ХОРОШО
docker build -t pirofey:v2 .

АВТОМАТИЗАЦИЯ

Cron: еженедельная очистка

# /etc/cron.weekly/docker-cleanup
0 3 * * 0 docker image prune -f >> /var/log/docker-cleanup.log 2>&1

Монитор: автоочистка при 90%

Уже реализовано в system/monitor/auto_cleanup.sh:

if [ "$DISK_USAGE" -ge 90 ]; then
    docker image prune -a -f
    docker volume prune -f
fi

ЧТО В DATASPACE

Что Где Пример
Volumes $DATASPACE/docker/volumes/ Базы данных
Бэкапы $DATASPACE/backups/ Дампы БД
Логи $DATASPACE/logs/ Старые логи

Docker Compose пример:

services:
  db:
    image: postgres:15-alpine  # Образ → /var/lib/docker
    volumes:
      - $DATASPACE/docker/volumes/pirofey-db:/var/lib/postgresql/data  # Данные → S3

КОМАНДЫ ДИАГНОСТИКИ

# Занятое место
docker system df

# Список образов
docker images

# Неиспользуемые образы
docker images --filter "dangling=true"

# Что используется
docker ps --format "{{.Image}}" | sort -u

# Оценка очистки
docker system df -v

СВЯЗИ


Версия: 1.0.0