Как установить 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 в продакшене |
Что дальше
- Как запустить приложение с базой и HTTPS через Compose и подготовить его к продакшену — Docker Compose в продакшене на одном VPS.
- Как настроить автоматический деплой контейнеров — деплой на VPS из GitHub Actions.
- Если сервер новый — сначала вход по SSH-ключу и первая настройка Ubuntu.
- Чем Docker занимает диск и как его чистить без потери данных — закончилось место на диске.