在Docker的文档页面上,所有示例命令都显示为不带sudo
,如下所示:
docker ps
在Ubuntu上,二进制文件称为docker.io
。没有sudo也无法正常工作:
sudo docker.io ps
如何配置Docker,这样我就不需要在每个Docker命令前添加sudo前缀?
apt-cache policy docker-engine
(apt url应该来自dockerproject.org)
在Docker的文档页面上,所有示例命令都显示为不带sudo
,如下所示:
docker ps
在Ubuntu上,二进制文件称为docker.io
。没有sudo也无法正常工作:
sudo docker.io ps
如何配置Docker,这样我就不需要在每个Docker命令前添加sudo前缀?
apt-cache policy docker-engine
(apt url应该来自dockerproject.org)
Answers:
好消息:新的泊坞窗(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。
newgrp docker
没有为我工作,我不得不注销。
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一步。
要在不使用的情况下运行docker命令sudo
,您需要将您的用户(具有root特权)添加到docker组。对于此运行,请执行以下命令:
sudo usermod -aG docker $USER
现在,让用户注销,然后再次登录。该解决方案很好地解释这里有合适的安装过程。
将用户添加到组以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
等同于添加username
到docker
组中。您仍然可以以可以root
访问主机文件系统的方式启动容器。
警告2:ACL对安全审核的难度要比基于组的安全困难得多。如果可以使用组,则至少在审计相关的环境中,如果可能的话,避免使用ACL。