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

docker ps


在Ubuntu上,二进制文件称为docker.io。如果没有sudo,它也不起作用:

sudo docker.io ps


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

评论

不要忘记启用ufw;)

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

@anatolytechtonik我还在Ubuntu 14.04 LTS中使用了'docker'而不是'docker.io'

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

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

#1 楼

好消息:新的泊坞窗(19.03版(当前为实验版))将能够运行无根目录,从而消除了使用root用户可能发生的问题。无需再为提升权限,root以及任何您不想打开的机器而烦恼。
有关[DockerCon 2019]的视频,使用无根模式强化Docker守护程序

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

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



从Docker 19.3开始,这已经过时了(并且比需要的还要危险):
Docker手册对此有这样的说法:

非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
Docker守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字是由root用户拥有的,其他用户只能使用sudo访问它。 docker守护程序始终以root用户身份运行。
如果您在使用docker命令时不想使用sudo,请创建一个名为docker的Unix组并将用户添加到其中。当docker守护程序启动时,它将使docker组可以读写Unix套接字的所有权。





添加docker组(如果没有)。 t已经存在:
 sudo groupadd docker



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



执行newgrp docker或注销/登录以激活更改分组。


您可以使用
 docker run hello-world

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



评论


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

– Matanster
2015年1月10日14:24

newgrp docker对我不起作用,我不得不注销。

– lolmaus-安德烈·米哈伊洛夫(Andrey Mikhaylov)
15年3月14日在19:29

值得指出的是,这为用户提供了不受限制,不受密码保护的根访问权限。在此处查看该漏洞的详细信息

–克里斯·福斯特(Chris Foster)
15年4月22日在20:57

如果使用docker登录,则可能会发现在主文件夹中创建的.docker文件夹属于root。因此在运行docker命令时会遇到此警告:警告:加载配置文件时出错:/home/myuser/.docker/config.json-stat /home/myuser/.docker/config.json:权限被拒绝。我使用户的.docker文件夹无需sudo即可访问,如下所示:sudo chgrp -hR docker〜/ .docker && sudo chown -R myuser〜/ .docker。 chgrp似乎并没有帮助,所以大概我应该只推荐chown步骤。

–桦木实验室
17年7月28日在11:24



@Tommy,我还必须重新启动docker服务器。由于我的泊坞窗组不存在,因此/var/run/docker.sock文件的文件所有权为root:root。当我重新启动docker服务器时,它是root:docker。然后它对我有用。

–格雷格
18年1月4日在16:15

#2 楼

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

 sudo usermod -aG docker $USER


现在,让用户注销然后再次登录。通过正确的安装过程可以很好地说明此解决方案。

评论


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

– Madjardi
16-4-9在2:12



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

–汤米(Tommy)
16/09/12在15:22

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

–阿什利·艾特肯(Ashley Aitken)
17 Mar 9 '17 at 15:22

您能否添加文档给出的警告:“ docker组[...]是根等效的”,所以人们有机会考虑一下

–默默尔
17年4月24日在21:28

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

– Gert van den Berg
19年4月12日在6:33

#3 楼

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

为了完整性起见,我仅将其包括在内。
通常,我建议避免只要有基于组的良好替代方法,就可以使用ACL:如果仅通过查看组成员身份就可以理解系统中的特权,那就更好了。警告:必须扫描文件系统中的ACL条目以了解系统特权是安全审核的另一个负担。警告1:与将root添加到$USER组具有相同的docker等效性。您仍然可以通过对主机文件系统具有root访问权限的方式来启动容器。
警告2:对于基于安全性的审核,ACL比基于组的安全性要困难得多。如果可以,而至少在与审计相关的环境中,可以使用组来代替,则尽可能避免使用ACL。

评论


它在16.04上工作

–edib
17年12月12日在8:22

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

– Xerus
18年3月3日,0:54

您能描述应该执行哪些命令以“访问/var/run/docker.sock上的Docker套接字”吗?

– Yuval Atzmon
18年4月12日在16:46



@yuval答案中已经描述了该命令,它是setfacl命令。

–克里斯蒂安·休伊尔(Christian Hujer)
18年4月18日在19:47

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

–PaŭloEbermann
18年4月23日在15:26

#4 楼

创建docker组并使用
 sudo groupadd docker
sudo usermod -aG docker $USER
 

...将我的用户添加到它之后,我仍然必须给/var/run/docker.sock套接字,并/var/run/docker目录具有使其正常工作的适当权限:
 sudo chown root:docker /var/run/docker.sock
sudo chown -R root:docker /var/run/docker