Resolução de Problemas de Permissão Negada no Docker

Correr aplicações com Docker como uma rotina diária pode se tornar um pesadelo quando você encontra um erro como permissão negada do Docker ao tentar se conectar. Mas não se preocupe, este artigo irá ajudá-lo a voltar a funcionar em pouco tempo.

Neste tutorial, você aprenderá muitas maneiras de resolver a temida mensagem de erro de permissão negada do Docker.

Pré-requisitos

Este tutorial inclui demonstrações práticas. Para acompanhar, certifique-se de ter o seguinte em vigor:

  • As demonstrações neste tutorial são executadas no Ubuntu 20.04, mas outras distribuições Linux também funcionarão.
  • O mecanismo Docker, com o tutorial executando na versão 20.10.8, compilação 3967b7d.

Executando Comandos Docker Elevados

Muitos fatores podem levar a um erro de permissão negada ao se conectar ao Docker. Um desses fatores é que você pode estar executando comandos Docker sem anteceder o comando sudo. O comando sudo é o que concede direitos administrativos elevados junto com privilégios de segurança ao executar comandos.

Abaixo, você pode ver o temido erro de permissão negada ao tentar executar um comando docker.

Running into a permission denied error

Execute o terminal e anteceda o comando docker abaixo com sudo para executar a imagem Docker hello-world. Como você está executando um comando elevado, precisará digitar sua senha para prosseguir.

sudo docker run hello-world

Você verá uma saída semelhante à mostrada abaixo, que indica que o Docker está instalado corretamente.

Running Elevated (sudo) Docker Commands

Reiniciando o Docker Engine

Se executar comandos elevados do Docker não corrigir o erro de permissão negada, verifique se o seu Motor Docker está em execução. Assim como executar um comando docker sem o comando sudo, um Docker Engine parado aciona o erro de permissão negada. Como você corrige o erro? Reiniciando o seu motor Docker.

Execute o comando systemctl abaixo para confirmar o status do Docker Engine (status docker) e se está em execução.

sudo systemctl status docker

Abaixo, você pode ver que o Docker Engine está em execução a partir do status retornado que mostra umctive (running).

Displaying Docker Engine status

Se o Docker Engine não estiver ativo, execute o comando systemctl abaixo para iniciar o Docker Engine (start docker).

sudo systemctl start docker

Agora, execute o comando do Docker “hello-world” como fez na seção “Executando Comandos do Docker com Privilégios Elevados” para verificar se o erro foi resolvido.

sudo docker run hello-world

Adicionando Conta de Usuário a um Grupo com Acesso de Usuário Não Root

Você confirmou que o seu mecanismo Docker está funcionando, mas ainda está recebendo um erro de permissão negada do Docker “permission denied”? Se sim, você precisa adicionar sua conta de usuário a um grupo com acesso de usuário não root. Por quê? Porque qualquer comando Docker que você execute em uma máquina Linux que não esteja no grupo de usuários aciona um erro de permissão negada.

  1. Execute o comando groupadd abaixo para criar um novo grupo chamado docker. Insira sua senha para continuar executando o comando.
sudo groupadd docker

Se o grupo docker existir no grupo de usuários, você verá uma saída semelhante à mostrada abaixo.

Creating a New Group Named ‘docker’

2. Em seguida, execute o comando usermod abaixo, onde as opções -aG dizem ao comando para adicionar sua conta de usuário (programmer) ao grupo (docker). Este comando faz com que sua conta de usuário tenha acesso não root.

sudo usermod -aG docker programmer

3. Execute o comando newgrp abaixo para alterar o ID de grupo real atual para o grupo docker.

Execute este comando sempre que quiser executar o Docker como um usuário não root.

sudo newgrp docker 

4. Finalmente, execute novamente a imagem hello-world do Docker para confirmar que você não vê mais o erro. Se, neste ponto, ainda estiver recebendo um erro, considere dar mais acesso ao arquivo docker.sock. O arquivo docker.sock é o socket UNIX, uma forma de comunicar informações de processo entre o usuário e o sistema, que o daemon do Docker escuta como o ponto de entrada da API do Docker.

Execute o comando chmod abaixo para conceder a todos os usuários acesso de leitura/escrita (666) ao arquivo /var/run/docker.sock. Agora, execute novamente a imagem hello-world do Docker para ver se o erro foi resolvido.

sudo chmod 666 /var/run/docker.sock

Editando o Arquivo de Unidade de Serviço do Docker

Se executar o Docker como um usuário não-root não for suficiente para corrigir o erro, tente editar o arquivo de unidade de serviço do Docker SystemD, um sistema de controle de serviço. O arquivo de serviço do Docker contém parâmetros sensíveis que podem alterar o comportamento do daemon do Docker. Você pode modificar o comportamento padrão do arquivo de unidade do Docker adicionando um comando extra para alterar o comportamento padrão do serviço.

1. Execute o comando abaixo para abrir o arquivo de unidade de serviço do Docker no seu editor de texto favorito. Neste exemplo, o arquivo de serviço do Docker é aberto no editor de texto nano.

sudo nano /usr/lib/systemd/system/docker.service

2. Localize a área com o cabeçalho [Serviço] dentro do arquivo de unidade de serviço do Docker, conforme mostrado abaixo. Copie/cole os comandos abaixo para o arquivo de unidade de serviço do Docker e salve as alterações.

Abaixo, o comando SupplementaryGroups define os grupos Unix suplementares para onde os processos são executados. Ao mesmo tempo, o comando ExecStartPost realiza operações de limpeza que são executadas mesmo se o serviço falhar ao inicializar corretamente.

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
Editing the Docker Service Unit File

3. Agora, execute os comandos abaixo para reiniciar e habilitar o serviço do Docker. Fazendo isso permite que você inicie o serviço do Docker novamente para evitar erros ao executar comandos do Docker.

# Recarrega todos os arquivos de unidade do Docker e recria toda a árvore de dependências.
sudo systemctl daemon-reload
# Reinicia o serviço do Docker
sudo systemctl start docker
# Habilita o Docker para ser executado em seu computador.
sudo systemctl enable docker

4. Por fim, execute novamente a imagem Docker hello-world e veja se ainda obtém o erro de permissão negada.

Executando o Docker no Modo de Privilégio

Por último, mas não menos importante, na lista de correção do erro de permissão negada do Docker está executar o Docker em modo privilegiado. Fazê-lo concede a um contêiner Docker acesso root ao sistema.

Executar o Docker no modo privilegiado é arriscado e vulnerável a ataques de hackers. Portanto, seja cauteloso e execute o Docker no modo privilegiado apenas quando souber exatamente o que está fazendo.

1. Execute o comando abaixo para listar todos os contêineres Docker no seu sistema e obter o ID do contêiner que você deseja executar.

sudo docker ls -a
Listing all Docker Containers in the System

2. Em seguida, execute o comando docker inspect abaixo para verificar se o contêiner que você deseja executar já está no modo privilegiado (--format='{{.HostConfig.Privileged}}'). Substitua CONTAINER_ID abaixo pelo ID do contêiner real que você anotou no passo um.

docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID

Se o contêiner estiver no modo privilegiado, o comando retornará um valor true para o console. Mas se o comando retornar um valor falso, como mostrado abaixo, avance para o próximo passo.

Checking if a Container is in Privileged Mode

3. Por fim, execute o comando docker abaixo para executar o contêiner Docker no modo privilegiado (--privileged hello-world).

sudo docker run --privileged hello-world

Conclusão

Ao longo deste tutorial, você aprendeu muitas maneiras de resolver o erro de permissão negada do Docker, desde a execução de comandos elevados até a execução do Docker no modo privilegiado.

Agora você sabe como se livrar de um erro ao construir aplicações Docker; talvez você também queira manter suas imagens Docker limpas o tempo todo?

Source:
https://adamtheautomator.com/docker-permission-denied/