Docker Compose на VPS: готовые примеры стеков
Один файл docker-compose.yml описывает весь ваш стек — базу, приложение, кэш и прокси. Ниже рабочие примеры, которые можно поднять на любом VPS за пару минут.
Содержание
Зачем Compose вместо голых docker run
['Когда сервисов больше одного, командыdocker run с десятком флагов превращаются в ад. Compose переносит всю конфигурацию в декларативный YAML: сети, тома, переменные окружения, зависимости между контейнерами. Поднять или снести весь стек — одна команда.', 'Ставим движок и плагин compose на свежий VPS:', 'curl -fsSL https://get.docker.com | sh\ndocker compose version', 'В современном Docker команда пишется через пробел — docker compose, а не устаревшее docker-compose. На тарифах MAATRIX с AMD EPYC + NVMe сборка и запуск образов идут заметно быстрее за счёт диска, поэтому compose up редко становится узким местом.', 'Структура файла всегда одинакова: корневой ключ services с описанием контейнеров, опциональные volumes и networks. Каждый сервис получает имя, по которому к нему обращаются соседи внутри общей сети — не нужно знать IP-адреса, работает встроенный DNS Docker. Это и есть главная магия compose: приложение ходит к базе по имени db, а не по адресу, который меняется при каждом пересоздании.']
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS под DockerСтек 1: WordPress + MariaDB
['Классика для сайта или блога. Два контейнера, один том под базу, автоперезапуск:', 'services:\n db:\n image: mariadb:11\n restart: always\n environment:\n MYSQL_ROOT_PASSWORD: rootpass\n MYSQL_DATABASE: wp\n MYSQL_USER: wp\n MYSQL_PASSWORD: wppass\n volumes:\n - db_data:/var/lib/mysql\n wordpress:\n image: wordpress:php8.3-apache\n restart: always\n depends_on:\n - db\n ports:\n - "80:80"\n environment:\n WORDPRESS_DB_HOST: db\n WORDPRESS_DB_USER: wp\n WORDPRESS_DB_PASSWORD: wppass\n WORDPRESS_DB_NAME: wp\nvolumes:\n db_data:', 'Запуск в фоне и просмотр логов:', 'docker compose up -d\ndocker compose logs -f wordpress']
Стек 2: приложение + PostgreSQL + Redis
['Типичный бэкенд: сервис на своём образе, база и кэш. Обратите внимание на healthcheck — приложение стартует только когда база готова.', 'services:\n app:\n build: .\n restart: unless-stopped\n depends_on:\n db:\n condition: service_healthy\n environment:\n DATABASE_URL: postgres://app:secret@db:5432/app\n REDIS_URL: redis://cache:6379\n ports:\n - "8080:8080"\n db:\n image: postgres:16-alpine\n environment:\n POSTGRES_USER: app\n POSTGRES_PASSWORD: secret\n POSTGRES_DB: app\n volumes:\n - pg:/var/lib/postgresql/data\n healthcheck:\n test: ["CMD-SHELL", "pg_isready -U app"]\n interval: 5s\n retries: 5\n cache:\n image: redis:7-alpine\nvolumes:\n pg:']
Стек 3: Nextcloud — своё облако
['Замена Google Drive на собственном сервере. Файлы остаются у вас, никаких лимитов чужого провайдера.', 'services:\n db:\n image: postgres:16-alpine\n environment:\n POSTGRES_DB: nextcloud\n POSTGRES_USER: nc\n POSTGRES_PASSWORD: ncpass\n volumes:\n - db:/var/lib/postgresql/data\n app:\n image: nextcloud:apache\n restart: always\n ports:\n - "8081:80"\n depends_on:\n - db\n environment:\n POSTGRES_HOST: db\n POSTGRES_DB: nextcloud\n POSTGRES_USER: nc\n POSTGRES_PASSWORD: ncpass\n volumes:\n - nc:/var/www/html\nvolumes:\n db:\n nc:']
Полезные команды и частые ошибки
['- Обновить образы и пересоздать:
docker compose pull && docker compose up -d - Остановить, не удаляя тома:
docker compose down - Снести всё вместе с данными:
docker compose down -v— осторожно, стирает тома - Статус:
docker compose ps
5432:5432 оказывается в открытом интернете. Не пробрасывайте порты БД, если к ней ходит только сосед по compose-сети. И не храните пароли в git — выносите их в .env рядом с compose-файлом.', 'Для продакшена берите VPS с ежедневными бэкапами: если стек с данными живёт на MAATRIX, снапшот тома всегда можно восстановить из резервной копии.', 'Ещё один нюанс — переменные окружения. Вместо того чтобы хардкодить пароли в YAML, создайте файл .env в той же папке, и Compose автоматически подставит значения по имени переменной. Так один и тот же compose-файл легко переносится между dev и prod: меняется только окружение, а не разметка стека.', '# .env\nMYSQL_ROOT_PASSWORD=super-secret\nWP_TAG=php8.3-apache\n# в compose: image: wordpress:${WP_TAG}']
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS под DockerЧастые вопросы
Чем docker compose отличается от docker-compose?
Это одна и та же логика, но новая версия встроена в Docker как плагин и вызывается через пробел: docker compose. Старый бинарник docker-compose устарел.
Сколько ресурсов нужно под такой стек?
WordPress или небольшой бэкенд с базой комфортно работают от 2 ГБ RAM. На AMD EPYC + NVMe у MAATRIX хватает даже базового тарифа от $8/мес.
Как автоматически поднимать стек после перезагрузки VPS?
Достаточно указать restart: always или unless-stopped у сервисов — Docker сам стартует их вместе с системой.