Как перейти на 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 в предпочитаемой вами системе.
Шаг 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@
Шаг 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
Если ты увидишь:
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.
Сетевые проблемы
Работа в сети в режиме без 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.
Удачной (и безопасной) контейнеризации!
Редактор: AndreyEx