Как установить Docker и Docker Compose на Ubuntu 24.04
Это руководство пошагово показывает, как установить Docker Engine и плагин Compose v2 на Ubuntu 24.04 из официального apt-репозитория Docker: именно этот способ поддерживает и своевременно обновляет сам Docker. Оно написано для тех, кто администрирует собственный VPS или выделенный сервер и хочет чистую установку без snap-пакетов и скриптов, скачиваемых напрямую в shell. В конце у вас будет рабочий стек из двух контейнеров, и вы будете знать, где на диске на самом деле лежат его данные.
Что понадобится перед началом
Вам нужна Ubuntu 24.04 (Noble) с пользователем, имеющим права sudo, и исходящий доступ в интернет. Сам Docker Engine легковесен, но контейнеры, которые вы на нем запускаете, нет. Для экспериментов хватит 1 vCPU и 1 GB RAM, но для всего, что должно работать постоянно, комфортный минимум: 2 vCPU и 4 GB RAM. Этого достаточно для веб-приложения, базы данных и периодической сборки образов без ухода в swap. Заложите не меньше 20 GB диска, потому что образы и кеш сборки накапливаются быстрее, чем кажется.
Если на сервере когда-либо стояли неофициальные пакеты Docker, сначала удалите их, чтобы они не конфликтовали с официальными:
sudo apt remove docker.io docker-doc docker-compose podman-docker containerd runc
Если apt сообщит, что ни один из них не установлен, это нормально.
Добавьте официальный apt-репозиторий Docker
Собственный пакет Ubuntu docker.io отстает на несколько версий и не включает Compose v2. Официальный репозиторий получает исправления безопасности в течение считанных дней после выхода, а для демона, работающего от root, это важно. Сначала установите зависимости и ключ подписи Docker:
sudo apt update sudo apt install 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 noble stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update
Установите Docker Engine и Compose v2
Одна команда устанавливает движок, CLI, containerd и два нужных плагина: Buildx и Compose v2.
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Сервис запускается и добавляется в автозагрузку автоматически. Проверьте обе части:
sudo systemctl status docker sudo docker run hello-world docker compose version
Контейнер hello-world скачивает крошечный образ, печатает подтверждение и завершается. Обратите внимание: Compose v2 - это подкоманда, docker compose через пробел, а не старый бинарный файл docker-compose.
Запуск Docker без sudo
По умолчанию к сокету Docker может обращаться только root. Добавьте своего пользователя в группу docker, чтобы обходиться без префикса sudo:
sudo usermod -aG docker $USER newgrp docker docker run hello-world
newgrp применяет группу в текущей оболочке; новые SSH-сессии подхватят ее автоматически. Честное предупреждение: членство в группе docker фактически означает root-доступ к этой машине, потому что контейнер может примонтировать файловую систему хоста. Добавляйте только те учетные записи, которым вы доверили бы root.
Реалистичный файл Compose: веб-приложение плюс база данных
Compose описывает стек из нескольких контейнеров в одном YAML-файле. Вот небольшой, но близкий к продакшену пример: WordPress с MariaDB, каждый в своем контейнере, с постоянными именованными томами.
mkdir -p ~/myapp cd ~/myapp nano docker-compose.yml
services:
web:
image: wordpress:6.5
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: change-me
depends_on:
- db
volumes:
- wp_data:/var/www/html
restart: unless-stopped
db:
image: mariadb:11
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wp
MARIADB_PASSWORD: change-me
MARIADB_ROOT_PASSWORD: change-me-too
volumes:
- db_data:/var/lib/mysql
restart: unless-stopped
volumes:
wp_data:
db_data:
Контейнер web обращается к базе просто по имени хоста db: Compose помещает оба сервиса в приватную сеть с DNS. Запустите стек и посмотрите на его состояние:
docker compose up -d docker compose ps docker compose logs -f web
docker compose down останавливает и удаляет контейнеры, но тома сохраняет, поэтому данные переживают перезапуски и обновления образов.
Где на самом деле лежат данные
Именованные тома: это каталоги, которыми управляет Docker, в /var/lib/docker/volumes/. Для примера выше:
docker volume ls docker volume inspect myapp_db_data
Все, что записано внутри контейнера вне тома, исчезает вместе с контейнером. Два правила избавляют от большинства потерь данных:
- Базы данных и загруженные файлы всегда держите на именованных томах или bind-монтированиях.
- Никогда не выполняйте
docker compose down -vне задумываясь: флаг-vудаляет тома вместе с контейнерами.
Для резервных копий выгружайте базу штатной утилитой (например, mariadb-dump через docker compose exec db), а не копируйте файлы работающей базы.
Очистка, ресурсы и дальнейшие шаги
Старые образы, остановленные контейнеры и кеш сборки незаметно съедают диск. Периодически проверяйте использование и чистите:
docker system df docker system prune docker system prune -a
Обычный prune удаляет остановленные контейнеры, висячие образы и неиспользуемые сети. Вариант с -a удаляет и все образы, которые не использует ни один работающий контейнер, поэтому при следующем деплое их придется скачивать заново. Тома ни одна из этих команд не трогает, пока вы явно не добавите --volumes, так что относитесь к этому флагу с той же осторожностью, что и к down -v.
О ресурсах: описанный стек в простое занимает примерно 500 MB RAM, и небольшие Docker-хосты обычно страдают от нехватки памяти, а не CPU. Если вы подбираете сервер под такую задачу, тариф с 2 vCPU и 4 GB RAM, например наш NVMe VPS в Риге, оставляет запас и стеку, и самой ОС, а по мере роста числа контейнеров ресурсы можно увеличить.
Читайте дальше
Готовы начать?
Запустите за минуты или обсудите с инженером, что подходит вашему проекту.