Блог
DevOps · guideDevOps 7 мин чтения

Установка Docker + docker-compose на Ubuntu 24.04 за 10 минут

Практический гайд по установке Docker Engine и docker compose plugin на Ubuntu 24.04. Официальный apt-репозиторий, non-root запуск, автозагрузка, первый контейнер, типичные грабли.

Docker — базовый инструмент любого современного DevOps-стека. Ниже — минимально-достаточный гайд, чтобы за 10 минут получить рабочий Docker Engine + docker compose на Ubuntu 24.04 (LTS), с non-root запуском и автозагрузкой при ребуте.

Никакой воды, никаких deprecated docker-compose (с дефисом) — только актуальные команды 2026 года.

Шаг 1. Удалить старые версии, если есть

Даже на чистой Ubuntu иногда стоят старые пакеты docker.io из universe-репозитория. Удаляем — иначе будет конфликт с официальными.

sudo apt remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true

Шаг 2. Подключить официальный apt-репозиторий Docker

Docker Inc. поддерживает свой репозиторий с последними стабильными версиями. Копируем GPG-ключ, добавляем source.list.

sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  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 + Compose plugin

Один пакет docker-ce, второй — docker-compose-plugin. Именно plugin, а не deprecated python-based docker-compose.

sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

# проверка
docker --version           # Docker version 26.x
docker compose version     # Docker Compose version v2.x

Шаг 4. Non-root запуск

По умолчанию Docker требует sudo. Правильно — добавить свой user в группу docker, тогда команды работают без sudo.

ВНИМАНИЕ: членство в группе docker = фактические права root (через docker run --privileged -v /:/host). На проде используйте только для управляющих user'ов, не для сервисов.

sudo usermod -aG docker $USER
# перелогиниться (Ctrl+D + повторный ssh) или:
newgrp docker

# проверка без sudo:
docker run --rm hello-world

Шаг 5. Автозагрузка при ребуте

Docker daemon должен стартовать автоматически.

sudo systemctl enable docker.service
sudo systemctl enable containerd.service
sudo systemctl start docker.service

# статус
sudo systemctl status docker

Шаг 6. Первый docker-compose-стек

Проверяем, что compose работает. Мини-стек с nginx и Postgres.

# docker-compose.yml
services:
  web:
    image: nginx:1.27-alpine
    ports:
      - "8080:80"
    restart: unless-stopped
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: change_me
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  pgdata:

Шаг 7. Запуск и проверка

Стек стартует одной командой. Проверяем, что nginx отвечает на 8080.

docker compose up -d
docker compose ps
curl -I http://localhost:8080   # HTTP/1.1 200 OK

# логи
docker compose logs -f web

# остановить
docker compose down             # оставит volume
docker compose down -v          # удалит volume

Типичные грабли

Что чаще всего ломается у новичков.

  • "Cannot connect to Docker daemon" — забыли перелогиниться после usermod -aG docker.
  • "port already in use" — конфликт с локальным nginx/apache. sudo lsof -i :8080 покажет виновника.
  • Медленная сеть в контейнере — старый MTU у виртуализованных NIC. docker network create --opt com.docker.network.driver.mtu=1450 mynet.
  • Overlayfs vs zfs — на VPS с zfs-root Docker медленный. Использовать overlay2 (по умолчанию с 20.04+).
  • "Cannot allocate memory" — swap выключен на VPS + OOM. Включить swap-файл 2 ГБ или дать больше RAM VPS.
Осторожно

Никогда не публикуйте порты БД (5432, 3306, 6379) наружу через ports:. Используйте только expose: — тогда контейнер виден только другим контейнерам в той же compose-сети.

Частые вопросы

Обязательно ли ставить containerd отдельно?
Он поставится автоматически как зависимость `docker-ce`. Отдельно `containerd.io` установка не нужна.
Docker Desktop vs Docker Engine на Ubuntu?
На сервере — только Docker Engine (это то, что мы ставили). Docker Desktop — GUI-обёртка для macOS/Windows, на Linux-сервере не нужна.
Podman вместо Docker — стоит?
На CentOS/Rocky/RHEL — да, там Podman нативен. На Ubuntu — Docker привычнее и лучше документирован. Синтаксис почти совместим.