TürkiyeVPS

Установка Docker на Ubuntu 24.04 и первый контейнер

Ставим Docker на VPS с Ubuntu 24.04 из официального репозитория, запускаем первый контейнер и поднимаем постоянный сервис через Docker Compose. Плюс ловушка с UFW и советы для VPS с малой RAM.

6 мин чтения

Больше всего времени при развёртывании приложения обычно уходит на зависимости: не та версия 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).