Docker на VPS: с чего начать

Docker позволяет запустить на сервере бота, сайт, базу данных и мониторинг так, что они не мешают друг другу, а переезд на другой VPS сводится к копированию пары файлов и данных. Установка занимает пять минут, а основные неприятности начинаются позже: открытые наружу порты базы, журналы на десятки гигабайт и данные, которые пропали вместе с контейнером. Разбираем, как избежать их с самого начала.

Обновлено 01.11.2026 · Подобрать VPS по своим условиям →

Контейнер — это приложение вместе со всеми библиотеками и настройками, упакованное в образ. На сервере он запускается одной командой и работает одинаково на любом Linux. Для VPS это значит: не нужно подбирать версии Python, Node.js или PostgreSQL под систему, несколько проектов уживаются на одном сервере, а файл compose.yaml описывает весь набор служб так, что его можно поднять на новом сервере за минуты.

Какой VPS нужен для Docker

Виртуализация — KVM. Docker использует возможности ядра Linux: пространства имён, cgroups, свои сетевые правила. На KVM у сервера своё ядро, и Docker работает без ограничений. На OpenVZ и LXC ядро общее с другими клиентами, и Docker там либо не запускается, либо работает с ограничениями, которые зависят от хостера. Подробнее — в статье KVM или OpenVZ.

Память и ядра. Сам Docker занимает немного, память съедают контейнеры. Ориентиры:

  • 1 ГБ — один-два лёгких контейнера: бот, небольшой API, мониторинг;
  • 2 ядра и 2 ГБ — сайт с базой данных и обратным прокси, несколько небольших служб;
  • 2–4 ядра и 4 ГБ — несколько проектов, PostgreSQL, Redis, сборка образов прямо на сервере;
  • от 8 ГБ — GitLab, n8n с большим числом сценариев, Elasticsearch и другие тяжёлые службы.

Диск. Образы занимают место: базовый образ с Python или Node.js весит сотни мегабайт, а старые версии копятся при каждом обновлении. Берите от 30 ГБ на NVMe, для сборки образов на сервере — больше.

По каталогу accsly на 1 ноября 2026 года тариф на KVM с 2 ядрами и 2 ГБ памяти в середине рынка стоит 1 286 ₽ в месяц, четверть таких тарифов дешевле 750 ₽. С 2 ядрами и 4 ГБ — 1 706 ₽, четверть дешевле 1 041 ₽. Подборки: VPS для Docker, VPS на KVM, VPS с 4 ГБ. Для пробы удобна почасовая оплата: сервер на вечер стоит десятки рублей.

Перед установкой

Возьмите свежую Ubuntu 22.04 или 24.04 LTS либо Debian 12 и сначала сделайте базовую защиту: обновления, вход по ключу, отдельный пользователь, файрвол. Всё это — в статье Первые 10 шагов после покупки VPS. Панель управления сайтами для сервера с контейнерами обычно не нужна, почему — в статье Панели управления сервером.

Установка из официального репозитория

Пакет docker.io из репозитория Ubuntu часто отстаёт от актуальной версии и не всегда содержит Compose. Надёжнее ставить из репозитория Docker. Команды для Ubuntu по официальной документации:

sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Для Debian команды те же, только в адресах linux/ubuntu меняется на linux/debian, а вместо UBUNTU_CODENAME берётся VERSION_CODENAME. Проверьте установку:

sudo docker run hello-world
docker compose version

Есть и установка одной командой через get.docker.com, но сама документация Docker не советует её для рабочих серверов: она ставит много пакетов без подтверждения и всегда берёт последнюю версию.

Группа docker. Чтобы не писать sudo перед каждой командой, пользователя добавляют в группу docker: sudo usermod -aG docker $USER и повторный вход. Помните, что это права root: участник группы может запустить контейнер с доступом ко всей файловой системе сервера. Добавляйте туда только свою рабочую учётную запись.

Первый проект на Docker Compose

Отдельные команды docker run с десятком параметров быстро забываются. Удобнее описать проект в файле compose.yaml в отдельной папке, например /opt/app. Пример — веб-приложение с базой PostgreSQL:

services:
  app:
    image: ghcr.io/example/app:1.4.2
    restart: unless-stopped
    environment:
      DATABASE_URL: postgres://app:${DB_PASSWORD}@db:5432/app
    ports:
      - "127.0.0.1:8080:8080"
    depends_on:
      - db
  db:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

Пароль положите рядом в файл .env со строкой DB_PASSWORD=... и закройте его от чтения другими пользователями: chmod 600 .env. Запуск — docker compose up -d, журнал — docker compose logs -f app, остановка — docker compose down.

Три вещи в этом примере важны:

  • restart: unless-stopped — контейнеры поднимутся после перезагрузки сервера;
  • у базы нет раздела ports: приложение видит её по имени db во внутренней сети проекта, а снаружи она недоступна;
  • порт приложения опубликован только на 127.0.0.1, а наружу его отдаёт nginx или Caddy с сертификатом TLS.

Порты и файрвол

Главная ловушка для новичков. Когда контейнер публикует порт как "5432:5432", Docker сам добавляет правила iptables, и такой порт открывается наружу независимо от правил ufw или firewalld. Документация Docker прямо предупреждает: опубликованные порты контейнеров идут мимо правил файрвола. Именно так в интернет чаще всего попадают базы PostgreSQL, MongoDB и Redis без пароля.

Правило простое: наружу публикуйте только то, что должно быть доступно всем, — обычно порты 80 и 443 обратного прокси. Остальное либо без раздела ports, либо с привязкой к 127.0.0.1. Проверить, что реально слушает сервер, можно командой ss -tlnp, а снаружи — с другого компьютера командой nc -zv IP-сервера 5432.

Журналы и место на диске

По умолчанию Docker пишет вывод контейнеров в JSON-файлы без ограничения размера. Болтливое приложение за пару месяцев заполняет диск, и сервер встаёт. Ограничьте журналы для всех контейнеров в файле /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Затем sudo systemctl restart docker. Настройка действует для контейнеров, созданных после неё, поэтому пересоздайте проекты: docker compose up -d --force-recreate.

Второй пожиратель места — старые образы. Сколько занято, покажет docker system df, удалить неиспользуемые образы — docker image prune -a. Команду docker system prune --volumes без понимания не запускайте: она удалит и тома остановленных проектов вместе с данными.

Где живут данные и как их копировать

Всё, что приложение записало внутри контейнера, исчезает при его пересоздании. Сохраняется только то, что лежит в томах (volumes) или в подключённых папках сервера. Перед запуском любого образа проверьте в его документации, какие папки нужно вынести в том: для PostgreSQL это /var/lib/postgresql/data, для других приложений — свои пути.

Копировать файлы базы данных на ходу ненадёжно. Делайте дамп через сам контейнер:

docker compose exec -T db pg_dump -U app app | gzip > /backup/app-$(date +%F).sql.gz

Добавьте эту команду в cron и отправляйте копии за пределы сервера, вместе с compose.yaml и .env. Как устроить внешнее хранение и проверку копий — в статье Резервные копии VPS.

Обновление контейнеров

Указывайте в compose.yaml конкретную версию образа (postgres:16, app:1.4.2), а не latest: тогда обновление происходит, когда вы его запланировали, а не при случайном перезапуске. Порядок обновления:

  1. сделать дамп базы;
  2. поменять версию в compose.yaml;
  3. docker compose pull и docker compose up -d;
  4. проверить журнал и работу приложения, затем удалить старый образ.

Мажорные версии баз данных, например PostgreSQL 16 → 17, так не обновляются: новой версии нужен перенос данных через дамп и загрузку. Систему сервера и сам Docker обновляйте обычным apt upgrade.

Куда дальше

Когда на сервере несколько проектов, удобно поставить обратный прокси, который сам получает сертификаты, и мониторинг доступности. Для бота на Python или Node.js в контейнере хватит небольшого сервера, подробности — в статье VPS для Telegram-бота. Если контейнеров становится много и одного сервера мало, следующий шаг — несколько серверов под оркестратором, тарифы в подборке VPS для Kubernetes. Под автоматизацию и CI в контейнерах есть подборки VPS для n8n и VPS для GitLab.

Частые вопросы

Можно ли запустить Docker на любом VPS?

Нужна виртуализация KVM или другая полная виртуализация со своим ядром. На OpenVZ и LXC ядро общее с другими клиентами, и Docker там не работает или работает с ограничениями.

Сколько памяти нужно VPS для Docker?

Одному-двум лёгким контейнерам хватит 1 ГБ. Для сайта с базой данных и обратным прокси берите 2 ядра и 2 ГБ, для нескольких проектов с PostgreSQL и Redis — 4 ГБ. Диск — от 30 ГБ на NVMe.

Как установить Docker на Ubuntu?

Подключите официальный репозиторий Docker и поставьте пакеты docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin и docker-compose-plugin. Проверьте установку командой sudo docker run hello-world.

Почему ufw не закрывает порт контейнера?

Docker добавляет свои правила iptables для опубликованных портов, и они действуют независимо от ufw. Не публикуйте порты баз данных, а порты приложений привязывайте к 127.0.0.1 и отдавайте наружу через обратный прокси.

Почему Docker заполнил весь диск?

Чаще всего виноваты журналы контейнеров, которые по умолчанию не ограничены по размеру, и старые образы. Задайте max-size и max-file в /etc/docker/daemon.json и периодически удаляйте неиспользуемые образы командой docker image prune -a.

Пропадут ли данные, если удалить контейнер?

Да, если они хранились внутри контейнера. Сохраняются только данные в томах и подключённых папках сервера. Базы данных дополнительно копируйте дампом за пределы сервера.

Тарифы по теме

VPS для CI/CD-раннеровРейтинг VPS-хостингов 2026

Ещё в справочнике

  • Как перенести сайт с хостинга на VPSСам перенос занимает пару часов, а ошибки обычно случаются вокруг него: забытое задание cron, правила .htaccess, которые nginx не читает, запись AAAA со старым адресом или почта, которая пропала вместе со сменой IP. Ниже — порядок действий с командами и проверками для сайта на PHP и MySQL.
  • Панели управления сервером: ISPmanager, FASTPANEL, aaPanelПанель превращает VPS в привычный по хостингу кабинет: сайты, базы, почта и сертификаты заводятся мышкой, а не правкой конфигов. Три панели, которые чаще всего ставят на российские и недорогие зарубежные серверы, — ISPmanager, FASTPANEL и aaPanel. Они различаются ценой, требованиями к памяти и тем, насколько глубоко забирают сервер под себя.
  • Windows VPS для 1ССервер для 1С в аренде избавляет от офисного компьютера под столом, который никто не обновляет и не копирует. Но у 1С на VPS свои особенности: программная лицензия привязывается к параметрам виртуальной машины, пользователям нужны лицензии и 1С, и Windows, а ядра важнее их количества. Разбираем, как собрать сервер под 1С для небольшой компании.
  • Windows VPS: лицензия, RDP и безопасность входаСервер с Windows дороже Linux не только из-за памяти: в цену входит лицензия, и от того, как она оформлена, зависит, законно ли вы работаете и сколько человек может подключиться. А открытый RDP — самая частая причина взлома таких серверов. Разбираем обе темы.
  • Когда переезжать с хостинга на VPSVPS не делает сайт быстрее сам по себе: он даёт ресурсы и свободу, но вместе с ними — администрирование. Разбираем, по каким признакам видно, что хостинг стал тесным, когда проблема решается без переезда и как перенести сайт так, чтобы посетители ничего не заметили.
  • Резервные копии VPS: стратегии и инструментыНа VPS резервные копии — ваша забота, даже если в тарифе написано «бэкапы включены». Разбираем, что именно копировать, почему снимка у хостера мало, как настроить restic или BorgBackup за полчаса и как убедиться, что из копии действительно можно восстановиться.
  • Первые 10 шагов после покупки VPS: безопасностьПароли к новому серверу начинают подбирать через несколько минут после того, как у него появился публичный IP. Ниже — десять шагов, которые за час закрывают самые частые дыры: команды для Ubuntu и Debian, отличия для AlmaLinux и Rocky Linux и проверки, без которых легко потерять доступ к собственному серверу.
  • Как выбрать страну для сервераСтавьте сервер туда, где ваши посетители. Если сайт собирает данные россиян, база должна быть в России, этого требует закон. Для аудитории по всей Европе удобны Нидерланды, Германия и Финляндия. Цена почти не решает: у одного хостера сервер в Москве, Амстердаме и Франкфурте обычно стоит одинаково, а заметно дороже только Азия и Австралия.
  • Почасовая оплата: когда она выгоднаПочасовая оплата выгодна, если сервер нужен меньше трёх недель в месяц: на тест, на сборку, на разовую тяжёлую задачу. У большинства хостеров час стоит ровно месячную цену, делённую на 730 часов, так что за полный месяц вы почти не переплачиваете. Переплата прячется в другом: тарифы с почасовой оплатой в среднем дороже, а у сервера, который работает круглый год, помесячная оплата за год вперёд обычно выходит дешевле.
  • Сколько памяти и ядер нужно сайтуБольшинству сайтов хватает 2 ГБ памяти и одного-двух ядер, магазину с тысячами товаров нужно 4 ГБ и два ядра. Память важнее ядер: когда её не хватает, сайт тормозит или падает, а лишнее ядро без памяти почти ничего не даёт. Ниже покажу, как посчитать память под свой сайт и как узнать, сколько он тратит на самом деле.
  • KVM или OpenVZ: что выбратьВ 2026 году почти всегда стоит брать KVM: он дороже OpenVZ на десятки рублей в месяц, зато на нём работает всё, от Docker до Windows. OpenVZ оправдан в узком случае, и ниже видно, в каком, а в конце — команды, которыми можно проверить свой сервер за минуту.
  • NVMe или SSD: есть ли разница для сайтаДля небольшого сайта разница между NVMe и SSD почти незаметна: страницы отдаются из памяти, а не с диска. Она появляется у магазинов и сайтов с большой базой данных. При этом NVMe у того же хостера стоит всего на 45–80 ₽ в месяц дороже, а иногда и дешевле, так что решает обычно не тип диска, а объём и то, как хостер его ограничил.
  • Что такое VPS простыми словамиVPS — это часть мощного физического сервера, которую вам сдают в аренду и которая ведёт себя как отдельный компьютер: со своей системой, своим IP-адресом и полным доступом. Ниже — чем он отличается от хостинга, кому нужен, сколько стоит и что проверить сразу после покупки.
  • VPS для Telegram-бота: что нужно боту и как выбрать тарифБоту с меню и парой команд хватает самого дешёвого сервера, а бот с рассылками, файлами и базой упирается совсем в другие ресурсы. Разбираем, что на самом деле потребляет бот, какие ограничения Telegram влияют на выбор сервера и как не переплатить.
  • Как проверить пинг и скорость VPS до оплатыЦифры в тарифе не говорят, какой будет задержка до ваших пользователей и как быстро работает диск. Большую часть этого можно измерить до оплаты, остальное — в первый час работы сервера. Разбираем инструменты и то, как читать результаты.
  • Корпоративная сеть на VPS: удалённый доступ к офисуАрендованный сервер может стать центром частной сети компании: через него сотрудники из дома и филиалы подключаются к 1С, файловому хранилищу, CRM и Git. Разбираем схемы, протоколы, требования к серверу и базовую защиту.
  • Как выбрать VPS: 7 параметров, которые решаютДва тарифа с одинаковыми «2 ядра, 4 ГБ, 50 ГБ» могут отличаться по скорости в разы и по цене через год — вдвое. Разбираем, что стоит за каждой строкой тарифа и на что смотреть до оплаты.
  • VPS или VDS: есть ли разница и что на самом деле важноНа российском рынке VPS и VDS чаще всего означают одно и то же — виртуальный сервер. Разница, которая действительно влияет на работу, прячется не в названии, а в типе виртуализации и в том, гарантированы ли ресурсы.