Docker на VPS: зачем нужен и как запустить
Docker упаковывает приложение вместе со всем, что ему нужно для работы, в контейнер - изолированную коробку, которая одинаково запускается на любом сервере. Это избавляет от классической проблемы "у меня работало, а на сервере нет" и превращает развёртывание в одну команду.
Разберём, зачем Docker на сервере, почему для него нужен именно KVM, как установить его на VPS, запустить контейнер и связать несколько сервисов через Docker Compose.
Что такое Docker и зачем он на сервере
Обычная установка приложения на сервер - это установка его самого, нужных библиотек, базы данных, настройка окружения. Всё это перемешивается с системой и другими проектами. Обновление одного может сломать другое.
Docker решает это через контейнеры. Контейнер - это приложение вместе со всеми зависимостями в одной изолированной упаковке. Что это даёт:
- Воспроизводимость. Контейнер запускается одинаково где угодно: на вашем ноутбуке и на сервере.
- Изоляция. Проекты не мешают друг другу: у каждого свои зависимости в своём контейнере.
- Простой деплой. Развёртывание сводится к запуску контейнера, а не к ручной настройке.
- Чистота системы. Удалили контейнер - на сервере не осталось хвостов.
Для VPS это особенно удобно: несколько сервисов уживаются на одной машине, не конфликтуя.
Почему для Docker нужен KVM
Важный момент, о который спотыкаются при выборе тарифа. Docker нормально работает только на KVM-виртуализации, а не на дешёвой контейнерной OpenVZ.
Причина в том, что OpenVZ - это уже контейнеры, работающие на общем ядре хоста. Запускать в них Docker (тоже контейнеры) - значит городить контейнеры в контейнерах, что либо не работает, либо ограничено и нестабильно. KVM даёт полноценную виртуальную машину со своим ядром, где Docker запускается штатно.
Проверяйте виртуализацию до заказа. Если планируете Docker, тариф должен быть на KVM. На OpenVZ Docker или не запустится, или будет работать с ограничениями.
Сколько ресурсов заложить
Сам Docker почти ничего не весит - ресурсы определяются тем, что вы в нём запускаете:
| Задача | vCPU | RAM | Диск |
|---|---|---|---|
| 1-2 небольших контейнера | 1 | 1 ГБ | 20 ГБ NVMe |
| Несколько сервисов (сайт + база) | 2 | 4 ГБ | 40 ГБ NVMe |
| Полный стек из контейнеров | 4 | 8 ГБ | 80 ГБ NVMe |
Диск берите с запасом: образы контейнеров и их данные занимают место, а старые образы имеют свойство накапливаться.
Установка Docker
Сначала базовая подготовка сервера - обновление и настройка безопасности, как в статье настройка VPS с нуля. Затем ставим Docker из репозитория системы:
sudo apt update
sudo apt install docker.io docker-compose-pluginПроверяем, что Docker установился и работает:
sudo docker run hello-worldЕсли увидели приветственное сообщение - Docker запустился и скачал первый контейнер. Чтобы не писать sudo перед каждой командой, добавьте пользователя в группу docker:
sudo usermod -aG docker $USERПосле этого перезайдите по SSH, и команды docker будут работать без sudo.
Запуск контейнера
Контейнер запускают одной командой. Например, веб-сервер Nginx:
docker run -d --name web -p 80:80 nginxРазберём флаги:
| Флаг | Что делает |
|---|---|
-d | Запуск в фоне |
--name web | Имя контейнера, чтобы к нему обращаться |
-p 80:80 | Проброс порта: порт сервера 80 к порту контейнера 80 |
nginx | Образ, из которого создаётся контейнер |
Посмотреть запущенные контейнеры:
docker psДанные, которые должны сохраняться между перезапусками, выносят в тома (volumes), иначе они пропадут вместе с контейнером. Это делают флагом -v, указывая папку на сервере.
Docker Compose для нескольких сервисов
Когда сервисов несколько - например сайт, база данных и кеш - запускать их по одному командами неудобно. Для этого есть Docker Compose: описываете все сервисы в одном файле docker-compose.yml, и они поднимаются вместе.
Пример структуры файла (сайт плюс база):
services:
web:
image: nginx
ports:
- "80:80"
restart: always
db:
image: postgres
environment:
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
restart: always
volumes:
db_data:Запуск всего стека одной командой из папки с файлом:
docker compose up -dСтрока restart: always - важная: она делает так, что контейнеры сами поднимаются после перезагрузки сервера и после падения. Это тот же принцип автозапуска, что и для сервисов через systemd.
Что разворачивают в Docker
- сайты и веб-приложения;
- базы данных PostgreSQL, MySQL, Redis;
- сервисы автоматизации вроде n8n;
- Telegram-боты;
- целые стеки из нескольких связанных сервисов;
- среды для разработки и тестирования.
Частые ошибки
Взяли OpenVZ под Docker. Docker в контейнерной виртуализации не запускается или работает с ограничениями. Нужен KVM.
Не вынесли данные в тома. Удалили контейнер - пропала база данных. Данные, которые должны сохраняться, кладут в volumes.
Забыли про автоперезапуск. Сервер перезагрузился, контейнеры не поднялись. restart: always решает это.
Не чистят старые образы. Со временем неиспользуемые образы забивают диск. Их periodically удаляют командой очистки.
Пробросили наружу порт базы данных. База в контейнере не должна смотреть в интернет без необходимости. Наружу пробрасывают только то, что действительно должно быть доступно.
Частые вопросы
Нужен ли особый VPS для Docker? Нужен VPS на KVM-виртуализации. На OpenVZ Docker не работает нормально. В остальном подойдёт обычный сервер, ресурсы зависят от того, что запускаете.
Docker и Docker Compose - это разное? Docker запускает отдельные контейнеры. Docker Compose управляет несколькими контейнерами сразу через один файл конфигурации. Compose удобен, когда сервисов больше одного.
Сколько ресурсов нужно под Docker? Сам Docker почти ничего не потребляет. Ресурсы определяются контейнерами: для пары небольших хватит 1 ГБ памяти, для полного стека - 8 ГБ и больше.
Как сделать, чтобы контейнеры запускались после перезагрузки? Флагом --restart=always при запуске или строкой restart: always в Docker Compose. Тогда контейнеры поднимаются сами после перезагрузки сервера и после падения.
Не потеряю ли я данные при перезапуске контейнера? Потеряете, если не вынесли их в тома. Всё, что должно сохраняться (базы, загрузки), кладут в volumes - тогда данные переживают пересоздание контейнера.
Docker заменяет виртуальную машину? Нет, это разные вещи. Виртуальная машина эмулирует целый компьютер, Docker изолирует приложения на уровне одной системы. Docker легче и быстрее, но работает поверх ОС, а не вместо неё.
Нужен VPS под Docker? Серверы на KVM и NVMe - полноценная виртуализация, где Docker работает штатно, без ограничений OpenVZ. Активация за 3 минуты, ресурсы меняются за минуты. Первые 7 дней - тестовый период с возвратом средств.
Что дальше
- Тарифы VPS и VDS в Москве и Казани: NVMe, защита от DDoS, активация за 3 минуты
- GPU-серверы с RTX 4090: для инференса, дообучения моделей и AI-ботов, почасовая оплата