Установка Docker на Ubuntu 24.04 и первый контейнер
Ставим Docker на VPS с Ubuntu 24.04 из официального репозитория, запускаем первый контейнер и поднимаем постоянный сервис через Docker Compose. Плюс ловушка с UFW и советы для VPS с малой RAM.
Больше всего времени при развёртывании приложения обычно уходит на зависимости: не та версия PHP, не хватает библиотеки, пакет конфликтует с другим проектом. Docker решает эту проблему: каждое приложение работает в своём контейнере вместе со всем, что ему нужно. В этой статье мы выполним установку Docker на Ubuntu 24.04, запустим первый контейнер и с помощью Docker Compose развернём сервис, который переживает перезагрузки. В итоге вы сможете поднимать n8n, Uptime Kuma или собственное приложение на VPS одной командой.
Что такое Docker и чем он отличается от виртуальной машины
Ваш VPS уже является виртуальной машиной со своим ядром и операционной системой. Контейнеры Docker — это изолированные процессы, которые используют ядро сервера. Поэтому они запускаются за секунды и почти не тратят ресурсы.
Для начала достаточно трёх понятий:
- Образ (image): упакованное приложение с зависимостями, доступное только для чтения (например,
nginxилиpostgres). - Контейнер (container): запущенный экземпляр образа.
- Том (volume): хранилище, где данные сохраняются даже после удаления контейнера.
Что понадобится
- VPS с Ubuntu 24.04 и пользователь с правами sudo.
- Базовые навыки работы в консоли. Если вы только начинаете, загляните в нашу статью про базовые команды Linux.
В репозиториях Ubuntu есть пакет docker.io, но ради актуальной версии и плагина Compose мы будем использовать официальный apt-репозиторий Docker.
1. Удаляем конфликтующие пакеты
Если Docker когда-то ставился другим способом, удалите старые пакеты. Если их нет, apt просто сообщит об этом:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove -y $pkg; done
2. Подключаем официальный репозиторий Docker
sudo apt-get update
sudo apt-get 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
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
В выводе последней команды должны появиться строки с download.docker.com. Для Ubuntu 24.04 кодовое имя — noble.
3. Устанавливаем Docker Engine и плагин Compose
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Служба запускается автоматически и добавляется в автозагрузку. Проверим:
sudo systemctl status docker --no-pager
docker --version
docker compose version
Отдельно скачивать Docker Compose не нужно: пакет docker-compose-plugin добавляет команду docker compose (v2, через пробел). Старая утилита docker-compose (через дефис) устарела.
4. Первый тест: hello-world
sudo docker run hello-world
Docker скачает образ с Docker Hub, запустит контейнер и выведет «Hello from Docker!». Если вы видите это сообщение — установка прошла успешно.
5. Docker без sudo
Чтобы не писать sudo перед каждой командой, добавьте пользователя в группу docker:
sudo usermod -aG docker $USER
newgrp docker
docker ps
Вместо newgrp можно просто перелогиниться.
Важно для безопасности: участник группы
dockerфактически имеет права root — он может смонтировать корневую файловую систему сервера в контейнер и изменить любой файл. Добавляйте в группу только тех, кому полностью доверяете.
6. Первый настоящий контейнер: Nginx
Запустим веб-сервер и опубликуем его на порту 8080:
docker run -d --name web -p 8080:80 nginx:stable
-d— запуск в фоне.--name web— понятное имя контейнера.-p 8080:80— порт 8080 сервера пробрасывается на порт 80 контейнера.
Откройте в браузере http://IP_СЕРВЕРА:8080 — появится приветственная страница Nginx. Команды, которые пригодятся каждый день:
docker ps # запущенные контейнеры
docker ps -a # все, включая остановленные
docker logs -f web # логи в реальном времени (выход — Ctrl+C)
docker exec -it web sh # зайти внутрь контейнера
docker stop web # остановить
docker rm web # удалить
7. Постоянный сервис через Docker Compose
Вместо длинных команд docker run удобнее описать сервис в файле. Для примера развернём Uptime Kuma — удобный мониторинг серверов и сайтов:
mkdir -p ~/uptime-kuma && cd ~/uptime-kuma
nano compose.yaml
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "127.0.0.1:3001:3001"
volumes:
- kuma-data:/app/data
volumes:
kuma-data:
docker compose up -d
docker compose ps
docker compose logs -f
Здесь важны три настройки:
restart: unless-stopped— если контейнер упадёт или сервер перезагрузится, он поднимется сам, пока вы не остановите его вручную. Другие варианты:no,always,on-failure.volumes— данные хранятся в томеkuma-dataи не пропадают при обновлении образа или пересоздании контейнера.127.0.0.1:3001:3001— порт доступен только с самого сервера, а наружу сервис публикуется через обратный прокси с HTTPS. Для быстрой проверки можно временно указать"3001:3001".
Обновление:
docker compose pull
docker compose up -d
Важно: опубликованные порты Docker обходят UFW
Это самая частая ловушка у новичков. Для опубликованных портов вроде -p 8080:80 Docker пишет собственные правила iptables, и они обрабатываются раньше правил UFW. Даже после ufw deny 8080 порт останется открытым в интернет.
Решение простое:
- Если сервис работает за обратным прокси (Nginx, Caddy), публикуйте порт с префиксом
127.0.0.1:— тогда он доступен только локально. - Порты баз данных (PostgreSQL, MySQL, Redis) не публикуйте вообще: сервисы из одного Compose-файла и так видят друг друга по имени.
- Регулярно проверяйте открытые порты командами
ss -tulpnиdocker ps.
Очистка диска
Образы и остановленные контейнеры со временем занимают место — на маленьких дисках это заметно:
docker system df # сколько места занимает Docker
docker system prune # удалить остановленные контейнеры, неиспользуемые сети и «висячие» образы
docker system prune -a удалит все неиспользуемые образы — при следующем запуске они скачаются заново. С флагом --volumes будьте осторожны: данные из томов не восстановить.
Docker на VPS с малым объёмом RAM
Сам Docker лёгкий, но контейнерам нужна память. На VPS с 512 МБ или 1 ГБ RAM спокойно работает один Nginx или небольшой бот, а связка «база данных + приложение + мониторинг» может уже не поместиться. Советы:
- Добавьте swap — он сгладит пики потребления памяти и убережёт контейнеры от OOM killer. Пошагово — в статье как добавить swap на Ubuntu VPS.
- Следите за потреблением памяти контейнерами через
docker stats. - Ограничивайте сервисы в Compose, например
mem_limit: 256m, чтобы один контейнер не съел всю RAM. - По возможности выбирайте компактные образы на базе
alpine.
Часто задаваемые вопросы
Чем пакет docker.io отличается от docker-ce?
docker.io берётся из репозитория Ubuntu и обычно отстаёт по версии. docker-ce ставится из официального репозитория Docker, обновляется чаще и идёт вместе с плагином docker compose. Ставить оба одновременно не нужно.
Какой сервер нужен для Docker?
Сам Docker Engine потребляет немного — всё зависит от приложений. Для одного веб-сервиса или бота хватит небольшого VPS. Для многоконтейнерных инструментов вроде n8n или проектов с базой данных комфортнее от 2 ГБ RAM.
Можно ли запустить n8n в Docker?
Да, Docker — один из рекомендуемых способов установки n8n. Пошаговая инструкция — в нашей статье про установку n8n на VPS.
VPS в Турции, готовый к Docker
Аренда VPS у нас — от $0.89 в месяц: сервер с Ubuntu 24.04 разворачивается автоматически через несколько минут после подтверждения оплаты, и с полным root-доступом вы сразу можете выполнить все команды из этой статьи. Если планируете держать несколько контейнеров постоянно, VDS от $1.69 в месяц с выделенными vCPU и гарантированной RAM даст более стабильную производительность. Во всех тарифах безлимитный трафик, серверы находятся в Стамбуле, оплата — в USDT (TRC20).
Читайте также
Если на VPS с 512 МБ или 1 ГБ RAM падают приложения, swap — первая помощь. Как добавить swap в Ubuntu 24.04, в...
Бот не должен засыпать вместе с ноутбуком. Пошагово: запуск Telegram-бота на Python 24/7 на VPS с Ubuntu 24.04...
Собираетесь запустить сервер Metin2, но не знаете, хватит ли VPS или нужен VDS? Сравниваем общий и выделенный...