我如何在没有sudo的情况下使用docker?


767

在Docker的文档页面上,所有示例命令都显示为不带sudo,如下所示:

docker ps

在Ubuntu上,二进制文件称为docker.io。没有sudo也无法正常工作:

sudo docker.io ps

如何配置Docker,这样我就不需要在每个Docker命令前添加sudo前缀?


1
不要忘记启用ufw;)
Rinzwind 2014年

2
在Ubuntu 14.04 上,还有“ docker”二进制文件。
anatoly techtonik

@anatolytechtonik我还14.04 LTS用来代替'docker.io' '搬运工'在Ubuntu
Nabin

2
建议的安装不是 默认ubuntu存储库中的docker;相反,这里的说明(docs.docker.com/engine/installation/linux/ubuntulinux),建议使用docker存储库。删除所有现有的Docker内容,并验证您是否从正确的来源获得了该内容:apt-cache policy docker-engine(apt url应该来自dockerproject.org)
michael

2
别名如何?这样,您仍然可以使用带有密码保护的sudo。别名
docker

Answers:


1136

好消息:新的泊坞窗(19.03版(当前为实验版))将能够运行无根目录,从而消除使用root用户可能发生的问题。无需再为提升的权限,root和任何您不想使用的可能打开您的计算机的东西所困扰。

[DockerCon 2019]中的有关此视频,使用无根模式强化Docker守护进程

无根Docker模式的一些警告

Docker工程师说,无根模式不能被认为是整套Docker引擎功能的替代品。对无根模式的一些限制包括:

  • cgroups资源控制,apparmor安全配置文件,检查点/还原,覆盖网络等在无根模式下不起作用。
  • 从容器中暴露端口当前需要手动的socat帮助程序过程。
  • 仅基于Ubuntu的发行版以无根模式支持覆盖文件系统。
  • 当前仅针对可能不像以前那样稳定的夜间构建提供无根模式。

从Docker 19.3开始,这已经过时了(并且比需要的更加危险):

码头工人手工有这样一段话吧:

授予非root用户访问权限

docker守护程序始终以root用户身份运行,并且自Docker 0.5.2版起,docker守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字由用户root拥有,因此,默认情况下,您可以使用sudo访问它。

从版本0.5.3开始,如果您(或您的Docker安装程序)创建一个名为docker的Unix组并向其中添加用户,则docker守护进程将使守护进程启动时docker组可以读取/写入Unix套接字的所有权。 。docker守护程序必须始终以root用户身份运行,但是如果您以docker用户组中的用户身份运行docker client,则无需在所有客户端命令中添加sudo。从0.9.0开始,您可以使用-G选项指定docker以外的其他组拥有Unix套接字。

警告:泊坞窗组(或用-G指定的组)是根等效的;请参阅Docker Daemon Attack Surface的详细信息和有关为什么我们不允许非root用户在CentOS,Fedora或RHEL中运行Docker的博客文章(感谢michael-n)。

GitHub上最近发布的实验性无根模式下,工程师提到无根模式允许使用user_namespaces(7),mount_namespaces(7),network_namespaces(7)以非特权用户身份运行dockerd。

用户需要运行dockerd-rootless.sh而不是dockerd。

$ dockerd-rootless.sh --experimental

由于无根模式是实验性的,因此用户需要始终使用–experimental运行dockerd-rootless.sh。


重要信息:Linux的安装后步骤(它还链接到Docker Daemon Attack Surface详细信息)。

以非root用户身份管理Docker

泊坞窗守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字是由root用户拥有的,其他用户只能使用sudo访问它。docker守护程序始终以root用户身份运行。

如果在使用docker命令时不想使用sudo,请创建一个名为docker的Unix组并将用户添加到其中。docker守护程序启动时,它将使docker组可以读取/写入Unix套接字的所有权。


  • 添加docker组(如果尚不存在):

    sudo groupadd docker
    
  • 将连接的用户“ $ USER”添加到泊坞窗组。如果您不想使用当前用户,请更改用户名以匹配您的首选用户:

    sudo gpasswd -a $USER docker
    
  • 执行newgrp docker或注销/登录以激活对组的更改。

  • 您可以使用

    docker run hello-world
    

    检查是否可以在没有sudo的情况下运行docker。


3
是的,但是每个特权进程都可以挖掘被利用的潜力。泊坞窗是否已深入操作系统以真正授权该级别的特权?
马特2015年

3
newgrp docker没有为我工作,我不得不注销。
lolmaus-安德烈·米哈伊洛夫(Andrey Mikhaylov),2015年

43
值得指出的是,这为用户提供了不受限制,不受密码保护的根访问权限。在此处
Chris Foster

2
您无需重新启动docker守护程序即可进行此更改!!只是让您刚刚添加的用户注销然后重新登录
Tommy

4
如果使用docker login,则可能会发现.docker在主文件夹中创建的文件夹属于root。因此您在运行docker命令时会遇到此警告:WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied。我使用户的.docker文件夹无需sudo即可访问,如下所示:sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker。在chgrp似乎没有帮助的,所以可能我应该只推荐CHOWN一步。
Birchlabs

202

要在不使用的情况下运行docker命令sudo,您需要将您的用户(具有root特权)添加到docker组。对于此运行,请执行以下命令:

 sudo usermod -aG docker $USER

现在,让用户注销,然后再次登录。该解决方案很好地解释这里有合适的安装过程。


14
将用户添加到组后,运行以下命令:sg group_name -c“ bash”
madjardi's

4
您无需重新启动操作系统即可进行此更改!那将炸毁所有正在运行的容器!只要让您刚刚添加的用户注销然后登录即可
Tommy

5
该命令与其他答案中的“ sudo gpasswd -a $ {USER} docker”有何不同?如果有的话……
Ashley Aitken

9
您能否添加文档中给出的警告:“码头工人组是根等效的”,所以人们有机会考虑一下
Murmel

2
与2岁以上接受的答案具有相同的效果,但没有关于安全风险的警告
Gert van den Berg

56

将用户添加到组以docker授予运行docker权限的机制是访问的docker套接字/var/run/docker.sock。如果包含文件系统/var/run已启用ACL挂载,则也可以通过ACL来实现。

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

我仅出于完整性考虑而包括在内。

通常,我建议每当有基于组的良好替代方案时都避免使用ACL:如果仅通过查看组成员身份就可以理解系统中的特权,那就更好了。为了了解系统特权,必须在文件系统中扫描ACL条目是安全审核的另一个负担。

警告1:这root等同于添加usernamedocker组中。您仍然可以以可以root访问主机文件系统的方式启动容器。

警告2:ACL对安全审核的难度要比基于组的安全困难得多。如果可以使用组,则至少在审计相关的环境中,如果可能的话,避免使用ACL。


5
它适用于16.04
edib

这是我需要的,其他答案则要求用户具有root权限。多谢!
Mrinal Saurabh

1
更好的方式imo。组泊坞窗与根等同,并且总是危险的迹象。我认为拥有该文件的所有权没有任何不利影响。
Xerus

5
如果我正确理解@Xerus,则任何可以写入此套接字的人都可以获取与root等效的特权。因此,授予某人通过ACL访问此套接字的安全效果与将该人添加到Docker组中具有相同的安全效果。
圣保罗Ebermann

1
为我开发了Linux Mint 19。谢谢。
我们是博格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.