docker compose: поднимаем стек одной командой
Когда сервисов больше одного — приложение, база, кэш, прокси — запускать их вручную через docker run мучительно. docker compose описывает весь стек в одном YAML-файле и поднимает его целиком. Разберём рабочий пример.
Идея compose
['Один файлcompose.yaml описывает все сервисы, их образы, порты, тома и связи. Команда docker compose up поднимает всё сразу, down — гасит.', 'Плюс: конфигурация лежит в git, разворачивается идентично на любом сервере. Это инфраструктура как код в миниатюре.']
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS под docker-стекРабочий compose.yaml
['Стек из веб-приложения, PostgreSQL и nginx. Создаём файл в папке проекта:', 'services:\n db:\n image: postgres:16\n restart: always\n environment:\n POSTGRES_PASSWORD: secret\n POSTGRES_DB: appdb\n volumes:\n - db_data:/var/lib/postgresql/data\n\n app:\n image: myapp:latest\n restart: always\n depends_on:\n - db\n environment:\n DATABASE_URL: postgres://postgres:secret@db:5432/appdb\n\n proxy:\n image: nginx:latest\n restart: always\n ports:\n - "80:80"\n volumes:\n - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro\n depends_on:\n - app\n\nvolumes:\n db_data:', 'Обратите внимание: app обращается к базе по имени сервиса db, а не по IP — compose создаёт внутреннюю сеть с DNS.']
Запуск и управление
['docker compose up -d\ndocker compose ps', 'Флаг -d запускает в фоне. Логи всего стека или одного сервиса:', 'docker compose logs -f\ndocker compose logs -f app', 'Обновить один сервис после нового образа:', 'docker compose pull app\ndocker compose up -d app']
Тома и данные
['Именованный томdb_data хранит базу между перезапусками. Даже docker compose down его не удалит — данные в безопасности.', '- Удалить контейнеры, но сохранить данные:
docker compose down - Удалить всё вместе с томами:
docker compose down -v(осторожно!)
Частые ошибки
['- Порт занят —
bind: address already in use. Уже что-то слушает 80. Найдите:ss -tlnp | grep :80. - app стартует раньше db — depends_on ждёт запуск контейнера, но не готовность базы. Добавьте healthcheck или ретраи в приложении.
- Изменили .yaml, а ничего не поменялось — нужно
docker compose up -dзаново, compose пересоздаст изменённые сервисы.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS под docker-стекЧастые вопросы
compose.yaml или docker-compose.yml?
Оба работают. Современное имя — compose.yaml, старое docker-compose.yml поддерживается для совместимости.
Можно ли собирать образ прямо в compose?
Да, вместо image укажите build: . с путём к Dockerfile. compose соберёт образ при docker compose build или up --build.
Как перезапустить весь стек?
docker compose restart перезапускает контейнеры без пересоздания. Для применения изменений в yaml используйте up -d.