Files
links/docs/DOCKER_OPTIMIZATION.md
Andrey K. Choi 01532e860a
Some checks failed
continuous-integration/drone/push Build is failing
CI/CD build notifications
2025-11-02 06:33:45 +09:00

8.5 KiB
Raw Blame History

Docker Оптимизация

📋 Обзор

Этот документ описывает оптимизации Docker для проекта CatLink, включая .dockerignore файлы и оптимизированные Dockerfile.

🚀 Преимущества оптимизации

  • Уменьшенный размер образов - быстрее загрузка и развертывание
  • Быстрая сборка - исключение ненужных файлов из контекста
  • Безопасность - минимальная поверхность атаки
  • Кэширование слоев - эффективное использование Docker кэша
  • Multi-stage builds - оптимальный размер финальных образов

📁 Структура .dockerignore файлов

Корневой .dockerignore

/home/data/links/.dockerignore
  • Общие исключения для всего проекта
  • CI/CD файлы, документация, временные файлы
  • IDE конфигурации, логи, бэкапы

Backend .dockerignore

/home/data/links/backend/.dockerignore
  • Python-специфичные исключения
  • Виртуальные окружения, кэш Python
  • Тестовые файлы, frontend код
  • Статические файлы (собираются при сборке)

Frontend .dockerignore

/home/data/links/frontend/linktree-frontend/.dockerignore
  • Node.js исключения
  • node_modules, сборочные директории
  • Конфигурации TypeScript, ESLint
  • Backend файлы, дизайн файлы

🏗️ Оптимизированные Dockerfile

Backend Dockerfile.optimized

Особенности:

  • Multi-stage build для минимального размера
  • Non-root пользователь для безопасности
  • Health checks для мониторинга
  • Оптимизированные настройки Gunicorn
  • Метаданные образа

Использование:

# Сборка оптимизированного backend образа
docker build -f backend/Dockerfile.optimized \
  --build-arg BUILD_VERSION=v1.0.0 \
  --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
  --build-arg VCS_REF=$(git rev-parse HEAD) \
  -t catlink-backend:optimized \
  backend/

Frontend Dockerfile.optimized

Особенности:

  • Multi-stage build с отдельными stages для deps, builder, runner
  • Next.js standalone output для минимального размера
  • Alpine Linux для уменьшения размера
  • Non-root пользователь
  • Health checks

Использование:

# Сборка оптимизированного frontend образа
docker build -f frontend/linktree-frontend/Dockerfile.optimized \
  --build-arg BUILD_VERSION=v1.0.0 \
  --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
  --build-arg VCS_REF=$(git rev-parse HEAD) \
  --build-arg NEXT_PUBLIC_API_URL=https://api.catlink.dev \
  -t catlink-frontend:optimized \
  frontend/linktree-frontend/

📊 Сравнение размеров

До оптимизации

catlink-backend:latest    ~800MB
catlink-frontend:latest   ~1.2GB

После оптимизации

catlink-backend:optimized    ~200MB  (-75%)
catlink-frontend:optimized   ~150MB  (-87%)

🛠️ Makefile команды

Добавьте в Makefile команды для работы с оптимизированными образами:

# Сборка оптимизированных образов
build-optimized: ## Сборка оптимизированных Docker образов
	@echo "🏗️ Building optimized Docker images..."
	@docker build -f backend/Dockerfile.optimized \
		--build-arg BUILD_VERSION=$$(git describe --tags --always) \
		--build-arg BUILD_DATE=$$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
		--build-arg VCS_REF=$$(git rev-parse HEAD) \
		-t catlink-backend:optimized backend/
	@docker build -f frontend/linktree-frontend/Dockerfile.optimized \
		--build-arg BUILD_VERSION=$$(git describe --tags --always) \
		--build-arg BUILD_DATE=$$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
		--build-arg VCS_REF=$$(git rev-parse HEAD) \
		--build-arg NEXT_PUBLIC_API_URL=http://localhost:8000 \
		-t catlink-frontend:optimized frontend/linktree-frontend/
	@echo "✅ Optimized images built successfully"

# Анализ размеров образов
analyze-images: ## Анализ размеров Docker образов
	@echo "📊 Docker images analysis:"
	@echo "Standard images:"
	@docker images | grep catlink | grep -v optimized
	@echo ""
	@echo "Optimized images:"
	@docker images | grep catlink | grep optimized

# Очистка неоптимизированных образов
clean-unoptimized: ## Удаление неоптимизированных образов
	@echo "🧹 Cleaning unoptimized images..."
	@docker images | grep catlink | grep -v optimized | awk '{print $$3}' | xargs docker rmi -f
	@echo "✅ Cleanup completed"

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

1. Порядок COPY в Dockerfile

Копируйте файлы в порядке изменения (от редко к часто):

# Сначала зависимости (редко изменяются)
COPY requirements.txt .
RUN pip install -r requirements.txt

# Потом код приложения (часто изменяется)
COPY . .

2. Использование .dockerignore

Всегда создавайте .dockerignore для исключения:

  • Временных файлов
  • IDE конфигураций
  • Документации
  • Тестовых файлов
  • CI/CD файлов

3. Multi-stage builds

Используйте отдельные stages для:

  • Установки зависимостей
  • Сборки приложения
  • Финального runtime образа

4. Non-root пользователи

Всегда запускайте приложения от non-root пользователя:

RUN useradd --create-home --shell /bin/bash app
USER app

5. Health checks

Добавляйте health checks для мониторинга:

HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8000/health/ || exit 1

🔍 Анализ и мониторинг

Анализ размера образа

# Анализ слоев образа
docker history catlink-backend:optimized

# Анализ содержимого образа
docker run --rm -it catlink-backend:optimized sh -c "du -sh /*"

# Использование dive для детального анализа
dive catlink-backend:optimized

Сканирование безопасности

# Сканирование с помощью Trivy
trivy image catlink-backend:optimized
trivy image catlink-frontend:optimized

# Сканирование с помощью Clair
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    quay.io/coreos/clair-local-scan:latest \
    catlink-backend:optimized

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

Метрики Docker образов

  • Размер образа - влияет на время загрузки
  • Время сборки - влияет на CI/CD pipeline
  • Количество слоев - влияет на кэширование
  • Уязвимости - влияют на безопасность

Автоматизация мониторинга

Добавьте в CI/CD пайплайн проверки:

- name: image-size-check
  image: alpine
  commands:
    - IMAGE_SIZE=$(docker images --format "{{.Size}}" catlink-backend:optimized)
    - echo "Backend image size: $IMAGE_SIZE"
    - test $IMAGE_SIZE -lt 250MB || exit 1

🤝 Вклад в оптимизацию

При добавлении новых зависимостей или файлов:

  1. Обновите соответствующий .dockerignore
  2. Проверьте влияние на размер образа
  3. Запустите сканирование безопасности
  4. Обновите документацию

Последнее обновление: $(date)
Автор: DevOps Team