8.5 KiB
8.5 KiB
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
🤝 Вклад в оптимизацию
При добавлении новых зависимостей или файлов:
- Обновите соответствующий .dockerignore
- Проверьте влияние на размер образа
- Запустите сканирование безопасности
- Обновите документацию
Последнее обновление: $(date)
Автор: DevOps Team