Ответ
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 работать уже не захочешь, честное слово.