246 lines
8.5 KiB
Markdown
246 lines
8.5 KiB
Markdown
# 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 |