1.2. Установка Docker Engine
Цели
После этого материала вы сможете:
- объяснить, из каких компонентов состоит установка Docker и зачем нужен каждый;
- удалить конфликтующие пакеты, установленные из репозитория дистрибутива;
- подключить официальный apt repository Docker с проверкой подписи;
- установить Docker Engine, CLI, containerd, Buildx и Compose plugin;
- проверить установку и прочитать версии всех компонентов;
- объяснить, почему установка через
snapилиapt install docker.ioне подходит для курса; - зафиксировать версию Docker, если это требуется.
Предварительные знания
- 1.1. Требования к Linux — система проверена и пригодна;
- работа с
sudo; - базовое представление о том, что такое пакетный репозиторий.
Ключевые термины
| Термин | Объяснение |
|---|---|
Docker Engine | Сервер: daemon dockerd, который создаёт и запускает containers. Пакет docker-ce |
Docker CLI | Клиент: программа docker, отправляющая команды daemon. Пакет docker-ce-cli |
containerd | Отдельный runtime, которым dockerd управляет containers. Пакет containerd.io |
Buildx | Плагин CLI для сборки образов через BuildKit. Пакет docker-buildx-plugin |
Compose plugin | Плагин CLI, реализующий команду docker compose. Пакет docker-compose-plugin |
apt repository | Источник пакетов для apt. Официальный репозиторий Docker отличается от репозитория Ubuntu |
GPG key | Криптографический ключ, которым подписан репозиторий. Позволяет apt убедиться, что пакеты не подменены |
deb822 | Современный формат файлов источников apt: многострочный, в /etc/apt/sources.list.d/*.sources |
Теория
Из чего состоит установка
Слово «Docker» обозначает не одну программу, а набор компонентов. Понимание их ролей избавляет от большинства недоразумений.
docker (CLI) пакет docker-ce-cli
│ отправляет HTTP-запросы через Unix socket
▼
dockerd (daemon) пакет docker-ce
│ управляет через gRPC
▼
containerd пакет containerd.io
│ порождает
▼
containerd-shim → runc пакет containerd.io
│ создаёт
▼
процесс приложения
Плюс два плагина CLI, которые устанавливаются отдельными пакетами и добавляют подкоманды:
docker buildx— сборка через BuildKit (пакетdocker-buildx-plugin);docker compose— работа с многокомпонентными системами (пакетdocker-compose-plugin).
Подробно архитектура разбирается в разделе 02. Сейчас достаточно знать, что установить нужно все пять пакетов.
Почему не apt install docker.io
В репозитории Ubuntu есть пакет docker.io. Он устанавливается одной командой и работает. Курс его не использует по трём причинам.
- Версия отстаёт. Пакет собирается сопровождающими Ubuntu и обновляется реже. На LTS-версии он может отставать на год и более. Часть материала курса (containerd image store, современные возможности BuildKit) требует свежей версии.
- Состав отличается. Buildx и Compose plugin ставятся отдельными пакетами с другими именами, и их версии тоже отстают.
- Официальная документация описывает другой путь. Курс требует проверять всё по официальным источникам; расхождение установки с документацией создаёт постоянные мелкие несовпадения.
Аналогично не подходит установка через snap: там иная файловая структура, иные пути и ограничения confinement, из-за которых часть упражнений курса не воспроизводится.
Факт против рекомендации. Факт:
docker.ioи snap-версия работают. Рекомендация: для этого курса используйте официальный репозиторий, иначе часть команд даст другой результат.
Что делает подключение репозитория
Три шага, каждый со своим смыслом.
- Скачивание GPG-ключа. Ключ кладётся в
/etc/apt/keyrings/docker.asc. Им подписан репозиторий Docker;aptиспользует ключ, чтобы убедиться в подлинности метаданных и пакетов. - Создание файла источника. Файл описывает, откуда брать пакеты, для какого релиза, какие компоненты и каким ключом проверять.
- Обновление индекса.
apt updateскачивает список доступных пакетов из нового источника.
Ключ кладётся именно в /etc/apt/keyrings/, а не добавляется в общий keyring через устаревший apt-key add. Причина: ключ, добавленный в общий keyring, доверяет всем репозиториям, а не только своему. Привязка ключа к конкретному источнику через Signed-By ограничивает доверие.
Формат deb822
Официальная документация Docker сейчас использует формат deb822 — многострочный файл .sources вместо однострочного .list. Оба формата работают; deb822 читается лучше и явно указывает архитектуру и ключ.
Многие руководства в интернете показывают старый формат:
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable
Это не ошибка — но курс следует текущей документации.
Внутренний механизм
Что происходит при apt install docker-ce
aptразрешает зависимости:docker-ceтребуетcontainerd.io,docker-ce-cliи ряд системных библиотек.- Пакеты скачиваются и проверяются по подписи.
- Файлы распаковываются: бинарники в
/usr/bin, unit-файлы systemd в/lib/systemd/system, плагины CLI в/usr/libexec/docker/cli-plugins. - Post-install скрипт создаёт системную группу
docker(без участников), регистрирует и запускаетdocker.serviceиdocker.socket. - При первом запуске
dockerdсоздаёт каталог данных/var/lib/docker, выбирает storage driver и настраивает сетевой bridgedocker0.
После этого daemon работает и слушает Unix socket /var/run/docker.sock. Права на socket — владелец root, группа docker, режим 0660. Именно поэтому команды сразу после установки требуют sudo: обычный пользователь не входит в группу docker.
Почему плагины CLI ставятся отдельно
docker buildx и docker compose — не встроенные подкоманды, а исполняемые файлы в каталоге плагинов. CLI при запуске просматривает /usr/libexec/docker/cli-plugins и ~/.docker/cli-plugins и регистрирует найденное как подкоманды.
Практическое следствие: если docker compose version выдаёт «is not a docker command», значит пакет docker-compose-plugin не установлен, а сам Docker при этом работает нормально.
Команды и примеры
Шаг 1. Удаление конфликтующих пакетов
for pkg in docker.io docker-doc docker-compose docker-compose-v2 \
podman-docker containerd runc; do
sudo apt remove -y "$pkg"
done
Что делает: последовательно удаляет пакеты, которые конфликтуют с официальными. Если пакет не установлен, apt сообщит об этом и продолжит.
Ожидаемый результат: для не установленных пакетов — Package 'docker-doc' is not installed, so not removed. Это нормально.
Данные и образы, созданные предыдущей установкой, не удаляются этой командой: они остаются в
/var/lib/docker. Полное удаление данных разбирается в уроке 1.6.
Шаг 2. Подготовка apt
sudo apt update
sudo apt install -y ca-certificates curl
Что делает: обновляет индекс пакетов и устанавливает корневые сертификаты (нужны для HTTPS) и curl (нужен для скачивания ключа).
Шаг 3. Добавление GPG-ключа
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
Разбор аргументов:
| Команда / флаг | Значение |
|---|---|
install -m 0755 -d | Создаёт каталог с указанными правами. Надёжнее, чем mkdir + chmod |
curl -f | Возвращать ошибку при HTTP-статусе 4xx/5xx, а не сохранять страницу ошибки |
curl -s | Тихий режим, без индикатора прогресса |
curl -S | Но ошибки всё же показывать |
curl -L | Следовать за редиректами |
chmod a+r | Дать всем право чтения — apt работает от _apt, а не от root |
Проверка, что ключ скачан корректно:
head -1 /etc/apt/keyrings/docker.asc
-----BEGIN PGP PUBLIC KEY BLOCK-----
Если вместо этого вы видите HTML — скачалась страница ошибки; проверьте сеть и повторите.
Шаг 4. Подключение репозитория
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
Что делает: создаёт файл источника в формате deb822. Подстановки $( ... ) вычисляются shell до передачи в tee, поэтому в файл попадают конкретные значения.
Разбор полей:
| Поле | Значение |
|---|---|
Types: deb | Бинарные пакеты (не исходники) |
URIs | Адрес репозитория |
Suites | Кодовое имя релиза Ubuntu, например noble |
Components: stable | Канал. Есть также test и nightly — для курса не нужны |
Architectures | Архитектура, например amd64. Ограничивает загрузку метаданных только нужной архитектурой |
Signed-By | Ключ, которым проверяется этот источник |
Проверка результата:
cat /etc/apt/sources.list.d/docker.sources
Убедитесь, что Suites содержит кодовое имя вашего релиза, а не пустую строку. Пустое значение — самая частая ошибка на производных дистрибутивах.
Убедитесь, что apt update завершился без ошибок и в выводе присутствует строка с download.docker.com.
Шаг 5. Установка пакетов
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
Что делает: устанавливает все пять компонентов. Порядок в команде значения не имеет.
Ожидаемый результат: apt скачает около 100–130 MB и распакует примерно 400–500 MB. В конце вывода — сообщения о создании и запуске сервисов.
Шаг 6. Проверка установки
sudo docker version
Ожидаемый результат — два блока, Client и Server:
Client: Docker Engine - Community
Version: 29.0.1
API version: 1.53
Go version: go1.25.3
...
Server: Docker Engine - Community
Engine:
Version: 29.0.1
API version: 1.53 (minimum version 1.44)
...
containerd:
Version: 1.7.28
runc:
Version: 1.3.1
docker-init:
Version: 0.19.0
Наличие блока Server — главный признак успеха: он означает, что CLI смог связаться с работающим daemon. Если блок Server отсутствует и выводится ошибка соединения — daemon не запущен; см. урок 1.3.
Версии плагинов проверяются отдельно:
docker buildx version
docker compose version
github.com/docker/buildx v0.34.1 ...
Docker Compose version v2.40.3
Обратите внимание: эти две команды не требуют обращения к daemon, поэтому работают без sudo.
Полная информация о системе:
sudo docker info
Команда выводит несколько десятков строк. Ключевые для нас поля разбираются в уроке 1.4.
Фиксация версии (при необходимости)
Если нужно установить конкретную версию, а не последнюю:
# посмотреть доступные версии
apt-cache madison docker-ce | awk '{print $3}'
5:29.0.1-1~ubuntu.24.04~noble
5:28.5.2-1~ubuntu.24.04~noble
Установка конкретной версии:
VERSION_STRING="5:28.5.2-1~ubuntu.24.04~noble"
sudo apt install -y \
docker-ce="$VERSION_STRING" \
docker-ce-cli="$VERSION_STRING" \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
Чтобы apt upgrade не обновил пакет автоматически:
sudo apt-mark hold docker-ce docker-ce-cli
Отменить фиксацию:
sudo apt-mark unhold docker-ce docker-ce-cli
Как отменить установку
Удаление пакетов:
sudo apt purge -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
Опасная команда. Следующая команда удаляет все образы, containers и volumes безвозвратно. Восстановление невозможно, если нет резервных копий или образы не опубликованы в registry. Перед выполнением проверьте содержимое:
sudo du -sh /var/lib/dockerиsudo docker volume ls. Полная процедура удаления описана в уроке 1.6.
sudo rm -rf /var/lib/docker /var/lib/containerd
Удаление репозитория и ключа:
sudo rm /etc/apt/sources.list.d/docker.sources
sudo rm /etc/apt/keyrings/docker.asc
sudo apt update
Практический пример
Проверка, что установлены все компоненты и их версии согласованы.
Создайте файл:
docker-check/
└── verify-install.sh
#!/usr/bin/env bash
# verify-install.sh — проверка полноты установки Docker.
set -uo pipefail
fail=0
check() {
local name="$1"; shift
if out="$("$@" 2>&1)"; then
printf ' [+] %-20s %s\n' "$name" "$(echo "$out" | head -1)"
else
printf ' [!] %-20s НЕ РАБОТАЕТ\n' "$name"
fail=1
fi
}
echo "=== Компоненты Docker ==="
check "docker CLI" docker --version
check "buildx" docker buildx version
check "compose" docker compose version
echo
echo "=== Связь с daemon ==="
if server="$(docker version --format '{{.Server.Version}}' 2>&1)"; then
printf ' [+] %-20s %s\n' "Server" "$server"
else
printf ' [!] %-20s %s\n' "Server" "$server"
echo " Возможные причины: daemon не запущен либо нет прав на socket."
fail=1
fi
echo
echo "=== Runtime ==="
check "containerd" containerd --version
check "runc" runc --version
exit "$fail"
Запуск:
chmod +x verify-install.sh
sudo ./verify-install.sh
Ожидаемый вывод:
=== Компоненты Docker ===
[+] docker CLI Docker version 29.0.1, build ...
[+] buildx github.com/docker/buildx v0.34.1 ...
[+] compose Docker Compose version v2.40.3
=== Связь с daemon ===
[+] Server 29.0.1
=== Runtime ===
[+] containerd containerd github.com/containerd/containerd ...
[+] runc runc version 1.3.1
Скрипт возвращает exit code 0 при полном успехе и 1 при любой проблеме — это делает его пригодным для использования в автоматических проверках.
Проверка результата
sudo docker run --rm hello-world
Ожидаемый результат — сообщение, начинающееся с Hello from Docker!. Разбор того, что при этом произошло, — в уроке 1.4.
Флаг --rm удаляет container сразу после завершения, чтобы не оставлять мусор.
Типичные ошибки
| Ошибка | Причина | Исправление |
|---|---|---|
E: Unable to locate package docker-ce | Репозиторий не подключён или apt update не выполнялся после его добавления | Проверить /etc/apt/sources.list.d/docker.sources, выполнить sudo apt update |
Suites: пустое в файле источника | Дистрибутив не заполняет UBUNTU_CODENAME, а VERSION_CODENAME содержит собственное имя | Подставить кодовое имя Ubuntu вручную: noble, jammy, resolute |
The following signatures couldn't be verified | Ключ не скачан, повреждён или не читается пользователем _apt | Перескачать ключ, выполнить sudo chmod a+r /etc/apt/keyrings/docker.asc |
docker: 'compose' is not a docker command | Не установлен docker-compose-plugin | sudo apt install docker-compose-plugin |
Используется docker-compose с дефисом | Это Compose v1, снятый с поддержки | Использовать docker compose без дефиса |
Cannot connect to the Docker daemon | Daemon не запущен, либо нет прав на socket | См. урок 1.3 и урок 1.5 |
Конфликт с ранее установленным docker.io | Старые пакеты не удалены | Выполнить шаг 1 и повторить установку |
Установка через curl ... | sh из непроверенного источника | Скрипт get.docker.com удобен, но выполняет произвольный код от root | Прочитать скрипт перед выполнением или использовать пошаговую установку через apt |
Контрольные вопросы
На понимание:
- Почему установка состоит из пяти пакетов, а не из одного?
- Зачем ключ кладётся в
/etc/apt/keyrings/, а не добавляется черезapt-key add? - Что означает поле
Signed-Byв файле источника? - Почему
docker buildx versionработает безsudo, аdocker version— не всегда? - Почему пакет
docker.ioиз репозитория Ubuntu не подходит для этого курса?
На применение:
- Как установить конкретную версию Docker Engine и запретить её автоматическое обновление?
- Как проверить, что репозиторий подключён правильно, не устанавливая пакеты?
- Как убедиться, что установлены все пять компонентов, одной последовательностью команд?
На диагностику:
docker versionвыводит блокClient, но вместоServer— ошибка соединения. Назовите две разные причины и способ различить их.- После
apt updateпоявляется ошибка о невозможности проверить подпись репозитория Docker. С чего начать проверку?
Краткое резюме
- Установка Docker — это пять пакетов:
docker-ce,docker-ce-cli,containerd.io,docker-buildx-plugin,docker-compose-plugin. - Перед установкой удаляются конфликтующие пакеты дистрибутива.
- Официальный репозиторий подключается с явной привязкой GPG-ключа через
Signed-By. - Документация использует формат deb822 (
.sources); старый формат.listтакже работает. - Кодовое имя релиза берётся из
/etc/os-releaseс приоритетомUBUNTU_CODENAME. - Наличие блока
Serverв выводеdocker version— главный признак успешной установки. - Buildx и Compose — плагины CLI, они устанавливаются отдельными пакетами.
docker compose(v2) заменилdocker-compose(v1); версия с дефисом снята с поддержки.- Версию можно зафиксировать через
apt-mark hold. - Удаление пакетов не удаляет данные: образы и volumes остаются в
/var/lib/docker.
Официальные источники
| Источник | Ссылка | Что подтверждает |
|---|---|---|
| Install Docker Engine on Ubuntu | https://docs.docker.com/engine/install/ubuntu/ | Полная последовательность установки: удаление конфликтующих пакетов, GPG-ключ, файл источника в формате deb822, список пакетов, проверка через hello-world |
| Install Docker Engine | https://docs.docker.com/engine/install/ | Обзор способов установки и поддерживаемых платформ |
| Docker Compose installation | https://docs.docker.com/compose/install/linux/ | Установка Compose v2 как плагина CLI |
| Migrate to Compose v2 | https://docs.docker.com/compose/releases/migrate/ | Прекращение поддержки docker-compose v1 |
| Docker CLI plugins | https://docs.docker.com/reference/cli/docker/ | Механизм плагинов CLI и структура команд |
sources.list(5) man page | https://manpages.ubuntu.com/manpages/noble/man5/sources.list.5.html | Формат deb822 и поля Types, URIs, Suites, Signed-By |
Навигация
← Предыдущий материал
Вернуться к разделу
Следующий материал → Docker daemon
Главное оглавление