Como posso usar o docker sem sudo?

Nas páginas de documentação do Docker, todos os comandos de exemplo são mostrados sem sudo, como este:

docker ps

No Ubuntu, o binário é chamado docker.io. Também não funciona sem sudo:

sudo docker.io ps

Como posso configurar o Docker para não precisar prefixar todos os comandos do Docker com sudo?

Boas notícias: o novo docker (versão 19.03 (atualmente experimental)) será capaz de executar rootless negando os problemas que podem ocorrer usando um usuário root. Chega de mexer com permissões elevadas, root e qualquer coisa que possa abrir sua máquina quando você não quiser.

Vídeo sobre isso de [DockerCon 2019] endurecimento Daemon Docker com modo sem raízes

Algumas ressalvas ao modo Docker sem raízes

Os engenheiros do Docker dizem que o modo sem raízes não pode ser considerado um substituto para o conjunto completo de recursos do Docker engine. Algumas limitações ao modo sem raízes incluem:

  • cgroups controles de recursos, perfis de segurança apparmor, checkpoint/restore, redes de sobreposição etc. não trabalhe no modo sem raízes.
  • Expor portas de contêineres atualmente requer processo auxiliar socat manual.
  • Apenas as distros baseadas no Ubuntu suportam sistemas de arquivos de sobreposição no modo rootless.
  • O modo Rootless é atualmente fornecido apenas para compilações noturnas que podem não ser tão estáveis quanto você está acostumado.

A partir do docker 19.3, isso é obsoleto (e mais perigoso do que o necessário):

O manual docker tem isso a dizer sobre isso:

Dando acesso não root

O daemon do docker sempre é executado como usuário root e, desde a versão 0.5.2 do Docker, o daemon do docker se liga a um soquete Unix em vez de uma porta TCP. Por padrão, esse soquete Unix é de propriedade da raiz do Usuário e, portanto, por padrão, você pode acessá-lo com sudo.

A partir da versão 0.5.3, se você (ou seu instalador do Docker) criar um grupo Unix chamado docker e adicionar usuários a ele, o daemon do docker fará com que a propriedade do soquete Unix seja lida/gravável pelo grupo docker quando o daemon for iniciado. O daemon docker deve sempre ser executado como usuário root, mas se você executar o cliente docker como usuário no grupo docker, não precisará adicionar sudo a todos os comandos do cliente. A partir de 0.9.0, você pode especificar que um grupo diferente do docker deve possuir o soquete Unix com a opção-G.

Aviso: o grupo docker (ou o grupo especificado com-G) é equivalente à raiz; consulte Detalhes da superfície de ataque do Docker Daemon e este blogpost em Por que não permitimos que usuários não raiz executem o Docker no CentOS, Fedora ou RHEL (obrigado michael-n).

No recente lançamento do modo sem raízes experimental no GitHub, os engenheiros mencionam que o modo sem raiz permite executar dockerd como um usuário não privilegiado, usando user_namespaces( 7), mount_namespaces(7), network_namespaces(7).

Os usuários precisam executar dockerd-rootless.sh em vez de dockerd.

$ dockerd-rootless.sh --experimental

Como o modo sem raízes é experimental, os usuários precisam sempre executar dockerd-rootless.sh com-experimental.


Importante para ler: etapas pós-instalação Para Linux (também tem links para Detalhes da superfície de ataque do Docker Daemon).

Gerenciar o Docker como um usuário não root

O daemon docker se liga a um soquete Unix em vez de uma porta TCP. Por padrão, esse socket Unix é de propriedade da raiz do Usuário e outros usuários só podem acessá-lo usando sudo. O daemon do docker sempre é executado como usuário root.

Se você não quiser usar sudo ao usar o comando docker, crie um grupo Unix chamado docker e adicione usuários a ele. Quando o daemon docker é iniciado, ele torna a propriedade do soquete Unix read / gravável pelo grupo docker.


  • Adicione o grupo docker se ele ainda não existir:

     sudo groupadd docker
  • Adicione o usuário conectado " $ USER & quot; ao grupo docker. Altere o nome de usuário para corresponder ao seu usuário preferido se você não quiser usar o usuário atual:

     sudo gpasswd -a $USER docker
  • Ou fazer um newgrp docker ou faça logout / in para ativar as alterações nos grupos.

  • Você pode usar

     docker run hello-world

    para verificar se você pode executar o docker sem sudo.

Para executar o comando docker sem sudo, você precisa adicionar seu usuário (que tem privilégios de root) ao grupo docker. Para esta execução seguinte comando:

 sudo usermod -aG docker $USER

Agora, faça o logout do Usuário e faça o login novamente. Esta solução é bem explicada aqui com processo de instalação adequado.

O mecanismo pelo qual adicionar um usuário ao grupo docker concede permissão para executar o docker é obter acesso ao soquete do docker em /var/run/docker.sock. Se o sistema de arquivos que contém /var/run foi montado com ACLs permitido, este pode igualmente ser conseguido através de ACLs.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Eu só estou incluindo isso para completude.

Em geral, recomendo evitar ACLs sempre que uma boa alternativa baseada em grupos estiver disponível: é melhor que os privilégios em um sistema possam ser entendidos apenas observando as associações de grupo. Ter que verificar o sistema de arquivos em busca de entradas ACL para entender os privilégios do sistema é um fardo adicional para as auditorias de segurança.

Aviso 1: Isso tem o mesmo root equivalência como adição $USER para o docker grupo. Você ainda pode iniciar um contêiner de uma maneira que tenha root acesso ao sistema de arquivos host.

Aviso 2: As ACLs são significativamente mais difíceis para auditorias de segurança do que a segurança baseada em grupo. Provavelmente evite ACLs, se possível, quando você pode usar grupos, pelo menos em ambientes relevantes para auditoria.

Depois de criar o grupo docker e adicionar meu usuário a ele com

sudo groupadd dockersudo usermod -aG docker $USER

... Eu ainda tinha que dar o /var/run/docker.sock soquete e /var/run/docker directory as permissões adequadas para fazê-lo funcionar:

sudo chown root:docker /var/run/docker.socksudo chown -R root:docker /var/run/docker

Logout e login novamente (com esse usuário), então você será capaz de executar comandos docker sem sudo:

docker run hello-world

Os contêineres do Docker precisam ser executados por um usuário root. Você pode se adicionar ao docker grupo (por exemplo, executando sudo usermod -aG docker $USER), mas isso torna mais fácil para qualquer pessoa com acesso ao $USER conta para obter acesso root à máquina (por exemplo, montando um volume root em um contêiner privilegiado).

Uma maneira mais consciente da segurança de executar contêineres Docker como um usuário não raiz seria usar o Podman: https://podman.io/. Do seu site:

Podman é um mecanismo de contêiner sem daemon para desenvolver, gerenciar e executar contêineres OCI em seu sistema Linux. Os contêineres podem ser executados como raiz ou em modo sem raízes. Simplificar: alias docker=podman.

Outra alternativa é a singularidade, que é mais comumente implantada em ambientes HPC: https://sylabs.io/.

Que tal um alias:? Dessa forma, você ainda usa sudo, com proteção por senha. alias docker="sudo docker "

Não se esqueça de habilitar a ufw;)

No Ubuntu 14.04 [há] (Ubuntu – Error) também binário’ docker’.

A instalação recomendada é não o docker em repositórios padrão do ubuntu; em vez disso, instruções aqui ( Redirecting…), recomendo usar o repositório docker. Remova todas as coisas existentes do docker e verifique se você está obtendo a da fonte certa ' apt-cache policy docker-engine ' o URL do apt deve ser de dockerproject.org)

Que lixo é esse para exigir root para fazer coisas simples, como`docker info’. Como ‘docker info’ precisa de acesso bruto a todos os meus arquivos e dispositivos e portas para executar.

@ anatolytechtonik eu também usei ‘docker’ em vez de 'docker.io" no Ubuntu 14.04 LTS

Sim, até que o Docker implemente policykit ou algo semelhante, eu recomendo fortemente o uso de um alias, caso contrário, você também pode executar tudo como root.

sudo chmod 666 / var / run / docker.meia