Полное руководство по развертыванию приложений с помощью Docker Compose: простота самохостинга

Узнайте, как легко развертывать приложения на своем сервере с помощью Docker Compose. Пошаговое руководство для новичков и опытных пользователей. Полное руководство по самохостингу приложений.

Средний

Введение в Docker Compose

Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. С помощью простого YAML-файла можно описать всю инфраструктуру вашего приложения: веб-сервер, базу данных, кэш и другие компоненты. Это позволяет запускать все приложение одной командой.

Установка Docker Compose

Установка Docker Compose на разных операционных системах

# Ubuntu/Debian
sudo apt update
sudo apt install docker.io
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# CentOS/RHEL/Fedora
sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# macOS
brew install docker-compose

# Windows
# Установите Docker Desktop for Windows

# Проверка установки
docker-compose --version

Основные концепции Docker Compose

Docker Compose — это инструмент оркестровки контейнеров, который позволяет определять и запускать многоконтейнерные приложения с помощью одного YAML-файла. Ключевые компоненты: сервисы, сети, тома, переменные окружения, сборка образов.

Структура docker-compose.yml

Базовая структура файла docker-compose.yml и пример конфигурации для веб-приложения

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - app
    networks:
      - app-network

  app:
    build: ./app
    expose:
      - "8000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
      - DB_NAME=myapp
      - DB_USER=user
      - DB_PASSWORD=password
    volumes:
      - ./app:/app
    depends_on:
      - db
    networks:
      - app-network

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  db-data:

Расширенные возможности Docker Compose

Работа с переменными окружения, сетями, томами, ограничениями ресурсов и другими продвинутыми функциями

# Работа с переменными окружения
version: '3.8'
services:
  db:
    image: postgres:${POSTGRES_VERSION:-13}
    environment:
      POSTGRES_USER: ${DB_USER:-user}
      POSTGRES_PASSWORD: ${DB_PASSWORD:-password}
    volumes:
      - db-data:/var/lib/postgresql/data

# Управление сетями
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.16.238.0/24

# Работа с томами
services:
  db:
    image: postgres:13
    volumes:
      # Использование именованного тома
      - pgdata:/var/lib/postgresql/data
      
      # Или привязка хост-директории
      - ./data:/var/lib/postgresql/data:rw

# Установка ограничений ресурсов
services:
  app:
    image: myapp:latest
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.2'
          memory: 256M

Основные команды Docker Compose

Основные команды для работы с Docker Compose: запуск сервисов, просмотр статуса, работа с логами, управление контейнерами и т.д.

# Запуск всех сервисов
docker-compose up -d

# Параметры:
# -d — запустить в фоновом режиме
# --build — пересобрать образы перед запуском
# --force-recreate — пересоздать контейнеры даже если конфигурация не изменилась

# Просмотр статуса сервисов
docker-compose ps

# Пересобрать образы
docker-compose build

# Просмотр логов
docker-compose logs

docker-compose logs -f web  # Следить за логами в реальном времени

docker-compose logs --tail=50 web  # Показать последние N строк

# Перезапуск сервисов
docker-compose restart app

# Остановка и удаление контейнеров
docker-compose down  # Остановить и удалить контейнеры, сети, но не тома
docker-compose down -v  # Остановить и удалить всё, включая тома

# Масштабирование сервисов
docker-compose up -d --scale app=3

Развертывание приложений с помощью Docker Compose

Особенности использования Docker Compose для разработки и продакшена, использование в CI/CD

# Для разработки
version: '3.8'
services:
  app:
    build: .
    volumes:
      - .:/app  # Монтирование всего проекта
    environment:
      - NODE_ENV=development
    command: npm run dev

# Для продакшена
version: '3.8'
services:
  app:
    image: mycompany/myapp:${TAG:-latest}
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

Решение распространенных проблем

Как решать типичные проблемы при работе с Docker Compose: конфликты портов, проблемы с подключением к базе данных, проблемы с правами доступа и др.

# Проблема 1: Конфликт портов
# Решение: Измените пробрасываемые порты
services:
  web:
    ports:
      - "8080:80"  # Используйте другой порт хоста

# Проблема 2: Не удается подключиться к базе данных
# Проверьте сетевое взаимодействие
docker-compose exec app ping db

# Проверьте логи сервиса базы данных
docker-compose logs db

# Проблема 3: Проблемы с правами доступа
# Для настройки прав на хост-системе:
sudo chown -R 1000:1000 ./app

# Проблема 4: Не обновляются изменения в коде
# Используйте пересборку образа:
docker-compose up -d --build app

# Проблема 5: Недостаточно памяти
# Проверьте использование памяти:
docker stats

# Установите ограничения для сервисов:
services:
  app:
    deploy:
      resources:
        limits:
          memory: 1G

Лучшие практики и рекомендации

Рекомендации по организации проектов, оптимизации образов, безопасности и мониторингу при работе с Docker Compose

# Организация проекта
project/
├── docker-compose.yml
├── docker-compose.dev.yml
├── docker-compose.prod.yml
├── .env
├── services/
│   ├── web/
│   │   ├── Dockerfile
│   │   ├── package.json
│   │   └── ...
│   ├── app/
│   │   ├── Dockerfile
│   │   ├── package.json
│   │   └── ...
│   └── db/
│       ├── Dockerfile
│       └── ...
└── nginx/
    ├── nginx.conf
    └── ...

# Оптимизация образов - многостадийная сборка
# Dockerfile.prod
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
RUN npm run build
CMD ["npm", "start"]

# Безопасность - использование .env файлов для секретов
version: '3.8'
services:
  app:
    image: myapp:latest
    environment:
      - DATABASE_URL=${DATABASE_URL}