Новости

Docker и Docker Compose на VPS: пошаговый гайд от установки до продакшена

Когда проект на VPS перерастает один-два скрипта, начинаются проблемы: порты конфликтуют, библиотеки ломаются при обновлении, а перенос на новый сервер занимает часы. Docker и Docker Compose решают это полностью. Контейнеры изолируют сервисы, а один yaml-файл управляет всем стеком.

Мы используем этот подход для белорусских стартапов и компаний уже несколько лет — результат один: один сервер вместо трёх, деплой за 30 секунд и полная портативность. Ниже — проверенный гайд от чистого VPS до продакшена. Всё без лишней теории, только рабочие команды и реальные наблюдения.

Установка Docker на VPS

Подключитесь по SSH и начните с обновления системы. На Ubuntu 22.04/24.04 или Debian:

sudo apt update && sudo apt upgrade -y sudo apt install curl -y

Установка одной командой — самый надёжный вариант: curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh

Добавьте пользователя в группу docker: sudo usermod -aG docker $USER newgrp docker

Проверьте: docker run hello-world

Если контейнер запустился — всё готово. На AlmaLinux/Rocky Linux замените apt на dnf, но принцип тот же.

Важный момент для белорусских тарифов: при 2 ГБ RAM Docker иногда уходит в OOM. Берите от 4 ГБ и добавьте в /etc/docker/daemon.json строку «log-driver»: «json-file» с ограничением размера логов. Перезапустите сервис: sudo systemctl restart docker.

Docker Compose V2 идёт как плагин. Проверьте: docker compose version

Если отсутствует — установите: sudo apt install docker-compose-plugin

Теперь можно создавать первые стеки.

Docker Compose: от первого контейнера до рабочего стека

Создайте папку проекта: mkdir ~/myapp && cd ~/myapp

Файл docker-compose.yml: version: ‘3.9’ services: web: image: nginx:stable-alpine restart: unless-stopped ports:

  • «80:80» volumes:
  • ./html:/usr/share/nginx/html:ro

api: build: ./api restart: unless-stopped depends_on:

  • db environment:
  • DB_HOST=db

db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: app POSTGRES_USER: appuser POSTGRES_PASSWORD: ${DB_PASS} volumes:

  • db_data:/var/lib/postgresql/data

volumes: db_data:

Создайте папку api и Dockerfile внутри: FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . EXPOSE 3000 CMD [«npm», «start»]

Файл .env: DB_PASS=ваш_сильный_пароль

Запуск: docker compose up -d —build

Стек работает. Изменения в коде — одна команда: docker compose up -d —build

Логи: docker compose logs -f api

Мы так запускаем 80 % проектов: лендинг + backend + база. Добавляйте Redis или Redis в тот же файл — VPS потянет без проблем.

Продакшен: безопасность, масштабирование и миграция

В продакшене меняем три вещи.

Во-первых, secrets. Никогда не заливайте пароли в git. Используйте .env и добавляйте: environment:

  • DB_PASSWORD=${DB_PASS}

Во-вторых, healthcheck и сети: db: healthcheck: test: [«CMD-SHELL», «pg_isready -U appuser»] interval: 10s retries: 5 networks:

  • backend

api: networks:

  • backend

networks: backend: internal: true

В-третьих, volumes и бэкапы. Данные живут вне контейнера, поэтому: tar -czf backup-$(date +%F).tar.gz /var/lib/docker/volumes

Для автообновления добавьте сервис watchtower: watchtower: image: containrrr/watchtower volumes:

  • /var/run/docker.sock:/var/run/docker.sock environment:
  • WATCHTOWER_POLL_INTERVAL=3600

Миграция на новый VPS: копируете папку проекта, .env и volumes — docker compose up -d. Готово за 5 минут.

Для белорусских проектов добавляем ufw + fail2ban и лимиты ресурсов в compose (cpus и memory). Один сервер 8 ГБ/4 ядра держит магазин, API и админку одновременно.

Выводы

Docker и Docker Compose превращают VPS в мини-облако. Вы экономите на инфраструктуре, ускоряете деплой и забываете о «работает у меня — не работает у клиента». Начните с установки сегодня — через неделю проект будет в контейнере, а миграции и обновления станут рутиной. Именно так мы запускаем большинство белорусских решений в 2026 году.