
Как установить Docker Engine на Ubuntu безопасным способом
Подключаем официальный APT-репозиторий Docker, проверяем пакеты, daemon и тестовый контейнер, учитываем firewall и права группы docker.
Содержание
На Ubuntu Server Docker Engine следует устанавливать из официального APT-репозитория Docker. Docker Engine — фоновая служба, которая создаёт контейнеры; CLI — команда docker, через которую администратор обращается к этой службе. Официальный репозиторий позволяет проверить источник пакетов и обновлять весь набор обычным пакетным менеджером.
Как будет проходить установка
Сначала проверьте выпуск Ubuntu и существующие контейнерные пакеты. Затем добавьте официальный ключ в /etc/apt/keyrings, создайте файл источника docker.sources, установите пакеты и подтвердите работу службы через systemd и тестовый контейнер hello-world. Не добавляйте пользователя в группу docker автоматически: эта группа даёт полномочия уровня root.
До установки
Инструкция рассчитана на поддерживаемый 64-битный выпуск Ubuntu Server. Актуальный список выпусков и архитектур проверяйте на странице установки Docker: он меняется со временем.
Сохраните сведения о системе и пакетах:
cat /etc/os-release
dpkg --print-architecture
uname -r
dpkg -l | grep -E 'docker|containerd|runc|podman'
Если сервер уже обслуживает контейнеры, не удаляйте конфликтующие пакеты по общей команде. Сначала выясните, где лежат данные, каким daemon они управляются и как будет выполняться возврат. Каталоги /var/lib/docker и /var/lib/containerd нельзя очищать как «мусор».
Официальная документация перечисляет пакеты, способные конфликтовать с Docker CE, включая docker.io, старые Compose-пакеты, podman-docker, отдельно установленные containerd и runc. На свежем сервере их обычно нет.
Учтите правила firewall
Docker управляет собственными правилами фильтрации. Публикация -p 8080:80 может сделать порт доступным вопреки ожиданиям от UFW. До установки сохраните текущую картину:
sudo ufw status verbose
sudo iptables -S
sudo nft list ruleset
После запуска контейнеров проверяйте порт с другого устройства. Для production не публикуйте базу данных или внутренний API на всех интерфейсах. Если доступ нужен только локальному reverse proxy, привязывайте порт к loopback, например 127.0.0.1:8080:80.
Добавьте официальный ключ и репозиторий
Следующие команды выполняются на VPS от администратора с sudo. Они устанавливают curl, создают системный каталог ключей и скачивают открытый ключ, которым APT проверяет подпись пакетов 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
Проверьте, что файл не пуст и читается:
test -s /etc/apt/keyrings/docker.asc
gpg --show-keys --with-fingerprint /etc/apt/keyrings/docker.asc
Создайте источник в современном deb822-формате:
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
apt-cache policy docker-ce
В apt-cache policy кандидатом должен быть пакет с download.docker.com, а codename должен соответствовать выпуску Ubuntu. Не подставляйте название другого дистрибутива ради обхода ошибки репозитория.
Установите Engine и инструменты
sudo apt install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
Проверьте установленные источники и версии без привязки статьи к конкретному номеру релиза:
apt-cache policy docker-ce containerd.io
docker version
docker compose version
docker buildx version
docker version выводит секции Client и Server. Если виден только клиент или появляется ошибка соединения с socket, проверьте daemon.
Проверьте службу Docker
sudo systemctl is-enabled docker
sudo systemctl is-active docker
sudo systemctl status docker --no-pager
sudo journalctl -u docker -b --no-pager -n 100
На Ubuntu служба обычно запускается автоматически после установки. Если статус не active, не повторяйте установку вслепую. В журнале будет конкретная причина: например, ошибка конфигурации, файлового хранилища контейнеров или сети.
Выполните официальный тест:
sudo docker run --rm hello-world
sudo docker container ls -a
sudo docker image ls
hello-world скачивает небольшой образ, создаёт контейнер, печатает подтверждение и завершает работу. Флаг --rm удаляет контейнер после выхода, но образ остаётся локально.
Решите, кому доступен Docker
По умолчанию socket принадлежит root, поэтому в примерах используется sudo. Варианты:
- Оставить доступ только через sudo — понятная модель для небольшого сервера.
- Добавить конкретного доверенного администратора в
docker, признавая эквивалентность root-доступу. - Отдельно развернуть rootless mode после проверки его ограничений для нужной нагрузки.
Не добавляйте в docker пользователя веб-приложения, CI-задачу общего назначения или всех разработчиков. Проверьте права socket:
stat -c '%U:%G %a %n' /var/run/docker.sock
getent group docker
Убедитесь, что Docker запускается после перезагрузки
Плановую перезагрузку выполняйте только при наличии консоли хостера и после проверки других служб:
sudo systemctl --failed
sudo reboot
После повторного входа выполните на VPS три проверки: служба должна быть активна, тестовый контейнер — завершиться без ошибки, а список слушающих портов — не содержать неожиданно открытых приложений:
sudo systemctl is-active docker
sudo docker run --rm hello-world
sudo ss -lntup
Последняя команда нужна, чтобы убедиться: установка сама по себе не оставила неожиданный опубликованный сервис. Порты появятся, когда вы явно запустите контейнер с публикацией.
Как отменить изменение
Удаление пакетов не удаляет автоматически images, containers и volumes. Это полезно при переустановке, но означает, что полное уничтожение данных — отдельная и необратимая операция. Для обычного отката сначала остановите новые тестовые контейнеры, удалите только их и решите, нужно ли сохранять /var/lib/docker.
Файл источника и ключ можно удалить только после отказа от этого репозитория:
sudo rm /etc/apt/sources.list.d/docker.sources
sudo rm /etc/apt/keyrings/docker.asc
sudo apt update
Не удаляйте /var/lib/docker и /var/lib/containerd без проверенного перечня данных и резервной копии.
Дальше переходите к запуску и исследованию контейнеров. Если сервер ещё не подготовлен, сначала выполните базовую настройку Ubuntu и проверьте правила firewall.
Источники
Самопроверка
Проверьте, что материал усвоен
Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.
Разбираем коротко
Частые вопросы
Почему не стоит запускать get.docker.com на production-сервере?
Docker рекомендует convenience script прежде всего для тестовой и локальной среды. На сервере официальный APT-репозиторий оставляет понятный источник пакетов и управляемый процесс обновления.
Безопасно ли добавлять пользователя в группу docker?
Членство в группе docker даёт полномочия уровня root через доступ к socket daemon. Добавляйте только доверенных администраторов либо используйте sudo или отдельно оценённый rootless mode.
Почему опубликованный порт может обходить правила UFW?
Docker создаёт собственные правила packet filtering. Открытый через параметр -p порт нельзя оценивать только по выводу UFW; проверяйте фактическую доступность извне и правила Docker.


