Поиск по сайту:

Запускайте контейнеры в Linux без sudo в Podman


Настройте свою систему для контейнеров без root-прав.

Контейнеры являются важной частью современных вычислений, и по мере развития инфраструктуры вокруг контейнеров начали появляться новые и более совершенные инструменты. Раньше контейнеры можно было запускать только с помощью LXC, но затем Docker приобрел популярность, и все стало сложнее. В конце концов мы получили систему управления контейнерами, которую мы все заслужили, с помощью Podman, контейнерного движка без демонов, который упрощает создание, запуск и управление контейнерами и модулями.

Контейнеры напрямую взаимодействуют с возможностями ядра Linux, такими как контрольные группы и пространства имен, и порождают множество новых процессов в этих пространствах имен. Короче говоря, запуск контейнера — это буквально запуск системы Linux внутри системы Linux. С точки зрения операционной системы это очень похоже на административную и привилегированную деятельность. Обычные пользователи обычно не могут свободно распоряжаться системными ресурсами, как того требуют контейнеры, поэтому по умолчанию для запуска Podman требуются права root или sudo . Однако это только настройка по умолчанию, и это ни в коем случае не единственная доступная или предполагаемая настройка. В этой статье показано, как настроить систему Linux так, чтобы обычный пользователь мог запускать Podman без использования sudo («без root»).

Идентификаторы пользователей пространства имен

Пространство имен ядра — это, по сути, воображаемая конструкция, которая помогает Linux отслеживать, какие процессы принадлежат друг другу. Это красная очередь Linux. На самом деле разницы между процессами в одной очереди и другой нет, но полезно изолировать их друг от друга. Разделение их — это ключ к объявлению одной группы процессов «контейнером», а другую группу процессов — вашей ОС.

Linux отслеживает, какой пользователь или группа владеет каждым процессом, по идентификатору пользователя (UID) и идентификатору группы (GID). Обычно пользователь имеет доступ примерно к тысяче подчиненных UID, которые можно назначить дочерним процессам в пространстве имен. Поскольку Podman запускает всю подчиненную операционную систему, закрепленную за пользователем, запустившим контейнер, вам нужно гораздо больше, чем выделение subuid и subgids по умолчанию.

Вы можете предоставить пользователю дополнительные субиды и субгиды с помощью команды usermod . Например, чтобы предоставить пользователю tux больше subuid и subgids, выберите достаточно высокий UID, которому не присвоен ни один пользователь (например, 200 000), и увеличьте его на несколько тысяч:

$ sudo usermod \
--add-subuids 200000-265536 \
--add-subgids 200000-265536 \
tux

Доступ к пространству имен

Существуют также ограничения на пространства имен. Обычно это значение устанавливается очень высоким, но вы можете проверить выделение пользователем пространств имен с помощью systctl, инструмента параметров ядра:

$ sysctl --all --pattern user_namespaces
user.max_user_namespaces = 28633

Это множество пространств имен, и, вероятно, в вашем дистрибутиве это установлено по умолчанию. Если в вашем дистрибутиве этого свойства нет или оно установлено на очень низкое значение, вы можете создать его, введя этот текст в файл /etc/sysctl.d/userns.conf:

user.max_user_namespaces=28633

Загрузите эту настройку:

$ sudo sysctl -p /etc/sysctl.d/userns.conf

Запуск контейнера без рута

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

После перезагрузки попробуйте запустить образ контейнера:

$ podman run -it busybox echo "hello"
hello

Контейнеры, подобные командам

Контейнеры могут показаться загадочными, если вы новичок в них, но на самом деле они ничем не отличаются от вашей существующей системы Linux. Это буквально процессы, выполняющиеся в вашей системе, без затрат или барьеров, связанных с эмулируемой средой или виртуальной машиной. Все, что отделяет контейнер от вашей ОС, — это пространства имен ядра, поэтому на самом деле это просто собственные процессы с разными метками. Podman делает это более очевидным, чем когда-либо, и как только вы настроите Podman как команду без root-прав, контейнеры будут больше похожи на команды, чем на виртуальные среды. Podman упрощает работу с контейнерами и модулями, так что попробуйте.

Статьи по данной тематике: