🐳 Что такое Docker без root (rootless)?

Мануал

Обычно, когда вы устанавливаете Docker, ему требуются полные права (root) на на хост-системе.

Это создает потенциальную проблему безопасности, поскольку и контейнеры, и служба (демон) Docker будут работать от имени root.

При установке Docker без права root только демон Docker работает от имени root, а контейнеры запускаются от имени обычных пользователей.

Проект Podman с открытым исходным кодом был создан для запуска контейнеров без права root.

Это заставило Docker поддержать аналогичную функцию, чтобы контейнеры запускались от имени обычных пользователей, но служба Docker (демон) работала от имени root.

Теперь такая установка без root доступна в самом Docker, и вам не нужно использовать Podman только для этой функции.

В этой статье я расскажу, как установить Docker без root-доступа.

Но прежде чем я покажу вам эти шаги, давайте сначала обсудим недостатки этого режима.

Недостаток запуска Docker в режиме rootless

Самым большим недостатком этого режима является сеть, и эти проблемы также присутствуют в Podman.

По умолчанию Docker использует сеть rootless.

Потому что она самая быстрая, со скоростью до 30 Гбит/с и поддержкой IPv4 и IPv6.

Но у нее есть проблемы.

Контейнеры не будут иметь внешнего IP запроса, и все запросы будут появляться с адреса 127.0.0.1.

Это большая проблема, особенно если вы хотите установить защиту, ограничивающую распределенные атаки типа “отказ в обслуживании” (DDOS), поскольку все запросы будут казаться исходящими с одного и того же адреса.

Использование режима Slirp4netns решает эту проблему и показывает исходный адрес запроса.

Но у него также есть две проблемы.

  • IPv6 не поддерживается.
  • Скорость намного ниже (около 7 Гбит/с).

Предварительные условия

Режим rootless не использует стикибитс.

Для них нужны newuidmap и newgidmap.

Поэтому вы должны убедиться, что пакеты newuidmap и newgidmap установлены (через пакет uidmap) и что имеется 65 536 дочерних идентификаторов.

newuidmap проверяет, что вызывающая программа является владельцем процесса, на который указывает pid.

id -u
1001
whoami
testuser

Затем проверьте, что пользователь имеет 65 536 под UID:

grep ^$(whoami): /etc/subuid
testuser:231072:65536
grep ^$(whoami): /etc/subgid
testuser:231072:65536

Что означают эти числа? Первое число – это первый разрешенный к использованию id, а следующие говорят о том, сколько у вас id. Например, начинается с 231072, id 0 означает 231072, а id 1000 означает 241072.

Установите пакеты dbus-user-session и fuse-overlayfs.

На Debian используйте команду для установки dbus-user-session:

sudo apt install -y dbus-user-session

Затем установите fuse-overlayfs:

sudo apt install -y fuse-overlayfs

Рекомендуется использовать ядро 5.11 или более позднюю версию.

Установка docker в режиме rootless

Теперь вы переходите к основной части.

Первая часть – это обычная установка Docker, а затем переходим к установке в режиме rootless.

Я покажу шаги на Ubuntu.

Установите обычные пакеты Docker

Сначала удалите все существующие пакеты Docker:

 sudo apt remove docker docker-engine docker.io containerd runc

А затем установите Docker на Ubuntu:

 sudo apt update
 sudo apt install docker-ce docker-ce-cli containerd.io

Убедитесь, что Docker Engine установлен правильно, запустив образ hello-world.

sudo docker run hello-world

Учитывая, что демон Docker уже запущен, сначала отключите его.

sudo systemctl disable --now docker.service docker.socket

Установите пакет rootless

Теперь установите пакет docker-ce-rootless-extras, загрузив официальный скрипт с помощью команды curl:

curl -fsSL https://get.docker.com/rootless | sh

Следуйте предложениям на экране, и у вас будет установлен Docker рутлесс,

В конце экрана установки будут написаны две вещи: export=xxx.

Скопируйте и вставьте их в последний файл .bashrc или, если вы используете ZSH, в файл .zshrc.

Запустите rc-файлы, которые вы только что изменили.

После завершения установки запустите демон docker rootless:

 systemctl --user start docker

Автоматический запуск rootless docker при каждом запуске:

systemctl --user enable docker
sudo loginctl enable-linger $(whoami)

см. также:

Добавить комментарий