Docker на VPS решает главную боль самостоятельного администрирования: приложения перестают конфликтовать друг с другом. База данных, веб-приложение и кеш живут в изолированных контейнерах, каждый со своими зависимостями, и переносятся на другой сервер парой команд. В этой инструкции разберём установку Docker на Ubuntu 24.04 LTS из официального репозитория docker.com — единственно правильный способ получать свежие версии и патчи безопасности, — а затем запустим первые контейнеры и пройдёмся по базовым командам: docker run, docker ps, docker logs. Всё проверено на чистом сервере, займёт около 20 минут.
Почему Docker, а не установка «в лоб»
- Изоляция. Каждому сервису — свои версии библиотек. PostgreSQL 15 и 16 спокойно работают на одном сервере.
- Воспроизводимость. Контейнер, собранный на ноутбуке, идентично запускается на VPS — «у меня работало» уходит в прошлое.
- Чистота системы. Удалили контейнер — в системе не осталось хвостов из конфигов и зависимостей.
- Быстрый переезд. Миграция на другой сервер сводится к переносу томов и запуску тех же образов.
Docker требует KVM-виртуализации либо честного доступа к ядру — на контейнерных VPS (OpenVZ/LXC) он часто не работает или работает с ограничениями. У Cheap-Host все тарифы на KVM с полным root, так что Docker ставится без танцев с бубном. Для пары контейнеризованных проектов с базой данных берите тариф Pro — 750 ₽/мес за 12 vCPU, 16 ГБ RAM и 128 ГБ NVMe: контейнерам с постоянной записью на диск (базы, очереди) NVMe даёт ощутимый прирост.
Подготовка сервера
Предполагаем, что базовая настройка уже сделана: SSH-ключи, файрвол, отдельный пользователь с sudo. Если нет — начните с чек-листа первых шагов после покупки VPS. Обновите систему и удалите неофициальные пакеты Docker, если они ставились раньше:
sudo apt update && sudo apt upgrade -y
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove -y $pkg; done
Если пакеты не были установлены, apt просто сообщит об этом — это нормально.
Установка Docker на Ubuntu 24.04 из официального репозитория
Шаг 1 — добавляем GPG-ключ Docker:
sudo apt install -y 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
Шаг 2 — подключаем репозиторий download.docker.com:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
Шаг 3 — ставим Docker Engine со всеми плагинами:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Шаг 4 — проверяем установку тестовым контейнером:
sudo docker run hello-world
Если увидели «Hello from Docker!» — движок работает: образ скачался из Docker Hub, контейнер запустился, напечатал сообщение и завершился. Служба Docker уже добавлена в автозагрузку, убедиться можно так:
systemctl is-enabled docker
Запуск Docker без sudo
Чтобы не писать sudo перед каждой командой, добавьте своего пользователя в группу docker и перезайдите в сессию:
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world
Помните: группа docker де-факто даёт root-права на хосте, поэтому добавляйте в неё только доверенных пользователей. О принципах разграничения прав — в статье про работу не под root.
Первые контейнеры: run, ps, logs
Веб-сервер Nginx за одну команду
docker run -d --name web -p 8080:80 --restart unless-stopped nginx:alpine
Разберём флаги:
-d— запуск в фоне (detached);--name web— имя контейнера, чтобы не обращаться по ID;-p 8080:80— порт 8080 сервера проброшен на порт 80 внутри контейнера;--restart unless-stopped— автозапуск после ребута и падений;nginx:alpine— образ и тег (alpine — компактная сборка, ~50 МБ).
Откройте http://IP-сервера:8080 (порт нужно открыть в файрволе: sudo ufw allow 8080/tcp) — увидите приветствие Nginx.
Смотрим, что запущено
docker ps
docker ps -a
docker ps показывает работающие контейнеры: ID, образ, статус, проброшенные порты. С флагом -a — ещё и остановленные.
Читаем логи
docker logs web
docker logs -f --tail 100 web
-f — следить за логом в реальном времени, --tail 100 — показать последние 100 строк. Первое, что нужно смотреть, когда контейнер ведёт себя странно.
PostgreSQL с сохранением данных
Файловая система контейнера умирает вместе с ним, поэтому данные баз выносят в тома:
docker run -d --name db \
-e POSTGRES_PASSWORD=strong_password \
-v pgdata:/var/lib/postgresql/data \
-p 127.0.0.1:5432:5432 \
--restart unless-stopped \
postgres:16
Флаг -v pgdata:/var/lib/postgresql/data создаёт том pgdata — данные переживут удаление и обновление контейнера. А -p 127.0.0.1:5432:5432 пробрасывает порт только на localhost: база не будет доступна из интернета.
Шпаргалка по базовым командам
| Команда | Что делает |
|---|---|
docker ps | Список работающих контейнеров |
docker logs -f имя | Логи контейнера в реальном времени |
docker stop имя / docker start имя | Остановить / запустить контейнер |
docker rm имя | Удалить остановленный контейнер |
docker images | Список скачанных образов |
docker pull образ:тег | Скачать или обновить образ |
docker exec -it имя bash | Зайти внутрь работающего контейнера |
docker stats | CPU и RAM по контейнерам в реальном времени |
docker system prune | Удалить остановленные контейнеры и неиспользуемые образы |
Команда docker system df покажет, сколько места занимают образы, контейнеры и тома — полезно запускать периодически, чтобы NVMe-диск не зарастал старыми слоями.
Что дальше
Запускать каждый контейнер отдельной длинной командой быстро надоедает. Следующий шаг — описать всё приложение (сервис + база + Redis) одним YAML-файлом и поднимать командой docker compose up -d: разбираем это в статье про Docker Compose на практике. А если хотите контейнеризовать своё приложение — начните с руководства по деплою Node.js на VPS: сначала классический деплой, потом тот же сервис в Dockerfile.
FAQ
Чем docker-ce с docker.com лучше пакета docker.io из репозитория Ubuntu?
Официальный репозиторий даёт свежие версии Docker Engine, быстрые обновления безопасности и актуальные плагины buildx и compose. Пакет docker.io в Ubuntu обновляется реже и может отставать на несколько версий.
Сколько ресурсов VPS нужно для Docker?
Сам движок потребляет немного — порядка 100 МБ RAM. Ресурсы едят контейнеры: веб-приложение с базой и Redis комфортно живёт на 8–16 ГБ RAM. Для нескольких проектов подойдёт тариф Pro у Cheap-Host: 12 vCPU, 16 ГБ RAM, 128 ГБ NVMe за 750 ₽/мес.
Опасно ли добавлять пользователя в группу docker?
Членство в группе docker фактически эквивалентно root: через контейнер можно смонтировать любой каталог хоста. На личном VPS это приемлемый компромисс, но добавляйте в группу только доверенных пользователей.
Как сделать, чтобы контейнер запускался после перезагрузки сервера?
Запускайте с флагом --restart unless-stopped. Для уже работающего контейнера политику меняют командой docker update --restart unless-stopped имя.
Куда деваются данные при удалении контейнера?
Всё, что записано в файловую систему контейнера, удаляется вместе с ним. Базы данных и загруженные файлы выносите в тома через флаг -v, например -v pgdata:/var/lib/postgresql/data.
Вывод
Установка Docker на VPS с Ubuntu 24.04 занимает 20 минут: подключили официальный репозиторий docker.com, поставили docker-ce с плагинами, проверили hello-world — и можно поднимать сервисы одной командой docker run. Главные привычки с первого дня: тома для данных, --restart unless-stopped для автозапуска и проброс портов баз только на 127.0.0.1. Если под контейнеры нужен сервер — у Cheap-Host тариф Pro от 750 ₽/мес: KVM (Docker работает без ограничений), 12 vCPU, 16 ГБ RAM, NVMe, безлимитный трафик и автодеплой за 45–60 секунд. Конфигурации и цены — на cheap-host.onl.