Как перейти на Docker без root-доступа в Debian и Ubuntu Linux

Как перейти на Docker без root-доступа в Debian и Ubuntu Linux

Docker — это фантастический инструмент, который позволяет запускать приложения в изолированных блоках, называемых контейнерами. Это значительно ускоряет разработку и доставку программного обеспечения. Но есть одна небольшая загвоздка, о которой вам следует знать. По умолчанию Docker часто работает с правами «root», то есть с наивысшим уровнем доступа в системе Linux. Это может представлять угрозу безопасности. К счастью, есть гораздо более безопасный способ: Docker без прав root.

В этом руководстве вы найдёте всю необходимую информацию о миграции в Docker без root-доступа. Мы объясним, почему вам стоит перейти на эту систему, и покажем, как именно перейти с Docker с root-доступом на Docker без root-доступа шаг за шагом. Давайте сделаем ваши контейнеры более безопасными!

 

Что такое Docker без root-доступа?

Режим без прав суперпользователя в Docker работает именно так, как следует из названия: он позволяет запускать демон Docker и ваши контейнеры от имени обычного пользователя без прав суперпользователя. Это огромный шаг вперёд в плане безопасности.

Вот почему Docker без root-доступа полезен:

  • Это предотвращает проблемы с безопасностью: работа от имени пользователя без прав root помогает защититься от потенциальных уязвимостей в Docker или среде выполнения контейнеров. Если в контейнере возникнет проблема с безопасностью, она не сможет распространиться на всю хост-систему, поскольку у неё нет прав root.
  • Вам не нужен ‘sudo’: вы можете установить Docker и управлять им без прав суперпользователя. Это идеальный вариант для сред, в которых у вас нет прав администратора или вы не хотите их использовать.

 

Волшебство, лежащее в основе режима без прав суперпользователя, — это функция Linux под названием пространства имён пользователей. Представьте, что вашему пользователю предоставляется особый «пузырь», в котором он может играть. Внутри этого «пузыря» пользователь может действовать как администратор, но не может влиять на что-либо за его пределами.

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

 

Docker без root-доступа в сравнении с Docker с пользователем без прав root

Обратите внимание, что запуск Docker от имени пользователя без прав root и запуск Docker в режиме без прав root — это разные вещи.

Docker без root-доступа (True Rootless)

  • Демон Docker работает от имени пользователя без прав root
  • Группа не требуется docker
  • Использует пользовательские пространства имён для сопоставления корня контейнера с непривилегированным пользователем хоста
  • Хранение в домашнем каталоге пользователя (~/.local/share/docker/)
  • Более безопасно, но с ограничениями (отсутствие привилегированных операций, некоторые сетевые ограничения).

 

Docker с пользователем без прав root (традиционный)

  • Демон Docker по-прежнему работает от имени пользователя root (процесс dockerd)
  • Обычные пользователи добавляются в группу docker
  • Пользователи могут выполнять команды docker без sudo
  • Контейнеры по-прежнему имеют права суперпользователя в системе хоста
  • Использует стандартные местоположения, такие как /var/lib/docker/
  • Проблема безопасности: принадлежность к группе docker эквивалентна наличию прав суперпользователя.

 

Надеюсь, вы понимаете разницу между этими двумя понятиями.

 

Подготовка к установке Docker без root-доступа

Прежде чем мы начнём, вам нужно подготовить всего несколько вещей. Если у вас есть всё необходимое, процесс пройдёт гладко.

  • Система LinuxКоманда Docker настоятельно рекомендует Ubuntu, поскольку её ядро отлично поддерживает overlay2 драйвер хранилища, необходимый для работы в режиме без root-доступа. Однако Docker отлично работает в любом дистрибутиве Linux. Мы протестировали эту настройку в Debian 13 и Ubuntu 24.04 LTS, она работает «из коробки».
  • Несколько ключевых пакетов: вам нужно установить uidmap (который содержит инструменты под названием newuidmap и newgidmap) и dbus-user-session.
  • Диапазоны идентификаторов пользователей: ваша система должна предоставить пользователю блок идентификаторов пользователей (UID) и идентификаторов групп (GID) для использования в контейнерах. Вам нужно будет настроить это в файлах /etc/subuid и /etc/subgid . Для большинства задач обычно достаточно блока из 65 536 идентификаторов.
  • Резервное копирование важных данных: убедитесь, что у вас есть резервные копии всех важных данных, потерю которых вы не можете себе позволить.

 

Пошаговое руководство по переходу с Rootful Docker на Rootless Docker

Мы предполагаем, что в вашей системе Linux уже установлен Docker, работающий в режиме rootful. Если нет, перейдите по указанным ссылкам, чтобы настроить Docker в предпочитаемой вами системе.

Читать  Как выйти из контейнера Docker

 

Шаг 1. Остановите и отключите старую версию Rootful Docker

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

Выполните эти команды в своём терминале:

sudo systemctl disable --now docker.service docker.socket
sudo rm /var/run/docker.sock

 

Это остановит Docker и удалит его старый файл сокета.

 

Шаг 2. Установите необходимые инструменты

Теперь давайте установим пакеты, о которых мы упоминали ранее.

sudo apt install -y uidmap dbus-user-session systemd-container docker-ce-rootless-extras

 

Эта единственная команда позволяет использовать uidmap для сопоставления пользователей, dbus-user-session для управления сеансом и docker-ce-rootless-extras, который включает в себя полезный инструмент для настройки.

 

Шаг 3. Войдите в систему правильно (это важно!)

Теперь вам нужно войти в систему под учётной записью пользователя, который будет запускать Docker без прав суперпользователя. Вы можете создать нового пользователя или использовать существующего.

Что ещё важнее, вы должны войти в систему с помощью метода, который поддерживает pam_systemd. Не используйте sudo su. При использовании правильного метода автоматически устанавливается важная переменная среды под названием $XDG_RUNTIME_DIR. Самый простой способ — использовать команду machinectl, которую вы установили на предыдущем шаге.

sudo machinectl shell $(whoami)@

 

Таким образом вы войдёте в новую оболочку под своим текущим пользователем. Это правильный способ.

Если вы хотите войти в систему под другим пользователем (например, senthil), просто укажите его имя, как показано ниже:

sudo machinectl shell senthil@
Если после выполнения указанной выше команды вы увидите следующий результат, значит, всё в порядке:
Connected to the local host. Press ^] three times within 1s to exit session.

Шаг 4. Установите Docker без root-доступа

Теперь вы вошли в систему под своим именем пользователя и готовы к установке. Запустите скрипт настройки Docker без прав суперпользователя:

dockerd-rootless-setuptool.sh install

 

Скрипт настроит службу systemd для Docker, которая будет работать под вашей учётной записью.

После успешной миграции Docker без root-доступа вы увидите примерно такой результат:

[...]
debian13desktop dockerd-rootless.sh[5760]: time="2025-09-05T18:28:28.173512284+05:30" level=info msg="API listen on /run/user/1001/docker.sock"
+ DOCKER_HOST=unix:///run/user/1001/docker.sock /usr/bin/docker version
Client: Docker Engine - Community
 Version:           28.4.0
 API version:       1.51
 Go version:        go1.24.7
 Git commit:        d8eb465
 Built:             Wed Sep  3 20:57:38 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.4.0
  API version:      1.51 (minimum version 1.24)
  Go version:       go1.24.7
  Git commit:       249d679
  Built:            Wed Sep  3 20:57:38 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.27
  GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4da
 runc:
  Version:          1.2.5
  GitCommit:        v1.2.5-0-g59923ef
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
 rootlesskit:
  Version:          2.3.4
  ApiVersion:       1.1.1
  NetworkDriver:    slirp4netns
  PortDriver:       builtin
  StateDir:         /run/user/1001/dockerd-rootless
 slirp4netns:
  Version:          1.2.1
  GitCommit:        09e31e92fa3d2a1d3ca261adaeb012c8d75a8194
+ systemctl --user enable docker.service
Created symlink '/home/andreyex/.config/systemd/user/default.target.wants/docker.service' \u2192 '/home/andreyex/.config/systemd/user/docker.service'.
[INFO] Installed docker.service successfully.
[INFO] To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
[INFO] To run docker.service on system startup, run: `sudo loginctl enable-linger andreyex`

[INFO] Creating CLI context "rootless"
Successfully created context "rootless"
[INFO] Using CLI context "rootless"
Current context is now "rootless"

[INFO] Make sure the following environment variable(s) are set (or add them to ~/.bashrc):
export PATH=/usr/bin:$PATH

[INFO] Some applications may require the following environment variable too:
export DOCKER_HOST=unix:///run/user/1001/docker.sock

 

Шаг 5. Обновите свою среду

После завершения установки скрипт покажет вам несколько строк, которые нужно добавить в файл запуска вашей оболочки, например ~/.bashrc.

Эти строки задают переменные среды PATH и DOCKER_HOST, чтобы ваш терминал мог находить новый демон Docker без прав суперпользователя и взаимодействовать с ним.

В моём случае я добавил следующие переменные среды:

echo 'export PATH=/usr/bin:$PATH' >> ~/.bashrc
echo 'export DOCKER_HOST=unix:///run/user/1001/docker.sock' >> ~/.bashrc

 

После добавления их в файл ~/.bashrc выполните следующую команду, чтобы немедленно применить изменения:

source ~/.bashrc

 

Шаг 6. Запуск и управление новым Docker без root-доступа

Поздравляем, всё готово! Управление Docker без root-доступа немного отличается.

Чтобы запустить и включить демон Docker без прав root, выполните команду:

systemctl --user enable docker
systemctl --user start docker

 

Обратите внимание на флаг --user.

Эти команды включают и запускают службу Docker для вашего пользователя.

Чтобы Docker запускался автоматически при включении компьютера, необходимо включить «задержку» для вашего пользователя. Это позволит вашему пользователю запускать длительные процессы, даже если вы не вошли в систему.

Включите режим ожидания, чтобы Docker запускался после выхода из системы:

sudo loginctl enable-linger $(whoami)

 

Эта команда включает режим ожидания.

 

Шаг 7. Проверка установки Docker без root-доступа

Чтобы убедиться, что Docker работает в режиме без прав суперпользователя:

docker info | grep -i rootless

 

Читать  Как установить Navidrome с помощью Docker: пошаговое руководство

Если ты увидишь:

rootless
[...]

 

…тогда Docker будет успешно работать без прав суперпользователя.

Вы также можете проверить это, выполнив все команды Docker без sudo или root:

docker run hello-world

 

Ограничения для докеров без рутов

Режим без root-доступа — это отличная функция, но у неё есть несколько известных ограничений.

  • Сеть устроена иначе: IP-адрес контейнера недоступен с хоста. Для доступа к службам, работающим в контейнере, всегда следует использовать сопоставление портов (например, docker run -p 8080:80). Кроме того, такие функции, как --net=host работают в пространстве имён, то есть они не используют напрямую реальную сеть хоста.
  • Привилегированные порты: по умолчанию вы не можете подключиться к портам ниже 1024 (например, к порту 80). Вы можете либо использовать более высокий порт (например, 8080), либо изменить системные настройки, чтобы разрешить это.
  • Ограничения ресурсов: для ограничения ресурсов контейнера, таких как ЦП или память, в вашей системе должна использоваться cgroup v2. В противном случае эти флаги будут проигнорированы.

 

Устранение неполадок

Ниже приведены распространённые способы устранения неполадок, с которыми вы можете столкнуться при переходе на Docker без root-доступа или при его использовании.

Проблемы с установкой и запуском

При первоначальной настройке и запуске демона Docker без root-доступа может возникнуть несколько проблем.

systemd not detectedилиFailed to connect to bus:

Эти ошибки часто возникают, если вы переключаетесь на пользователя без прав root с помощью таких команд, как sudo su или sudo -iu testuser.

Правильный способ входа в систему — использовать метод, поддерживающий pam_systemd, который правильно настраивает необходимую среду.

Рекомендуемая команда — это:

sudo machinectl shell <your-username>@

 

Демон не запускается автоматически:

Чтобы служба Docker без прав суперпользователя запускалась при загрузке, необходимо включить «задержку» для вашей учётной записи. Это позволит вашему пользователю запускать длительные процессы, даже если вы не вошли в систему.

Это можно сделать с помощью команды:

sudo logctl enable-linger $(whoami)

 

Ошибки, связанные с пользовательскими пространствами имён:

  • operation not permittedЕсли вы видите эту ошибку, скорее всего, ваша система не настроена таким образом, чтобы непривилегированные пользователи могли создавать пользовательские пространства имён. Это можно исправить, настроив kernel.unprivileged_userns_clone=1 в файле /etc/sysctl.conf и затем выполнив sudo sysctl --system.
  • no space left on deviceЭто сообщение может появиться, если максимальное количество пользовательских пространств имён слишком мало. Чтобы исправить это, вы можете установить user.max_user_namespaces=28633 в /etc/sysctl.conf и применить изменение с помощью sudo sysctl --system.
  • No subuid ranges found for userЭта ошибка означает, что вы не настроили подчиненные UID и GID для своего пользователя в файлах /etc/subuid и /etc/subgid . В режиме без root-доступа для пользователя должно быть выделено не менее 65 536 UID/GID.
  • could not get XDG_RUNTIME_DIR: Переменная среды $XDG_RUNTIME_DIR является обязательной и обычно устанавливается автоматически при правильном входе в систему через pam_systemd. Если она не установлена, это может привести к проблемам.

 

Ошибки при извлечении изображения (docker pull)

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

  • lchown <FILE>: invalid argumentОбычно это означает, что количество подчиненных UID/GID, доступных в ваших файлах /etc/subuid и /etc/subgid, недостаточно для изображения, которое вы пытаетесь загрузить. Требования могут различаться, но для большинства изображений достаточно 65 536 идентификаторов.
  • lchown <FILE>: operation not permittedЭта ошибка часто возникает, если каталог данных Docker (~/.local/share/docker) расположен на NFS-сервере. Эту проблему можно решить, изменив data-root в конфигурации Docker на каталог, который не находится в файловой системе NFS.

 

Ошибки при запуске контейнера (docker run)

После запуска демона могут возникнуть проблемы при попытке запустить контейнер.

  • OCI runtime create failed / connection reset by peer: в системе, использующей cgroup v2, эта ошибка может возникать, если демон D-Bus не активен для вашего сеанса пользователя. Чтобы исправить это, вам может потребоваться установить пакет dbus-user-session, а затем выйти из системы и снова войти.
  • Ограничения ресурсов игнорируются: флаги типа --cpus--memory и --pids-limit работают только в том случае, если ваша система работает с cgroup v2 и systemd. Если docker info отображается Cgroup Driver как none, эти флаги будут проигнорированы.
  • Ошибки после миграции: один из пользователей отметил, что после миграции в его контейнерах возникли ошибки. Решением стало остановка и удаление всех контейнеров, которые ранее были запущены в старой корневой установке Docker.
Читать  Portainer 2.33 LTS: новый брендинг, переработанный руль и предварительный просмотр видимости

 

Сетевые проблемы

Работа в сети в режиме без root-доступа осуществляется по-другому, что может привести к путанице.

  • Невозможно открыть привилегированные порты: по умолчанию вы не можете сопоставить порт контейнера с портом хоста ниже 1024. Например, docker run -p 80:80 не сработает. Самое простое решение — использовать более высокий порт, например 8080. Кроме того, вы можете изменить системные настройки, чтобы разрешить это.
  • pingкоманда не работает: в некоторых системах ping внутри контейнера может не работать. Обычно это можно исправить, добавив net.ipv4.ping_group_range = 0 2147483647 в файл /etc/sysctl.conf .
  • IP-адрес контейнера недоступен с хоста: это ожидаемое поведение. IP-адрес, указанный в docker inspect, находится в отдельном сетевом пространстве имён и недоступен напрямую с хоста. Для доступа к службам внутри контейнера всегда следует использовать сопоставление портов, например docker run -p <host-port>:<container-port>, для доступа к службам внутри контейнера. То же самое относится к --net=host, который также находится в отдельном пространстве имён.
  • Низкая производительность сети: по умолчанию в Docker без root-доступа используются сетевые драйверы, которые могут работать медленно. Установка slirp4netns (версии 0.4.0 или более поздней) может повысить пропускную способность сети.

 

Удалите Rootless Docker и вернитесь к Rootful Docker

Если вам больше не нужен Docker без root-доступа или вы хотите вернуться к Docker с root-доступом, просто удалите Docker без root-доступа с помощью команды:

dockerd-rootless-setuptool.sh uninstall

 

Эта команда остановит службу Docker, доступную пользователю, и переключится на контекст default.

+ systemctl --user stop docker.service
+ systemctl --user disable docker.service
Removed '/home/andreyex/.config/systemd/user/default.target.wants/docker.service'.
[INFO] Uninstalled docker.service
[INFO] Deleted CLI context "rootless"
Current context is now "default"
[INFO] Configured CLI to use the "default" context.On Debian and Ubuntu:
[INFO] 
[INFO] Make sure to unset or update the environment PATH, DOCKER_HOST, and DOCKER_CONTEXT environment variables if you have added them to `~/.bashrc`.
[INFO] This uninstallation tool does NOT remove Docker binaries and data.
[INFO] To remove data, run: `/usr/bin/rootlesskit rm -rf /home/andreyex/.local/share/docker`

 

Если вы добавили переменные среды PATH, DOCKER_HOST и DOCKER_CONTEXT в ~/.bashrc., удалите их. Для этого просто удалите строки, которые вы добавили на предыдущем шаге 5.

Удалите данные с помощью команды:

/usr/bin/rootlesskit rm -rf /home/andreyex/.local/share/docker

 

Обратите внимание, что мы удалили только установку Docker без прав суперпользователя. Двоичные файлы Docker по-прежнему существуют в нашей системе.

Наконец, включите службу Docker при запуске системы с помощью следующих команд:

sudo systemctl enable docker
sudo systemctl start docker

 

Проверьте состояние обслуживания:

sudo systemctl status docker

 

Теперь мы вернулись к режиму Rootful Docker.

 

Часто задаваемые вопросы (FAQ)

Вопрос: работает ли Docker без root-доступа медленнее, чем Docker с root-доступом?

О: Да, Docker без root-доступа может работать немного медленнее, поскольку он использует сеть в пользовательском режиме, но зачастую это оправдано с точки зрения безопасности.

Вопрос: Можно ли запустить Docker Compose с Docker без прав суперпользователя?

О: Да. Docker Compose V2 работает без сбоев: docker compose up -d

Вопрос: я не могу подключиться к демону Docker. Что мне делать?

О: Убедитесь, что задана переменная среды: export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock

Добавьте его в свой ~/.bashrc навсегда.

Вопрос: у меня очень медленное подключение к сети, и я не могу выйти в интернет

О: Rootless Docker использует slirp4netns для работы в сети. Если контейнеры не могут подключиться к Интернету или у них возникают проблемы с сетью: sudo apt install -y slirp4netns

Вопрос: поддерживает ли Docker без root-доступа все образы контейнеров?

О: Да, но некоторые контейнеры, требующие привилегированного доступа или определённых модулей ядра, могут не работать.

 

Заключение

Переход на Docker без прав суперпользователя — один из лучших способов обеспечить более безопасную среду для контейнеров. Запуская Docker от имени пользователя без прав суперпользователя, вы значительно снижаете уязвимость системы и защищаете её от потенциальных взломов контейнеров.

Несмотря на некоторые ограничения, которые следует учитывать, огромные преимущества в плане безопасности делают эту систему достойной внимания практически для всех.

Теперь вы можете спокойно пользоваться возможностями Docker.

Удачной (и безопасной) контейнеризации!

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Редактор: AndreyEx

Рейтинг: 5 (1 голос)
Если статья понравилась, то поделитесь ей в социальных сетях:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Это может быть вам интересно


Загрузка...

Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала