Для чего нужен Docker Compose?

Ответ

Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. Вместо ручного запуска нескольких контейнеров с отдельными командами docker run, вы описываете всю сервисную архитектуру в одном YAML-файле (docker-compose.yml).

Основные задачи:

  • Оркестрация сервисов: Запуск связанных контейнеров (например, веб-приложение, база данных, кэш) одной командой.
  • Управление зависимостями: Автоматическое определение порядка запуска и связей между сервисами.
  • Конфигурация сети и томов: Создание изолированной сети для сервисов и общих томов для данных.
  • Управление переменными окружения: Централизованная настройка окружения для разных сред (dev, test).

Пример docker-compose.yml для веб-приложения с PostgreSQL:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/appdb
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: appdb
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Команды:

  • docker-compose up -d — запуск всех сервисов в фоне.
  • docker-compose down — остановка и удаление контейнеров, сети.
  • docker-compose logs -f web — просмотр логов конкретного сервиса.

Ответ 18+ 🔞

Э, слушай, а ты знал, что есть такая штука, которая избавляет от ебушки-воробушки с этими бесконечными docker run? Ну, когда тебе надо поднять не один контейнер, а целый зоопарк: веб-сервер, базу, кеш, ещё какую-нибудь мартышлюшку. Так вот, это Docker Compose, ёпта.

Вместо того чтобы вручную, как последний распиздяй, городить команды в терминале, ты пишешь один файлик docker-compose.yml. Там, по сути, ты рисуешь всю свою архитектуру: кто что кушает, с кем дружит и где живёт. И потом одной командой — вжух! — и у тебя всё встаёт как надо. Волнение ебать от того, как это удобно.

Что он умеет, этот хитрожопый инструмент:

  • Поднять всё и сразу. Не надо бегать и запускать каждый сервис отдельно. Одна команда — и веб, и база, и всё остальное стартуют вместе.
  • Разобраться, кто от кого зависит. Скажешь ему, что веб-приложение без базы — ничто, и он сначала запустит базу, а потом уже твой код. Умный, блядь.
  • Настроить сеть и диски. Он сам создаст изолированную сеточку для твоих контейнеров, чтобы они друг друга видели, но их никто снаружи не трогал. И тома для данных накинет, чтобы информация не пропадала после перезапуска.
  • Раскидать переменные окружения. Не надо их в команды вписывать. Описал в одном месте — и все сервисы подхватили. Красота!

Вот смотри, как это выглядит на практике. Допустим, у тебя простенькое приложение на Python и база PostgreSQL. Файл docker-compose.yml будет примерно таким:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/appdb
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: appdb
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Видишь? Всё чисто, понятно. Сервис web собирается из Dockerfile в текущей папке, смотрит на порт 8000 и ждёт, пока db встанет. А db — это просто образ постгреса с нашими настройками и томом для данных, чтобы не слетали.

Основные команды, без которых никуда:

  • docker-compose up -d — это святое. Запускает всю эту кашу в фоновом режиме. Сиди и радуйся.
  • docker-compose down — когда всё накрылось медным тазом или просто нужно прибраться. Останавливает и удаляет контейнеры, сеть — всё, что насоздавал up.
  • docker-compose logs -f web — а это чтобы посмотреть, что твой сервис web там бормочет в логах. Ключ -f — чтобы следить в реальном времени, если что-то пошло не так.

Вот и вся магия. Удивление пиздец, насколько же это проще, чем городить овердохуищу скриптов. Попробуешь раз — и потом на чистом Docker без Compose работать уже не захочешь, честное слово.