Solução de Problemas: Problemas de Permissão no Docker

Executar aplicativos com Docker como uma rotina diária pode se tornar um pesadelo quando você se depara com 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 compreende demonstrações práticas. Para acompanhar, certifique-se de ter o seguinte em mãos:

  • 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 a versão do tutorial sendo 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 preceder o comando sudo. O comando sudo é o que lhe dá direitos administrativos elevados juntamente 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

Abra o terminal e adicione o comando sudo antes do comando docker abaixo para executar a imagem hello-world do Docker. Como você está executando um comando elevado, você precisará inserir 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 a execução de comandos do Docker elevados não corrigir o erro de permissão negada, verifique se o seu Docker Engine está em execução. Assim como a execução de 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 Docker engine.

Execute o comando systemctl abaixo para confirmar o status do Docker Engine (status docker) e se ele 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 Docker hello-world como fez na seção “Executando Comandos Docker com Privilégios” 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 seu mecanismo Docker está funcionando, mas ainda está recebendo um erro de permissão negada do Docker permission denied? Se sim, é necessário 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 permission denied.

  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 indicam ao comando que adicione sua conta de usuário (programmer) ao grupo (docker). Esse comando faz com que sua conta de usuário tenha acesso de não-root.

sudo usermod -aG docker programmer

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

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

sudo newgrp docker 

Por fim, execute novamente a imagem Docker hello-world para confirmar que você não está mais vendo o erro. Se, neste ponto, você ainda estiver recebendo um erro, então considere conceder mais acesso ao arquivo docker.sock. O arquivo docker.sock é o socket UNIX, uma forma de comunicação de informações de processo entre o usuário e o sistema, que o daemon Docker escuta como 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 Docker hello-world 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 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. Para este exemplo, o arquivo de serviço do Docker será 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 onde os processos são executados. Ao mesmo tempo, o comando ExecStartPost limpa as operações que são executadas mesmo se o serviço falhar ao iniciar 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, você pode iniciar 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 do Docker hello-world e veja se ainda recebe 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 no modo privilegiado. Fazendo isso, 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 containers Docker no seu sistema e obter o ID do container 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 container que você deseja executar já está em modo privilegiado (--format='{{.HostConfig.Privileged}}'). Substitua CONTAINER_ID abaixo pelo ID real do container que você anotou no primeiro passo.

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

Se o container estiver em modo privilegiado, o comando retornará um valor true para o console. Mas se o comando retornar um valor falso, como mostrado abaixo, siga para o próximo passo.

Checking if a Container is in Privileged Mode

3. Por fim, execute o comando docker abaixo para executar o container Docker em modo privilegiado (--privileged hello-world).

sudo docker run --privileged hello-world

Conclusão

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

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

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