# 💡 Лучшие практики

## 1. Управление версиями

### Семантическое версионирование
```bash
# Основные версии
TAG=v1.0.0    # Стабильная версия
TAG=v1.1.0    # Новая функциональность
TAG=v1.1.1    # Исправления ошибок

# Предварительные версии
TAG=v1.2.0-alpha.1
TAG=v1.2.0-beta.1
TAG=v1.2.0-rc.1

# Специальные теги
TAG=latest    # Последняя стабильная
TAG=dev       # Разработка
TAG=stable    # Стабильная ветка
```

### Автоматическое версионирование
```bash
# Использование Git commit hash
TAG=$(git rev-parse --short HEAD)

# Использование даты
TAG=$(date +%Y%m%d-%H%M%S)

# Использование Git тегов
TAG=$(git describe --tags --always)
```

## 2. Безопасность

### Использование непривилегированного пользователя
```dockerfile
# В Dockerfile
RUN useradd -ms /bin/bash appuser
USER appuser
```

### Сканирование образов
```bash
# Проверка уязвимостей
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy image myapp:latest

# Проверка с детальным отчетом
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy image --severity HIGH,CRITICAL myapp:latest
```

## 3. Оптимизация сборки

### Многоэтапная сборка
```dockerfile
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# Production stage
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["npm", "start"]
```

### Использование .dockerignore
```dockerfile
# .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.nyc_output
.coverage
```

## 4. Мониторинг и логирование

### Структурированные логи
```bash
# Создание логов с метаданными
make docker build \
  IMAGE=myapp \
  TAG=v1.0.0 \
  BUILD_ARGS="--build-arg BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  LOG_DIR=./build-logs
```

### Мониторинг размера образов
```bash
# Просмотр размера образа
docker images myapp:latest

# Детальная информация
docker history myapp:latest

# Анализ слоев
docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  wagoodman/dive:latest myapp:latest
```

## 5. Оптимизация производительности

### Кэширование слоев Docker
```bash
# Сборка с использованием кэша
make docker build IMAGE=myapp TAG=v1.0.0

# Сборка без кэша (для чистых сборок)
make docker build IMAGE=myapp TAG=v1.0.0 NO_CACHE=1

# Принудительное обновление базовых образов
make docker build IMAGE=myapp TAG=v1.0.0 PULL=1
```

### Параллельная сборка
```bash
# Сборка нескольких образов параллельно
make docker build IMAGE=frontend TAG=v1.0.0 &
make docker build IMAGE=backend TAG=v1.0.0 &
make docker build IMAGE=worker TAG=v1.0.0 &
wait

# Проверка результатов
docker images | grep -E "(frontend|backend|worker)"
```

### Оптимизация размера образов
```bash
# Сборка с минимальным размером
make docker build \
  IMAGE=myapp \
  TAG=minimal \
  BUILD_ARGS="--build-arg BUILDKIT_INLINE_CACHE=1"

# Сжатие образов
make docker save \
  SRC_IMAGE=myapp:latest \
  COMPRESS=1
```

## 6. Управление зависимостями

### Создание базового образа
```bash
# Сборка базового образа
make docker build \
  IMAGE=base-image \
  TAG=ubuntu-22.04 \
  DOCKERFILE=Dockerfile.base

# Использование базового образа
make docker build \
  IMAGE=myapp \
  TAG=v1.0.0 \
  BUILD_ARGS="--build-arg BASE_IMAGE=base-image:ubuntu-22.04"
```

### Управление зависимостями
```bash
# Обновление базовых образов
make docker build \
  IMAGE=myapp \
  TAG=v1.0.0 \
  PULL=1

# Проверка обновлений
docker pull ubuntu:22.04
```

## 7. Отладка и тестирование

### Тестирование образов
```bash
# Запуск тестов в контейнере
make docker check RUN_CMD="npm test"

# Проверка конфигурации
make docker check RUN_CMD="nginx -t"

# Проверка портов
make docker check RUN_CMD="netstat -tlnp"
```

### Интерактивная отладка
```bash
# Запуск интерактивного контейнера
docker run -it --rm myapp:latest /bin/bash

# Запуск с отладкой
docker run -it --rm \
  -p 8080:8080 \
  -e DEBUG=1 \
  myapp:latest
```

## 8. Мониторинг производительности

### Измерение времени сборки
```bash
# Время сборки
time make docker build IMAGE=myapp TAG=v1.0.0

# Детальная статистика
make docker build IMAGE=myapp TAG=v1.0.0 2>&1 | tee build.log
```

### Мониторинг ресурсов
```bash
# Использование ресурсов контейнеров
docker stats --no-stream myapp-container

# Анализ размера образов
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
```

## 9. Организация проекта

### Структура файлов
```
project/
├── Dockerfile
├── makefile
├── .dockerignore
├── build.args
├── Makefile.local
├── docs/
│   ├── installation.md
│   ├── dockerfile.md
│   ├── makefile.md
│   ├── examples.md
│   └── best-practices.md
├── logs/
├── images/
└── .offline/
```

### Управление конфигурацией
```bash
# Создание Makefile.local для проекта
cat > Makefile.local << EOF
REGISTRY=my-registry.com
IMAGE=my-project
TAG=dev
NO_CACHE=0
QUIET=0
EOF

# Использование конфигурации
make docker build  # Использует настройки из Makefile.local
```

## 10. Резервное копирование

### Регулярное сохранение образов
```bash
# Создание скрипта для ежедневного бэкапа
cat > backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d)
make docker save \
  SRC_IMAGE=myapp:latest \
  IMAGES_DIR=/backup/docker-images \
  COMPRESS=1
EOF

chmod +x backup.sh

# Добавление в crontab
echo "0 2 * * * /path/to/backup.sh" | crontab -
```

### Восстановление из архива
```bash
# Восстановление образа
make docker load \
  ARCHIVE=/backup/docker-images/myapp_latest.tar.gz \
  REGISTRY=my-registry.com \
  IMAGE=myapp \
  TAG=restored \
  LOGIN=1 \
  PUSH_OFFLINE=1
```

## 11. Документирование

### Создание README для проекта
```bash
# Создание документации проекта
cat > PROJECT_README.md << 'EOF'
# My Project

## Быстрый старт
```bash
make docker build IMAGE=myapp TAG=latest
make docker push IMAGE=myapp TAG=latest
```

## Переменные окружения
- VERSION: Версия приложения
- NODE_ENV: Окружение (development/production)
EOF
```

### Комментирование Dockerfile
```dockerfile
# Базовый образ Ubuntu 22.04
ARG BASE_IMAGE=ubuntu:22.04
FROM ${BASE_IMAGE}

# Метаданные образа
LABEL maintainer="Sergey Antropov <devops@devops.org.ru>" \
      description="Универсальный базовый образ" \
      version="1.0"

# Настройки окружения для неинтерактивной установки
ENV DEBIAN_FRONTEND=noninteractive \
    TZ=Etc/UTC \
    LANG=C.UTF-8

# Установка необходимых утилит
RUN apt-get update && \
    apt-get install -y \
        ca-certificates \
        curl \
        wget \
        bash \
        tzdata \
        nano \
        mc \
        tar \
        gzip \
        unzip \
        net-tools \
        iputils-ping && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Установка рабочей директории
WORKDIR /app
```
