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

246 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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