Execute contêineres no Linux sem sudo no Podman
Configure seu sistema para contêineres sem root.
Os contêineres são uma parte importante da computação moderna e, à medida que a infraestrutura em torno dos contêineres evolui, novas e melhores ferramentas começam a surgir. Antigamente era possível executar contêineres apenas com LXC, e então o Docker ganhou popularidade e as coisas começaram a ficar mais complexas. Eventualmente, obtivemos o sistema de gerenciamento de contêineres que todos merecíamos com o Podman, um mecanismo de contêiner sem daemon que torna contêineres e pods fáceis de construir, executar e gerenciar.
Os contêineres fazem interface diretamente com recursos do kernel do Linux, como cgroups e namespaces, e geram muitos novos processos dentro desses namespaces. Resumindo, executar um contêiner é literalmente executar um sistema Linux dentro de um sistema Linux. Do ponto de vista do sistema operacional, parece muito uma atividade administrativa e privilegiada. Os usuários normais geralmente não conseguem controlar livremente os recursos do sistema como os contêineres exigem. Portanto, por padrão, são necessárias permissões de root ou sudo
para executar o Podman. No entanto, essa é apenas a configuração padrão e não é de forma alguma a única configuração disponível ou pretendida. Este artigo demonstra como configurar seu sistema Linux para que um usuário normal possa executar o Podman sem o uso de sudo
("sem root").
IDs de usuário de namespace
Um namespace de kernel é essencialmente uma construção imaginária que ajuda o Linux a controlar quais processos pertencem um ao outro. São as cordas vermelhas da fila do Linux. Na verdade, não há diferença entre processos em uma fila e em outra, mas é útil isolá-los uns dos outros. Mantê-los separados é a chave para declarar um grupo de processos como um "contêiner" e o outro grupo de processos como seu sistema operacional.
O Linux rastreia qual usuário ou grupo possui cada processo por ID de usuário (UID) e ID de grupo (GID). Normalmente, um usuário tem acesso a cerca de mil UIDs subordinados para atribuir a processos filhos em um namespace. Como o Podman executa todo um sistema operacional subordinado atribuído ao usuário que iniciou o contêiner, você precisa de muito mais do que a cota padrão de subuids e subgids.
Você pode conceder a um usuário mais subuids e subgids com o comando usermod
. Por exemplo, para conceder mais subuids e subgids ao usuário tux
, escolha um UID adequadamente alto que não tenha nenhum usuário atribuído a ele (como 200.000) e aumente-o em vários milhares:
$ sudo usermod \
--add-subuids 200000-265536 \
--add-subgids 200000-265536 \
tux
Acesso ao namespace
Também existem limites para namespaces. Isso geralmente é definido como muito alto, mas você pode verificar a distribuição de namespaces pelo usuário com systctl
, a ferramenta de parâmetros do kernel:
$ sysctl --all --pattern user_namespaces
user.max_user_namespaces = 28633
São muitos namespaces e provavelmente é o que sua distribuição definiu por padrão. Se sua distribuição não possui essa propriedade ou está definida como muito baixa, você pode criá-la inserindo este texto no arquivo /etc/sysctl.d/userns.conf
:
user.max_user_namespaces=28633
Carregue essa configuração:
$ sudo sysctl -p /etc/sysctl.d/userns.conf
Execute um contêiner sem root
Depois de definir a configuração, reinicie o computador para garantir que as alterações nos parâmetros do usuário e do kernel estejam carregadas e ativas.
Depois de reiniciar, tente executar uma imagem de contêiner:
$ podman run -it busybox echo "hello"
hello
Contêineres como comandos
Os contêineres podem parecer misteriosos se você for novo neles, mas, na verdade, eles não são diferentes do seu sistema Linux existente. São literalmente processos em execução no seu sistema, sem o custo ou a barreira de um ambiente emulado ou máquina virtual. Tudo o que separa um contêiner do seu sistema operacional são namespaces de kernel, portanto, eles são apenas processos nativos com rótulos diferentes. O Podman torna isso mais evidente do que nunca e, depois que você configura o Podman para ser um comando sem raiz, os contêineres parecem mais comandos do que ambientes virtuais. O Podman facilita os contêineres e os pods, então experimente.