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 выполните следующую команду в корневой директории проекта:

bash
docker-compose up

Для запуска в фоновом режиме используйте флаг -d:

bash
docker-compose up -d

Для сборки образов перед запуском:

bash
docker-compose up --build

Docker Compose файл

Основной файл docker-compose.yml определяет все сервисы приложения:

yaml
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 приложения:

dockerfile
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 приложения:

dockerfile
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-контейнерами:

Просмотр запущенных контейнеров

bash
docker-compose ps

Остановка контейнеров

bash
docker-compose down

Просмотр логов

bash
docker-compose logs -f frontend  # Только Frontend docker-compose logs -f backend   # Только Backend docker-compose logs -f           # Все сервисы

Выполнение команд внутри контейнера

bash
docker-compose exec frontend sh  # Открыть shell в Frontend контейнере docker-compose exec backend bash  # Открыть bash в Backend контейнере

Настройка для продакшн-среды

Для продакшн-среды рекомендуется создать отдельный файл конфигурацииdocker-compose.prod.ymlс оптимизациями для производительности:

yaml
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 для оркестрации контейнеров

Решение проблем

Проблема: Контейнер не запускается

Проверьте логи контейнера:

bash
docker-compose logs -f [service_name]

Проблема: Изменения не применяются

Пересоберите образ и перезапустите контейнер:

bash
docker-compose build [service_name] docker-compose up -d [service_name]

Проблема: Ошибки с томами (volumes)

Используйте команду для просмотра информации о томах:

bash
docker volume ls docker volume inspect [volume_name]