Docker на VPS: коли він потрібен, а коли краще обійтися без нього
Ускладнення структури веб-додатків, що створюються, вимагає нових підходів до їх розробки та управління. Це, наприклад, стосується розподілених багатокомпонентних додатків, які використовують спільне програмне середовище для своєї роботи. Docker на VPS — це платформа, здатна забезпечити умови існування такого середовища та надати механізм управління компонентами додатка. Спробуємо розібратися — використовувати Docker чи звичайну інсталяцію на своєму VPS.
Що таке Docker простими словами
Це одна з основних реалізацій стандарту OCI (Open Container Initiative), який визначає формат і методи управління віртуальним середовищем на рівні операційної системи, що отримало назву «контейнерне середовище».
Випускається у двох варіантах — у вільно розповсюджуваній версії за ліцензією Apache 2.0 (версія CE) та у вигляді комерційного ПЗ (версія Enterprise).
На відміну від традиційних віртуальних машин (VM), контейнери не містять «власної» ОС і, отже, мають значну перевагу в розмірах споживаних ресурсів, гнучкості та переносимості. Це дозволяє ефективно керувати розподіленими веб-додатками, що складаються з декількох компонентів або мікросервісів.
Крім того, контейнери Docker на VPS мають таку важливу властивість, як ізоляція, яка забезпечується одразу на кількох рівнях — файлової системи, процесів та мережі. Це є надійною гарантією безпечного виконання коду контейнера з обмеженою областю дії, встановленою за замовчуванням.
До складу основного ПЗ платформи входить сервер контейнерів (демон) та набір клієнтських програм для керування контейнерами та шаблонами за допомогою інтерфейсу CLI.
Платформу можна легко розгорнути на всіх основних типах ОС — Windows, Linux, macOS та будь-якій Unix-подібній системі.
У публічному репозиторії платформи зібрано шаблони найвідоміших додатків; завантаживши їх, можна отримати контейнери з тими чи іншими властивостями, які згодом можна змінити відповідно до своїх потреб.
Коли Docker є зручним
Переваги платформи порівняно з віртуальними машинами (VM) дають змогу використовувати її для вирішення багатьох завдань — як під час індивідуального використання, так і під час роботи в команді розробників у виробничому середовищі.
Наведемо рекомендовані напрямки використання технології на практиці:
Для виконання високих вимог щодо ізоляції та безпеки середовища виконання. Додатки, запущені всередині контейнера, не взаємодіють з операційною системою безпосередньо і, отже, є безпечними. Виникнення критичних помилок може призвести лише до закриття додатка.
Створення переносних додатків. З’являється можливість міграції контейнерних середовищ виконання між фізичними або VPS-серверами без урахування вимог до процесора та гіпервізора, як це, наприклад, потрібно для віртуальних машин. Такий додаток працюватиме на всіх пристроях, де встановлено Docker (єдина вимога).
Ефективне управління багатокомпонентними додатками. У таких додатках зазвичай кожен компонент реалізується у вигляді мікросервісу, розміщеного в окремому контейнері. Використання пакетного менеджера Compose на сервері забезпечує автоматичне управління (оркестрацію) усіма контейнерами та їхній одночасний запуск/зупинку за допомогою однієї команди.
Спрощення процесів безперервної інтеграції та розгортання (CI/CD). Цьому сприяє стандартизація середовищ на кожному етапі процесу CI/CD. При цьому значно зростає швидкість розгортання, тестування та доставки. У підсумку загальна швидкість виконання процесу може збільшитися у 5–7 разів.
Інтеграція з Kubernetes для управління кластерами серверів. Це дозволяє масштабувати проєкт будь-якого рівня до кластера будь-яких розмірів, а також здійснювати одночасні розгортання та виконувати інші функції управління кластером.
Для тестування та налагодження мікросервісів. Можливості внутрішнього протоколу виявлення сервісів (Service Discovery) платформи забезпечують автоматичне підключення до загальної мережі контейнерів із мікросервісами за псевдонімом, що дуже зручно для тестування та налагодження.
Запуск веб-сервера для «роздачі» frontend-частини додатка, запуск БД та проксірування на backend-частину.
Робота з кількома дистрибутивами Linux в межах одного сервера.
Для створення експериментальних середовищ розробки. Ізольованість контейнерів та наявність команд управління з простим синтаксисом дозволяють реалізувати будь-який експериментальний проєкт без великих витрат ресурсів із дотриманням правил безпеки. Можна створити власну бібліотеку шаблонів для різних середовищ та версій ПЗ, яку використовувати для створення потрібних конфігурацій без конфлікту ПЗ на сервері.
Потужна екосистема. Тисячі готових шаблонів та інструментів у публічному доступі на DockerHub дозволяють за лічені хвилини отримати готове базове програмне середовище та адаптувати його під свої потреби.
Коли достатньо звичайної інсталяції ПЗ
Docker на VPS автоматизує та прискорює процеси розробки та супроводу ПЗ, однак все ж є ситуації, коли його використання може бути зайвим. З’ясуємо, чи потрібен Docker для сайту.
Коли Docker на VPS може бути зайвим:
- У разі використання конкуруючих інструментів автоматизації, наприклад, таких, як Podman від компанії Red Hat або Ansible;
- Якщо на сервері працює лише одна програма, база даних і веб-сервер. Тоді системні пакети можна завантажити з репозиторію, а процесом керуватиме systemd — підсистема ініціалізації та керування службами в Linux;
- Якщо немає потреби в масштабуванні або перенесенні проєкту;
- Коли обмежені ресурси оперативної пам’яті (RAM) сервера (1–2 Гб), оскільки DockerEngine «навантажує» пам’ять процесами runtime, containerd та dockerd, що може призвести до спрацьовування механізму захисту OOM killer;
- Під час створення ігрового сервера. Наприклад, налаштувати порти для Rust або Minecraft складніше через NAT, який створюється інструментом bridge платформи;
- Під час роботи сервісів, чутливих до затримок, наприклад, IoT-брокерів або VoIP;
- Для блогу або домашнього сховища краще не використовувати цю технологію через необхідність постійного «прибирання сміття» та впорядкування шаблонів на диску VPS.
Docker Compose та типові конфігурації
Compose — це надбудова над DockerEngine, яка дозволяє автоматизувати процеси управління багатоконтейнерними додатками. Без неї доводиться керувати кожним контейнером окремо, а з Docker Compose на сервері достатньо однієї команди, наприклад, запуску чи зупинки, і вона запустить / зупинить усі контейнери додатка.
Docker Compose на сервері можна використовувати для поділу «тіла» додатка на кілька сервісів, які взаємодіятимуть за допомогою веб-запитів. Це, наприклад, можуть бути такі варіанти: сайт + БД + Redis, бот + база.
Цей плагін також можна використовувати для запуску платформи n8n із необхідними сервісами та створення середовищ розробки на віддаленому сервері й локальній системі з однаковими конфігураціями.
Конфігурація проєктів у Compose здійснюється за допомогою файлів docker-compose у форматі YAML, де можна підключити потрібні томи для контейнерів, встановити змінні середовища та налаштувати порти.
Для встановлення Compose достатньо наявності на сервері розгорнутого DockerEngine.
Продемонструємо використання Compose на практичному прикладі, який показує, як можна розгорнути Redis у контейнері на Linux.
Розділимо процес на кілька етапів:
- Підготовка програмного середовища;
- Встановлення Docker та плагіна Compose;
- Створення YAML-файлу для управління проєктом;
- Запуск Redis.
Підготовка програмного середовища
Оновлюємо пакети на Linux VPS:
$ sudo apt update && apt list –upgradable
Розширюємо можливості менеджера пакетів apt:
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
Завантажуємо ключ із репозиторію платформи:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
Додаємо репозиторій платформи до списку дозволених джерел даних:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Встановлення Docker та Compose
Продемонструємо, як можна встановити Docker на VPS. Запускаємо процес встановлення вільно розповсюджуваної версії продукту:
$ sudo apt install docker-ce
Після завершення встановлення перевіряємо стан служби в системі:
$ sudo systemctl status docker
Якщо все гаразд, у відповіді має з’явитися:
docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2026-08-29 10:35:48 UTC; 1 week 6 days ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 757355 (dockerd)
Tasks: 10
Memory: 35.3M
CPU: 4min 12.066s
CGroup: /system.slice/docker.service
└─757355 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Це означає, що демон сервісу запущено (PID=757355) і контейнерне середовище підготовлено до роботи.
Встановлюємо Compose:
$ apt install docker-compose
Після завершення встановлення перевіряємо версію плагіна:
$ docker-compose --version
У результаті маємо отримати приблизно таке:
docker-compose version 1.25.0, build unknown
Надаємо права на запуск плагіна:
chmod +x /usr/local/bin/docker-compose
Створення YAML-файлу проєкту
Файл із назвою docker-compose.yaml має знаходитися в кореневій директорії проєкту. У нашому випадку він міститиме конфігурацію контейнера для Redis.
Створюємо каталог проєкту з довільною назвою redis:
$ mkdir /home/redis && cd /home/redis
Вміст файлу може бути таким:
version: '3.3' // версия формата файла сервиса services: // раздел для определения контейнеров проекта redis: // имя сервиса image: redis:latest // имя шаблона, из которого будет создан контейнер restart: always // команда перезапуска контейнера в случае сбоя ports: - "6379:6379" // указание портов контейнера и хоста volumes: // задаём директории внутри контейнера - /path/to/local/dаta:/root/redis - /path/to/local/redis.conf:/usr/local/etc/redis/redis.conf environment: // устанавливаем переменные окружения для контейнера - REDIS_PASSWORD=my-password - REDIS_PORT=6379 - REDIS_DATABASES=12
Зберігаємо файл.
Запуск Redis
Запускаємо контейнер Redis у фоновому режимі:
$ sudo docker-compose up -d
Перевіряємо, чи запущено контейнер:
docker ps | grep redis
Якщо все гаразд, назва Redis має бути у списку активних контейнерів.
Які ресурси VPS слід враховувати
Повноцінне функціонування платформи на сервері можливе за умови дотримання вимог до низки ресурсів VPS. Розглянемо їх детальніше.
Що важливо при виборі сервера для Docker:
Тип віртуалізації. У своїй роботі платформа активно використовує можливості ядра Linux, overlay-шари файлів, namespaces, мережеві мости, cgroups та інші ресурси. Тому важливо виключити наявність обмежень з боку сервера. Це можливо за умови використання одного з сучасних типів апаратної віртуалізації, наприклад, таких, як VMware або KVM.
Операційна система. Тут на перший план виходять вимоги щодо стабільності ОС та актуальності версії, оскільки можуть виникнути проблеми з overlay2, nftables або cgroups, що заважатиме нормальній роботі сервісу. Перевірити систему можна за допомогою команди cat /etc/os-release.
CPU. Для цієї технології важливий тип навантаження, щоб процесор не став «вузьким місцем» у роботі проєкту. Наприклад, для бота з API у двох невеликих контейнерах вистачить 1 vCPU; для сайту з БД, Redis і proxy — 2 vCPU; для збірки шаблонів або CI/CD знадобиться щонайменше 4–6 vCPU.
RAM. Сама платформа споживає мінімум пам’яті, але, наприклад, Python-процеси, Java, Node.js або система логування можуть легко призвести до її переповнення. Ознаками переповнення є: мимовільний перезапуск контейнерів, видача сайтом помилок 502 або 504, уповільнена реакція сервера, OOM-повідомлення в логах, нестабільна робота БД. Перевірити наявність цього ресурсу на сервері можна за допомогою команд docker stats або free -m. Перевірити логи можна за допомогою команди journalctl -k | grep -i oom.
Диски. Цей ресурс активно використовується для зберігання шаблонів, томів, БД, tmp-файлів, логів та бекапів. Його нестача проявляється у сповільненні роботи системи. Тому, наприклад, для продакшену, де швидкість є критичною, найкраще підійде NVMe SSD. Перевірити диски можна за допомогою команд: df -h або lsblk. Виконати очищення невикористовуваних даних: docker system prune.
Мережа та порти. У YAML-файлах потрібно правильно з’єднати зовнішні порти сервера з внутрішньою мережею контейнерів. Наприклад, щоб контейнер був доступний для зовнішнього сервісу, потрібно опублікувати його порт. Перевірити опубліковані порти Docker на VPS можна за допомогою команди docker ps. Перевірити порти сервера можна за допомогою команди ss -tulpn.
Volumes і резервні копії. Необхідно враховувати, що доведеться створювати резервні копії даних, які платформа зберігає в різних місцях: у контейнері, bind mount, volume, БД. Тому потрібно знати — що і де знаходиться. Наприклад, дані можуть зберігатися у volume або bind mount. Перевірити це можна за допомогою команди: docker volume ls. Для зберігання резервних копій у структурі проєкту передбачено каталог із назвою backups.
Типові помилки
Наведемо типові помилки, яких зазвичай припускаються користувачі на початковому етапі використання Docker на VPS:
- Встановлення неправильних відступів у YAML-файлах;
- Не виконується перебудова контейнерів (команда docker compose up -d –build);
- Відсутні або неправильно встановлені значення змінних середовища;
- Відкриті «зайві» порти;
- Відсутність резервних копій томів;
- Контейнеризація всього підряд;
- Використання команд із застарілим синтаксисом.
Docker та безпека
Щоб уникнути злому або витоку персональних даних, слід дотримуватися низки правил. Наведемо їх:
- По можливості використовувати лише офіційні версії шаблонів із перевірених джерел;
- Увімкнути та налаштувати брандмауер;
- Обмежити доступ до SSH;
- Закрити всі невикористовувані порти;
- Регулярно оновлювати версії ПЗ платформи;
- Не зберігати облікові дані в головному конфігураційному файлі, а використовувати для цього змінні середовища;
- Регулярно оновлювати шаблони;
- Не зберігати секретні дані в шаблонах;
- Зберігати файл .env поза межами публічних каталогів;
- Перевіряти відкриті порти одразу після внесення змін до YAML-файлу;
- Не публікувати в YAML-файлах внутрішню БД проєкту;
- Не запускати контейнери від імені користувача root;
- Не запускати контейнери з опцією --privileged без вагомих причин.
Як вибрати VPS для Docker-проєкту
Щоб отримати максимальну віддачу від використання платформи, потрібно правильно вибрати VPS з урахуванням наведених вище вимог до ресурсів. Лише в цьому випадку платформа полегшить управління проєктом, а не ускладнить його.
Наведемо конкретні кроки щодо вибору та перевірки роботи VPS для Docker:
- Скласти перелік контейнерів проєкту, врахувавши кількість додатків і БД, кеш, проксі, черги, обробники, логи, бекапи та staging-контейнери;
- Вибрати VPS-сервер для Docker з апаратною віртуалізацією;
- Визначитися з ОС — для проектів невеликого та середнього рівнів добре підійдуть Ubuntu LTS, Debian stable або AlmaLinux;
- Вибрати CPU, RAM та диски відповідно до наведених рекомендацій та з урахуванням складеного списку контейнерів;
- Налаштувати SSH, брандмауер, часовий пояс та системні оновлення;
- Розгорнути Docker Engine та Compose plugin;
- Налаштувати зберігання даних проєкту у volumes або bind mounts;
- Налаштувати резервні копії для volumes, БД та файлів конфігурації проєкту;
- Запустити реальний compose-проєкт;
- Перевірити функцію автозапуску контейнерів під час перезавантаження;
- Перевірити запис даних у томах;
- Зробити тестове резервне копіювання з подальшим відновленням;
- Промоніторити роботу сервера під навантаженням за допомогою команди docker stats.