Ответ
docker-compose.yml — это YAML-файл конфигурации для Docker Compose, инструмента, который позволяет определять и управлять мультиконтейнерными приложениями Docker. Вместо запуска множества команд docker run с кучей флагов, вы описываете все сервисы, их настройки и связи в одном декларативном файле и управляете ими одной командой.
Базовый пример для веб-приложения (PHP + Nginx + MySQL):
version: '3.8'
services:
# Сервис веб-сервера
webserver:
image: nginx:alpine
ports:
- "8080:80" # Проброс порта localhost:8080 -> 80 в контейнере
volumes:
- ./src:/var/www/html # Монтирование кода проекта
- ./nginx.conf:/etc/nginx/nginx.conf:ro # Кастомная конфигурация Nginx
depends_on:
- app # Запускать после сервиса 'app'
# Сервис приложения (PHP-FPM)
app:
build: . # Собрать образ из Dockerfile в текущей директории
volumes:
- ./src:/var/www/html
environment:
DB_HOST: database
# Сервис базы данных
database:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql # Сохранение данных в именованном томе
# Определение томов для хранения данных
volumes:
db_data:
Ключевые возможности:
- Запуск всего стека:
docker-compose up -dсоздаст и запустит все сервисы. - Управление:
docker-compose downостановит и удалит контейнеры. - Просмотр логов:
docker-compose logs -f app. - Переменные окружения: Можно выносить в отдельный файл
.env. - Сети: Автоматически создаётся изолированная сеть для сервисов, они могут обращаться друг к другу по имени сервиса (например,
appможет подключиться кdatabaseпо хостуdatabase).
Этот файл — стандарт для описания окружения для локальной разработки, тестирования и иногда для простых продакшен-развёртываний.
Ответ 18+ 🔞
А, вот эта штука! Docker Compose, блядь. Ну, представляешь, вместо того чтобы как конченый, вручную каждый контейнер через docker run запускать и там овердохуища флагов прописывать, ты просто один файлик накатываешь. Всё в нём описано: кто, что, как и с кем дружит. Красота, ёпта.
Вот смотри, как для простого веба (PHP, Nginx, MySQL) это выглядит. Сам от себя охуеешь, насколько проще:
version: '3.8'
services:
# Веб-сервер
webserver:
image: nginx:alpine
ports:
- "8080:80" # С локального компа на 8080 порту лезешь, а внутри у него 80
volumes:
- ./src:/var/www/html # Твой код тупо в контейнер засовывается
- ./nginx.conf:/etc/nginx/nginx.conf:ro # А это чтоб свою конфигурацию впендюрить
depends_on:
- app # Чтоб стартанул только после приложения, логично же
# Само приложение на PHP
app:
build: . # Собирает образ из Dockerfile, который тут же лежит
volumes:
- ./src:/var/www/html
environment:
DB_HOST: database # И он тупо по имени "database" базу найдёт, магия!
# База данных, святая святых
database:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword # Пароль, который все равно забудешь
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql # Чтобы данные не испарились после перезапуска
# Тома объявляем тут, это типа постоянное хранилище
volumes:
db_data:
И что эта пиздопроебибна умеет, спросишь ты? Да всё, чувак!
- Всё разом поднять: Кинул в терминал
docker-compose up -d— и сиди, пей чай. Все сервисы как по ману создадутся и запустятся. - Всё разом похерить:
docker-compose down— и нет твоего стека. Чисто, аккуратно. - Логи посмотреть:
docker-compose logs -f app— и видишь, что твое приложение там бздит или работает. Удобно, блядь. - Секреты в сторонку: Пароли и прочую хуйню можно в файлик
.envвынести, чтоб в репозиторий не светить. - Сеть своя: Она сама создаёт изолированную сеть для этих сервисов, и они там друг друга по именам находят. Не надо никаких IP адресов вспоминать, ебать копать.
В общем, файл docker-compose.yml — это такая хитрая жопа, без которой сейчас в разработке никуда. Идеально для локальной среды, чтобы не ебаться с установкой всего на комп. Запустил один раз настроил — и потом хоть сто раз всё сноси и поднимай заново.