Как установить Docker на Ubuntu или Debian так, чтобы он обновлялся вместе с системой и не преподносил сюрпризов? Надёжный способ один — официальный репозиторий Docker. Ниже — установка Docker Engine, Compose и Buildx на Ubuntu 26.04, 24.04 и Debian 13 по шагам, настройки, которые стоит сделать сразу после установки, rootless-режим, закрепление версии и полное удаление.

Проверено 11 октября 2026 года на Ubuntu 24.04, Ubuntu 26.04 и Debian 13: Docker Engine 29.9.0, containerd 2.4.1, Docker Compose 5.6.0, Buildx 0.38.0. Команды взяты из документации Docker для Ubuntu и для Debian.

Что нужно заранее

  • Сервер с 64-битной Ubuntu 24.04, 26.04 или Debian 13 (процессор amd64 или arm64) и пользователь admin с правами sudo — см. первую настройку сервера.
  • Виртуализация KVM. На контейнерных VPS (OpenVZ, LXC) Docker часто не работает — как это проверить, описано в статье «VPS и VDS: в чём разница».

Какой способ установки выбрать

Docker можно поставить четырьмя способами. Версии — на 11 октября 2026 года:

Источник Ubuntu 24.04 Ubuntu 26.04 Debian 13
Репозиторий Docker (docker-ce) 29.9.0 29.9.0 29.9.0
Репозиторий дистрибутива (docker.io) 29.1.3 29.1.3 26.1.5
Snap (docker, канал stable) 29.8.0 29.8.0 —

Пакет docker.io из репозитория дистрибутива собирают сопровождающие Ubuntu и Debian. Он получает исправления безопасности, но не новые версии: в Debian 13 это Docker 26.1 — на три основные версии старше текущей. Compose к нему ставится отдельным пакетом (docker-compose-v2 в Ubuntu, docker-compose в Debian) и тоже отстаёт. Документация, ответы на форумах и сами образы рассчитаны на свежий Docker — со старым часть возможностей не заработает.

Snap собирает Canonical. Версия свежая, но у пакета свои ограничения (README пакета): Docker видит файлы только внутри домашнего каталога, настройки лежат в /var/snap/docker/current/config/daemon.json вместо /etc/docker/daemon.json, а --security-opt no-new-privileges не даёт контейнеру запуститься. Кроме того, snap обновляется автоматически, и при обновлении служба Docker перезапускается в момент, который выбрали не вы.

Скрипт get.docker.com ставит пакеты из того же репозитория Docker, но сам Docker не рекомендует его для продакшена: скрипт не даёт выбрать версию и выполняет много действий без вопросов.

Дальше — установка из репозитория Docker: свежие версии, обновления через apt, стандартные пути и поддержка производителя.

Шаг 1. Удалить конфликтующие пакеты

Если на сервере уже стоят docker.io, containerd или runc из репозитория дистрибутива, они будут мешать официальным пакетам. Удалите их.

На Ubuntu:

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)

На Debian:

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc docker-buildx podman-docker containerd runc | cut -f1)

dpkg --get-selections оставляет в списке только установленные пакеты. На сервере с docker.io команда покажет:

The following packages will be REMOVED:
  containerd docker-compose-v2 docker.io runc

Если ничего из списка нет, dpkg напишет no packages found matching …, а apt — что удалять нечего. Это нормально.

Образы, контейнеры и тома в /var/lib/docker при этом не удаляются. Если старые данные не нужны, удалите и их — команды в разделе «Как удалить Docker».

Шаг 2. Подключить репозиторий Docker

Ключ, которым подписаны пакеты, кладём в /etc/apt/keyrings, а описание репозитория — в файл /etc/apt/sources.list.d/docker.sources в формате deb822. Строка Signed-By разрешает этому ключу подписывать только репозиторий Docker, а не любые пакеты в системе.

Ubuntu 24.04 и 26.04:

sudo apt update
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

sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

Debian 13 — то же, но с адресом linux/debian:

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

sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

Команды внутри $( … ) подставляют кодовое имя системы и архитектуру. Проверьте, что получилось:

cat /etc/apt/sources.list.d/docker.sources
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: arm64
Signed-By: /etc/apt/keyrings/docker.asc

В Suites должно быть noble для Ubuntu 24.04, resolute для 26.04 и trixie для Debian 13, в Architectures — amd64 или arm64. В выводе apt update появятся строки с download.docker.com без ошибок.

Шаг 3. Установить Docker Engine

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

Что ставится:

  • docker-ce — сам Docker Engine, служба dockerd;
  • docker-ce-cli — команда docker;
  • containerd.io — среда, которая запускает контейнеры (containerd и runc);
  • docker-buildx-plugin — сборка образов (docker buildx, она же используется в docker build);
  • docker-compose-plugin — Compose как подкоманда docker compose.

Служба Docker запускается сразу после установки. Проверьте версию и тестовый контейнер:

sudo docker version --format '{{.Server.Version}}'
sudo docker run --rm hello-world
29.9.0
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
…
Hello from Docker!
This message shows that your installation appears to be working correctly.

Если вы видите Hello from Docker!, Docker скачал образ из Docker Hub, создал контейнер и запустил его — установка работает.

Автозапуск Docker после перезагрузки

Пакеты из репозитория Docker сами включают службы в автозапуск:

systemctl is-enabled docker containerd
enabled
enabled

Мы проверили перезагрузкой на всех трёх системах: после старта systemctl is-active docker отвечает active. Если у вас disabled, включите вручную:

sudo systemctl enable --now docker.service containerd.service

Контейнеры после перезагрузки поднимаются, только если у них задана политика перезапуска (--restart unless-stopped или restart: в Compose) — подробно об этом в статье «Docker Compose в продакшене».

Запуск docker без sudo: группа docker

Без sudo обычный пользователь получит ошибку:

permission denied while trying to connect to the docker API at unix:///var/run/docker.sock

Чтобы работать без sudo, добавьте пользователя в группу docker (её создаёт пакет):

sudo usermod -aG docker admin

Новая группа действует только в новом сеансе: выйдите с сервера и зайдите снова. Проверка:

id                  # в списке групп должна быть docker
docker run --rm hello-world

Группа docker равна правам root. Любой её участник может запустить контейнер, смонтировать в него любой каталог системы и читать или менять там что угодно. Пример — участник группы без sudo читает файл с хешами паролей, доступный только root:

docker run --rm -v /etc:/host-etc alpine head -c 40 /host-etc/shadow
root:*:20713:0:99999:7:::
daemon:*:20713

Так же можно изменить /etc/sudoers или добавить себе SSH-ключ root. Поэтому добавляйте в группу только тех, кому доверили бы sudo, а для автоматического деплоя под отдельным пользователем deploy помните, что ключ этого пользователя фактически даёт root. Подробнее — в разделе Docker daemon attack surface документации. Если нужен Docker без таких прав — смотрите rootless-режим ниже.

Docker Compose и Buildx

Compose и Buildx уже установлены как плагины:

docker compose version
docker buildx version
Docker Compose version v5.6.0
github.com/docker/buildx v0.38.0 0dbe87f36ed472fe36b6796c3f70b4210a731fc5

Команда пишется через пробел: docker compose. Старая отдельная программа docker-compose (через дефис, версия 1) давно не развивается — ставить её не нужно. Если в скриптах встречается docker-compose, замените на docker compose: формат файлов тот же.

Ограничить размер логов в /etc/docker/daemon.json

По умолчанию Docker хранит вывод контейнеров в JSON-файлах без ограничения размера, и за несколько месяцев они могут занять весь диск. Задайте ротацию сразу после установки, пока контейнеров нет:

sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
EOF
sudo dockerd --validate --config-file /etc/docker/daemon.json
sudo systemctl restart docker

dockerd --validate проверяет файл до перезапуска и отвечает configuration OK. Это стоит делать всегда: с ошибкой в JSON служба Docker не запустится. Проверка, что настройка применилась:

docker info --format '{{.LoggingDriver}}'                   # json-file
docker run -d --name logtest alpine sleep 60
docker inspect -f '{{.HostConfig.LogConfig}}' logtest       # {json-file map[max-file:3 max-size:10m]}
docker rm -f logtest

Теперь на каждый контейнер — не больше трёх файлов по 10 МБ. Настройка действует только на контейнеры, созданные после неё. Перезапуск службы Docker перезапускает и работающие контейнеры.

Закрепить версию Docker

Обычно Docker обновляется вместе с системой через apt upgrade. Если вам нужна определённая версия — например, ту же, что на других серверах, — посмотрите доступные:

apt list --all-versions docker-ce
docker-ce/trixie,now 5:29.9.0-1~debian.13~trixie arm64 [installed]
docker-ce/trixie 5:29.8.2-1~debian.13~trixie arm64
docker-ce/trixie 5:29.8.1-1~debian.13~trixie arm64

Установите нужную и запретите её обновлять:

VERSION_STRING=5:29.8.2-1~debian.13~trixie
sudo apt install -y --allow-downgrades docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
sudo apt-mark hold docker-ce docker-ce-cli

Строку версии копируйте из вывода apt list на своём сервере: в ней есть версия системы (ubuntu.24.04~noble, ubuntu.26.04~resolute, debian.13~trixie). --allow-downgrades нужен, только если вы откатываетесь на более старую версию. Теперь apt upgrade пропускает эти пакеты:

Not upgrading:
  docker-ce  docker-ce-cli

Снять запрет и обновиться до последней версии:

sudo apt-mark unhold docker-ce docker-ce-cli
sudo apt install -y docker-ce docker-ce-cli

Закреплять версию на одном сервере обычно незачем — закрепление полезно, когда несколько серверов должны работать одинаково. Не забывайте снимать запрет, иначе сервер останется без исправлений безопасности.

Rootless-режим: Docker без прав root

В rootless-режиме служба Docker работает от имени обычного пользователя, а не root. Если процесс сбежит из контейнера, он окажется на сервере с правами этого пользователя. Кому это нужно: серверам, где Docker пользуются несколько человек, и тем, кто не хочет отдавать права root через группу docker. Для одного своего сервера обычного режима достаточно.

Ограничения (документация): нельзя без дополнительной настройки открывать порты ниже 1024 (80 и 443 — тоже), не работают overlay-сети, данные хранятся в домашнем каталоге пользователя (~/.local/share/docker), у каждого пользователя — свои образы и контейнеры.

Rootless-режим заменяет обычный, поэтому сначала остановите системную службу:

sudo systemctl disable --now docker.service docker.socket
sudo rm -f /var/run/docker.sock

Установите uidmap (программы для пространств имён пользователей) и включите для пользователя службы, работающие без входа на сервер:

sudo apt install -y uidmap dbus-user-session
sudo loginctl enable-linger admin

Дальше — от имени admin. Зайдите по SSH именно под этим пользователем: через su или sudo -i пользовательский systemd может быть недоступен.

dockerd-rootless-setuptool.sh install

Скрипт создаёт пользовательскую службу docker.service, включает её и переключает команду docker на новый контекст rootless. В конце вывода:

[INFO] Installed docker.service successfully.
[INFO] To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
…
[INFO] Creating CLI context "rootless"
Current context is now "rootless"

Проверка:

docker info --format '{{.SecurityOptions}}'    # в списке есть name=rootless
docker run --rm hello-world

Мы проверили rootless-режим на Ubuntu 24.04: hello-world запускается, ограничения --memory и --cpus действуют. Внутри контейнера процесс видит себя root (uid=0), а на сервере тот же процесс принадлежит admin. После перезагрузки служба поднялась сама — за это отвечает enable-linger. На Ubuntu 24.04 и 26.04 дополнительный профиль AppArmor для rootless не нужен: пакет docker-ce-rootless-extras ставит его сам.

Убрать rootless-режим: dockerd-rootless-setuptool.sh uninstall от имени пользователя, затем sudo systemctl enable --now docker.service docker.socket.

Как удалить Docker

sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker /var/lib/containerd
sudo rm -rf /etc/docker
sudo rm /etc/apt/sources.list.d/docker.sources
sudo rm /etc/apt/keyrings/docker.asc

apt purge удаляет пакеты (у нас — Removing: 6, Freed space: 364 MB), но не трогает образы, контейнеры и тома в /var/lib/docker — их удаляет вторая команда, вместе со всеми данными в томах. /etc/docker после purge остаётся, если вы создавали там daemon.json. Настройки клиента лежат в ~/.docker каждого пользователя.

Если не работает

Что видно Что делать
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock Пользователя нет в группе docker или вы не перезашли после usermod. Проверьте id
failed to connect to the docker API at unix:///var/run/docker.sock … no such file or directory Служба не запущена: sudo systemctl start docker, причина — в journalctl -u docker -n 50
Job for docker.service failed после правки daemon.json Ошибка в файле. sudo dockerd --validate --config-file /etc/docker/daemon.json покажет её, например invalid JSON: invalid character '}'
E: Conflicting values set for option Signed-By regarding source https://download.docker.com/… Остался старый файл /etc/apt/sources.list.d/docker.list от прежней установки. Удалите его — достаточно docker.sources
Ошибка проверки подписи для download.docker.com: NO_PUBKEY … или Failed to parse keyring "/etc/apt/keyrings/docker.asc" Ключ не скачался или путь в Signed-By не совпадает с файлом ключа. Повторите шаг 2
apt не находит пакет docker-ce Репозиторий не подключён или в Suites неверное имя системы: cat /etc/apt/sources.list.d/docker.sources
Aborting because rootful Docker (/var/run/docker.sock) is running and accessible Для rootless остановите системную службу Docker, как описано выше
Порт контейнера доступен из интернета при включённом UFW Docker открывает опубликованные порты в обход UFW. Публикуйте внутренние сервисы на 127.0.0.1 — см. Docker Compose в продакшене

Что дальше