Files
Dockerfile/docs/best-practices.md

8.6 KiB
Raw Blame History

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

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

Семантическое версионирование

# Основной и дополнительный тег (двойное тегирование)
TAG1=latest TAG2=v1.0.0       # Рекомендуемый минимум: стабильный alias + версия
TAG1=stable TAG2=v1.1.0       # Пример для стабильной ветки
TAG1=dev                      # Разработка без второго тега

# Предрелизные версии
TAG1=rc TAG2=v1.2.0-rc.1
TAG1=beta TAG2=v1.2.0-beta.1
TAG1=alpha TAG2=v1.2.0-alpha.1

# Специальные алиасы
TAG1=latest
TAG1=stable
TAG1=dev

Автоматическое версионирование

# Использование Git commit hash
TAG1=$(git rev-parse --short HEAD)

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

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

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

Использование непривилегированного пользователя

# В Dockerfile
RUN useradd -ms /bin/bash appuser
USER appuser

Сканирование образов

# Проверка уязвимостей
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. Оптимизация сборки

Многоэтапная сборка

# 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

# .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.nyc_output
.coverage

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

Структурированные логи

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

Мониторинг размера образов

# Просмотр размера образа
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

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

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

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

Параллельная сборка

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

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

Оптимизация размера образов

# Сборка с минимальным размером
make docker build \
  IMAGE=myapp \
  TAG1=minimal \
  BUILD_ARGS="--build-arg BUILDKIT_INLINE_CACHE=1"

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

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

Создание базового образа

# Сборка базового образа
make docker build \
  IMAGE=base-image \
  TAG1=ubuntu-22.04 \
  DOCKERFILE=Dockerfile.base

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

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

# Обновление базовых образов
make docker build \
  IMAGE=myapp \
  TAG1=v1.0.0 \
  PULL=1

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

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

Тестирование образов

# Запуск тестов в контейнере
make docker check RUN_CMD="npm test"

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

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

Интерактивная отладка

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

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

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

Измерение времени сборки

# Время сборки
time make docker build IMAGE=myapp TAG1=v1.0.0

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

Мониторинг ресурсов

# Использование ресурсов контейнеров
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/

Управление конфигурацией

# Создание Makefile.local для проекта
cat > Makefile.local << EOF
REGISTRY=my-registry.com
IMAGE=my-project
TAG1=dev
NO_CACHE=0
QUIET=0
EOF

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

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

Регулярное сохранение образов

# Создание скрипта для ежедневного бэкапа
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 -

Восстановление из архива

# Восстановление образа
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 для проекта

# Создание документации проекта
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