Проверенный поток пакетов проходит через ключ и устанавливается на сервер
DevOps

Как установить 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. Варианты:

  1. Оставить доступ только через sudo — понятная модель для небольшого сервера.
  2. Добавить конкретного доверенного администратора в docker, признавая эквивалентность root-доступу.
  3. Отдельно развернуть 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.

Источники

Рекламное местоВаша компания здесьРазместить рекламу

Самопроверка

Проверьте, что материал усвоен

Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.

01Какой источник пакетов используется в инструкции?
02Какие права получает член группы docker?
03Чем подтвердить успешную установку кроме версии CLI?

Разбираем коротко

Частые вопросы

Почему не стоит запускать get.docker.com на production-сервере?

Docker рекомендует convenience script прежде всего для тестовой и локальной среды. На сервере официальный APT-репозиторий оставляет понятный источник пакетов и управляемый процесс обновления.

Безопасно ли добавлять пользователя в группу docker?

Членство в группе docker даёт полномочия уровня root через доступ к socket daemon. Добавляйте только доверенных администраторов либо используйте sudo или отдельно оценённый rootless mode.

Почему опубликованный порт может обходить правила UFW?

Docker создаёт собственные правила packet filtering. Открытый через параметр -p порт нельзя оценивать только по выводу UFW; проверяйте фактическую доступность извне и правила Docker.