- Home »

Как создать docker-compose.yml? Гайд для вебмастера и не только
Если ты хоть раз пытался развернуть сайт или сервис на продакшене, то наверняка сталкивался с болью: разные сервисы, кучи зависимостей, несовместимости, вечные «у меня работает, а у тебя нет». Контейнеризация — это не волшебная таблетка, но штука, которая реально решает кучу проблем. А docker-compose.yml — твой главный друг, если хочешь собрать и запустить несколько контейнеров одной командой. Разберёмся, как его создавать, на что обращать внимание и какие грабли могут ждать по пути.
Зачем вообще нужен docker-compose.yml?
Когда у тебя не один контейнер, а целый зоопарк (например, nginx + php-fpm + mysql + redis + какой-нибудь celery), запускать их вручную — боль и страдания. Docker Compose позволяет описать всю инфраструктуру в одном файле, а потом поднять её одной командой. Это удобно для:
- SEO-шников, которые гоняют дорвеи и хотят быстро клонировать окружение
- Вебмастеров, которые тестируют разные связки сервисов
- Сисадминов, которым надо быстро поднимать dev/prod стенды
- Любого, кто не хочет тратить время на рутину
Официальная дока: https://docs.docker.com/compose/
Структура docker-compose.yml — простым языком
Файл docker-compose.yml — это обычный YAML-файл, в котором ты описываешь свои сервисы и то, как они должны взаимодействовать. Вот базовая структура:
version: '3.8' services: web: image: nginx:alpine ports: - "80:80" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: supersecret
- version — версия синтаксиса Compose. Сейчас актуальны 3.x и 2.x. Лучше брать 3.8, если не уверен.
- services — тут описываешь все свои контейнеры (web, db, redis и т.д.)
- image — из какого Docker-образа запускать
- ports — пробрасываешь порты наружу (формат “host:container”)
- environment — переменные окружения для контейнера (логины, пароли, настройки)
Минимальный пример для ленивых
version: '3.8' services: mysite: image: php:8.2-apache ports: - "8080:80" volumes: - ./src:/var/www/html
Что тут происходит? Ты поднимаешь контейнер с Apache+PHP, пробрасываешь порт 8080 наружу, а папку ./src
монтируешь внутрь контейнера. Всё, можно кодить локально, а сайт будет доступен на localhost:8080.
Практические советы и схемы
1. Как запускать docker-compose.yml?
docker-compose up -d
Флаг -d — чтобы всё ушло в фон. Если надо остановить:
docker-compose down
2. Как добавить базу данных?
version: '3.8' services: web: build: . ports: - "8000:80" depends_on: - db db: image: postgres:15 environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb volumes: - db_data:/var/lib/postgresql/data volumes: db_data:
- depends_on — web стартует после db
- volumes — сохраняем данные базы вне контейнера (чтобы не потерять при пересборке)
3. Как подключить внешний Dockerfile?
services: app: build: context: . dockerfile: Dockerfile ports: - "5000:5000"
Тут build говорит Compose собрать образ из Dockerfile в текущей папке.
4. Как пробросить переменные окружения из файла?
services: app: env_file: - .env
Создаёшь файл .env рядом с docker-compose.yml и пишешь туда:
DB_USER=admin DB_PASS=pass123
Это удобно для секретов и раздельных настроек для dev/prod.
Кейсы: плюсы, минусы, подводные камни
Позитивные кейсы
- SEO-шник: сделал шаблон docker-compose.yml, клонирует сайты пачками, меняет только .env — и всё взлетает.
- Вебмастер: тестирует разные версии PHP и MySQL, меняет строки в yaml, не ломая основную систему.
- Сисадмин: быстро поднимает стенд для тестов, не пачкая сервер.
Негативные кейсы
- Слишком сложные файлы (20+ сервисов) — начинаешь путаться, где что и зачем.
- Забыл про volumes — после пересборки потерял все данные БД.
- Путаешься в портах — два сервиса пытаются занять один и тот же порт, ничего не работает.
- Используешь latest в image — обновился образ, всё развалилось из-за несовместимости.
Частые ошибки новичков
- Ошибки в отступах YAML — это боль! В YAML важны пробелы, а не табы. Лучше использовать 2 пробела на уровень.
- Не указывают volumes — теряют данные при пересборке.
- Забывают про depends_on — сервис стартует раньше БД, валится с ошибками.
- Используют одинаковые порты для разных сервисов — конфликт, ничего не запускается.
- Хранят секреты прямо в docker-compose.yml — риск утечки, особенно если пушишь в публичный git.
- Путают build и image — build нужен для сборки из Dockerfile, image — для скачивания готового.
Советы по выбору подхода
- Для простых проектов — хватит одного файла на 2-3 сервиса.
- Для сложных — дели на несколько файлов (docker-compose.override.yml, docker-compose.prod.yml).
- Секреты — всегда выноси в .env или секрет-хранилища (например, Docker secrets).
- Не используй latest в image — всегда указывай конкретную версию!
Мифы и альтернативы
- Миф: Docker Compose не нужен, если есть Kubernetes. Факт: Для простых задач Compose проще и быстрее, а K8s — это уже история про кластеры.
- Миф: Compose только для разработки. Факт: Можно и в продакшене, если не нужно масштабирование и оркестрация.
- Альтернатива: Podman — похож на Docker, но без демона. Есть podman-compose.
Заключение: почему docker-compose.yml — must-have для вебмастера
Если ты хочешь быстро и удобно разворачивать сервисы, не мучиться с зависимостями и не тратить время на рутину — docker-compose.yml твой лучший друг. Он помогает автоматизировать запуск, тестирование и переносимость проектов. Главное — не ленись читать доку, не храни секреты в открытом виде и всегда указывай версии образов.
Рекомендую: начни с простого примера, постепенно добавляй новые сервисы и фичи. Не бойся экспериментировать — контейнеры легко сносить и пересобирать. И помни: один хорошо настроенный docker-compose.yml — это как швейцарский нож для вебмастера, SEO-шника или сисадмина.
Полезные ссылки:
- Официальная документация Docker Compose
- Awesome Compose — примеры на GitHub
- Справочник по синтаксису docker-compose.yml
Вопросы? Пиши в комменты или гугли по ключу docker-compose cheatsheet — там ещё больше фишек!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.