
Установка из официального репозитория Docker
Репозиторий Docker даёт актуальный движок вместе с плагинами buildx и Compose в одном наборе пакетов. Пакеты из репозиториев Ubuntu обновляются вместе с дистрибутивом и потому отстают, а snap-версия живёт в изолированной среде со своими путями. Последовательность ниже не привязана к кодовому имени релиза, поэтому одинаково работает на текущих LTS.
Читайте также: Python 3.12: как скачать и установить на Windows, macOS, Linux, Как создать пользователя в Linux: useradd, пароль и права.
Если раньше ставили docker из репозиториев Ubuntu, эти пакеты конфликтуют с пакетами Docker Inc. Уберите их; образы и контейнеры при удалении пакетов не пропадают — они лежат в /var/lib/docker и /var/lib/containerd.
sudo apt remove docker docker-engine docker.io containerd runc
sudo apt update
sudo apt install -y ca-certificates curl gnupg
Затем добавьте GPG-ключ и сам источник. Ключ кладётся в /etc/apt/keyrings — отдельный каталог для сторонних репозиториев, на который ссылается параметр signed-by.
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 "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
Подстановка $VERSION_CODENAME берёт кодовое имя из /etc/os-release, а $(dpkg --print-architecture) — архитектуру (amd64 или arm64). Править строку руками при переходе на новый LTS не нужно.
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world
Приветствие от hello-world означает, что движок запущен и может скачивать образы. sudo в проверке нужен потому, что текущий пользователь ещё не входит в группу docker.
Штатный docker.io, snap и Podman: когда они уместны
Официальный репозиторий — не единственный путь, и в некоторых условиях он недоступен. Сравнение вариантов по практическим признакам:
| Вариант | Что даёт | Когда не подойдёт |
|---|---|---|
| Репозиторий Docker | Свежий Engine, buildx и Compose v2 одним набором | Нет доступа к download.docker.com |
| docker.io из Ubuntu | Без внешних источников, обновляется с системой | Нужны новые возможности движка и актуальный Compose |
| snap install docker | Изоляция и автообновления через snapd | Нужен доступ к файлам вне домашнего каталога |
| Podman | Без демона, rootless по умолчанию, CLI почти совместим | Инструментам нужен именно docker.sock |
docker.io разумно брать на машинах с жёсткой политикой «только пакеты дистрибутива» и там, где внешние репозитории запрещены. Минус — версия движка и плагина Compose может отличаться от той, что ожидают инструкции и CI-конфиги; проверяйте docker version до того, как повторять чужие команды.
Snap-пакет изолирован: он видит домашний каталог, но с доступом к произвольным путям вроде /srv или монтирования томов бывают сложности. Podman подходит, если нужен rootless-запуск по умолчанию и отказ от постоянного демона, но он не является Docker: сокет /var/run/docker.sock и часть инструментов, завязанных на dockerd, с ним не заработают. Docker Desktop для Linux тоже существует, однако на сервере он не нужен — движок с плагинами даёт тот же результат без виртуальной машины и GUI.
Что сделать после установки
Демон включается в автозапуск и стартует сразу при установке пакета. Состояние и последние записи лога проверяются так:
systemctl status docker
journalctl -u docker -n 50
Чтобы не писать sudo перед каждой командой, добавьте себя в группу docker. Изменение подхватывается только в новой сессии: перезайдите или выполните newgrp docker в текущем терминале.
sudo usermod -aG docker $USER
Членство в группе docker фактически равно root: через контейнер можно смонтировать каталог хоста и получить доступ к системе. На общих машинах и в продакшене вместо этого используют rootless-режим.
Rootless ставится пакетом docker-ce-rootless-extras и настраивается скриптом dockerd-rootless-setuptool.sh install: демон работает от обычного пользователя. Ограничения тоже есть — привилегированные порты ниже 1024 и часть сетевых сценариев требуют дополнительной настройки.
Compose v2 поставляется плагином и вызывается с пробелом: docker compose up -d. Проверка — docker compose version. Старые скрипты с docker-compose через дефис придётся поправить или доставить отдельный бинарник.
Типичные ошибки и вопросы
permission denied while trying to connect to the Docker daemon socket — пользователь не в группе docker либо сессия не перезапущена. Проверьте id -nG: если docker в списке нет, повторите usermod и войдите заново, а не просто откройте новый таб в том же терминале.
Cannot connect to the Docker daemon. Is the docker daemon running? — служба не запущена или упала. sudo systemctl start docker, затем journalctl -u docker -n 100. Частые причины — нехватка места в /var/lib/docker или второй containerd, оставшийся от snap-версии.
E: Conflicting values set for option Signed-By / NO_PUBKEY — ключ лежит не по тому пути, на который указывает signed-by, либо в /etc/apt/sources.list.d/ остался старый файл docker.list. Удалите дубликат и повторите добавление ключа.
Можно ли поставить Docker без интернета? Да: скачанные .deb (docker-ce, docker-ce-cli, containerd.io, плагины) ставятся через sudo dpkg -i, но зависимости придётся разрешать вручную. В закрытом контуре практичнее держать локальное зеркало репозитория.
Начните с официального репозитория и сразу после установки настройте доступ к демону — либо через группу docker с пониманием рисков, либо через rootless-режим. Перед повторением чужих инструкций сверяйте docker version и docker compose version: расхождение в версиях объясняет большую часть «неработающих» команд.