Узнайте, как установить Docker в режиме без рута, чтобы демон работал от имени пользователя root, а контейнеры работали от имени обычного пользователя.
Обычно, когда вы устанавливаете Docker, ему требуются полные права доступа (root) в хост-системе. Это создает потенциальную проблему безопасности, поскольку и контейнеры, и (демон) служба Docker будут работать от имени пользователя root. При установке Docker без рута только демон Docker работает от имени пользователя root, а контейнеры работают от имени обычных пользователей.
Почему это имеет значение? Потому что, если служба, работающая в контейнере, скомпрометирована, злоумышленник может получить доступ и к системным файлам. Нет реальной изоляции контейнеров.
Проект Podman с открытым исходным кодом был создан в первую очередь для запуска контейнеров без рута. Это потребовало от Docker поддержки аналогичной функции, чтобы контейнеры работали как обычные пользователи, а служба Docker (демон) работала с правами root.
Эта установка без рута теперь доступна в самом Docker, и вам не нужно использовать Podman только для этой функции.
В этой статье мы объясним, как установить Docker без root-доступа. Но прежде чем я покажу вам эти шаги, давайте сначала обсудим недостатки этого режима.
Самым большим недостатком этого режима является сеть, и эти проблемы также присутствуют в Podman.
По умолчанию Docker использует сеть без рута.
Потому что он самый быстрый, со скоростью до 30 Гбит/с и поддерживает IPv4 и IPv6.
Но у него есть проблемы.
У контейнеров не будет внешнего IP-адреса запроса, и все запросы будут появляться с адреса 127.0.0.1.
Это большая проблема, особенно если вы хотите установить защиту, которая ограничивает распределенные атаки типа «отказ в обслуживании» (DDOS), потому что все запросы будут исходить с одного и того же адреса.
Использование режима Slirp4netns решает эту проблему и показывает исходный адрес запроса. Но у него также есть две проблемы.
Безрутовый режим не использует липкие биты. Им нужны 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
Что означают эти цифры? Первое число — это первый идентификатор, который разрешено использовать, а следующее указывает, сколько идентификаторов у вас есть. Например, он начинается с 231072, идентификатор 0 означает 231072, а идентификатор 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, а затем переходите к части без рута.
Мы покажем шаги для Ubuntu.
Сначала удалите любой существующий пакет 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
Теперь установите пакет docker-ce-rootless-extras, загрузив официальный скрипт с помощью команды curl:
curl -fsSL https://get.docker.com/rootless | sh
Следуйте инструкциям на экране, и у вас будет установлен Docker без рута.
В конце этого экрана установки будут написаны две вещи: export=xxx
Скопируйте и вставьте их в последний файл .bashrc или, если вы используете ZSH, в файл .zshrc. Исходные файлы rc, которые вы только что изменили.
После завершения установки запустите демон docker без рута:
systemctl --user start docker
Автоматически запускать докер без рута при каждом запуске:
systemctl --user enable docker sudo loginctl enable-linger $(whoami)