# 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 - Метаданные образа **Использование:** ```bash # Сборка оптимизированного 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 **Использование:** ```bash # Сборка оптимизированного 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/ ``` ## 📊 Сравнение размеров ### До оптимизации ```bash catlink-backend:latest ~800MB catlink-frontend:latest ~1.2GB ``` ### После оптимизации ```bash catlink-backend:optimized ~200MB (-75%) catlink-frontend:optimized ~150MB (-87%) ``` ## 🛠️ Makefile команды Добавьте в 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 Копируйте файлы в порядке изменения (от редко к часто): ```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 пользователя: ```dockerfile RUN useradd --create-home --shell /bin/bash app USER app ``` ### 5. Health checks Добавляйте health checks для мониторинга: ```dockerfile HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8000/health/ || exit 1 ``` ## 🔍 Анализ и мониторинг ### Анализ размера образа ```bash # Анализ слоев образа docker history catlink-backend:optimized # Анализ содержимого образа docker run --rm -it catlink-backend:optimized sh -c "du -sh /*" # Использование dive для детального анализа dive catlink-backend:optimized ``` ### Сканирование безопасности ```bash # Сканирование с помощью 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 пайплайн проверки: ```yaml - 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