Docker
В этом разделе описано, как использовать Docker для разработки, тестирования и развертывания проекта Boilerplate. Docker обеспечивает согласованную среду разработки и упрощает развертывание приложения.
Обзор Docker-конфигурации
Проект Boilerplate использует Docker Compose для управления несколькими контейнерами, включая frontend, backend и базу данных. Это позволяет запускать все компоненты приложения одной командой.
Структура Docker-файлов
Проект содержит следующие Docker-файлы:
- docker-compose.yml — Основной файл Docker Compose
- frontend/Dockerfile — Dockerfile для Frontend (Next.js)
- backend/Dockerfile — Dockerfile для Backend (FastAPI)
Запуск проекта с Docker Compose
Для запуска всего проекта с использованием Docker Compose выполните следующую команду в корневой директории проекта:
docker-compose up
Для запуска в фоновом режиме используйте флаг -d
:
docker-compose up -d
Для сборки образов перед запуском:
docker-compose up --build
Docker Compose файл
Основной файл docker-compose.yml
определяет все сервисы приложения:
version: '3.8'
services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "3000:3000"
volumes:
- ./frontend:/app
- /app/node_modules
depends_on:
- backend
environment:
- NEXT_PUBLIC_API_URL=http://localhost:8000
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "8000:8000"
volumes:
- ./backend:/app
depends_on:
- db
environment:
- DATABASE_URL=postgresql://postgres:postgres@db:5432/app
- SECRET_KEY=your_secret_key
- ENVIRONMENT=development
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=app
ports:
- "5432:5432"
volumes:
postgres_data:
Frontend Dockerfile
Файл frontend/Dockerfile
для сборки и запуска Next.js приложения:
FROM node:18-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
Backend Dockerfile
Файл backend/Dockerfile
для сборки и запуска FastAPI приложения:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
Управление контейнерами
Полезные команды для управления Docker-контейнерами:
Просмотр запущенных контейнеров
docker-compose ps
Остановка контейнеров
docker-compose down
Просмотр логов
docker-compose logs -f frontend # Только Frontend docker-compose logs -f backend # Только Backend docker-compose logs -f # Все сервисы
Выполнение команд внутри контейнера
docker-compose exec frontend sh # Открыть shell в Frontend контейнере docker-compose exec backend bash # Открыть bash в Backend контейнере
Настройка для продакшн-среды
Для продакшн-среды рекомендуется создать отдельный файл конфигурацииdocker-compose.prod.yml
с оптимизациями для производительности:
version: '3.8'
services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.prod
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- NEXT_PUBLIC_API_URL=https://api.yourapp.com
backend:
build:
context: ./backend
dockerfile: Dockerfile.prod
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://postgres:postgres@db:5432/app
- SECRET_KEY=your_production_secret_key
- ENVIRONMENT=production
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=app
volumes:
postgres_data:
Советы и рекомендации
- Всегда указывайте фиксированные версии образов в Dockerfile
- Используйте многоэтапные сборки для уменьшения размера итоговых образов
- Не храните секреты в Docker-файлах, используйте переменные окружения или Docker Secrets
- Регулярно обновляйте базовые образы для получения исправлений безопасности
- В продакшн-среде используйте Docker Swarm или Kubernetes для оркестрации контейнеров
Решение проблем
Проблема: Контейнер не запускается
Проверьте логи контейнера:
docker-compose logs -f [service_name]
Проблема: Изменения не применяются
Пересоберите образ и перезапустите контейнер:
docker-compose build [service_name] docker-compose up -d [service_name]
Проблема: Ошибки с томами (volumes)
Используйте команду для просмотра информации о томах:
docker volume ls docker volume inspect [volume_name]