在码头工人的文档页面上,所有的示例命令都没有显示 sudo
,像这样的:
docker ps
在Ubuntu上,二进制文件被称为 docker.io
. 没有sudo它也不起作用:
sudo docker.io ps
如何配置码头工人,使我不需要在每个码头工人命令前加上sudo?
在码头工人的文档页面上,所有的示例命令都没有显示 sudo
,像这样的:
docker ps
在Ubuntu上,二进制文件被称为 docker.io
. 没有sudo它也不起作用:
sudo docker.io ps
如何配置码头工人,使我不需要在每个码头工人命令前加上sudo?
好消息:新的docker(版本19.03(目前是实验性的))将能够无根运行,否定使用root用户可能发生的问题。 没有更多的混乱提升的权限,根和任何可能打开你的机器时,你不想。
关于这个视频从 [Dockercon2019]使用无根模式强化码头工人守护进程
无根码头模式的一些注意事项
码头工人工程师说,无根模式不能被认为是码头工人引擎功能的完整套件的替代品。 无根模式的一些限制包括:
- cgroups资源控制,apparmor安全配置文件,检查点/恢复,复盖网络等。 不要在无根模式下工作。
- 从容器公开端口目前需要手动socat帮助程序进程。
- 只有基于Ubuntu的发行版支持无根模式下的复盖文件系统。
- 无根模式目前仅为可能不像您习惯的那样稳定的夜间构建提供。
从码头工人19.3开始,这已经过时了(而且比需要的更危险):
该 码头工人手册 有没有这样说:
给予非root访问权限
Docker守护程序始终以root用户身份运行,并且从Docker版本0.5.2开始,docker守护程序绑定到Unix套接字而不是TCP端口。 默认情况下,Unix套接字由用户root拥有,因此,默认情况下,您可以使用sudo访问它。
从0.5.3版本开始,如果您(或您的Docker安装程序)创建一个名为docker的Unix组并向其添加用户,那么docker守护程序将在守护程序启动时使Unix套接字的所有权可读/ Docker守护程序必须始终以root用户身份运行,但如果您以docker组中的用户身份运行docker客户端,则无需将sudo添加到所有客户端命令中。 从0.9.0开始,您可以指定docker以外的组应该拥有带有-G选项的Unix套接字。
警告:码头工人组(或用-G指定的组)是根等价的;请参阅 Docker守护进程攻击面细节 而这篇博客文章 为什么我们不让非root用户在CentOS、Fedora或RHEL中运行Docker (感谢michael-n)。
在最近发布的 GitHub上的实验无根模式,工程师提到无根模式允许以非特权用户身份运行dockerd,使用user_namespaces(7),mount_namespaces(7),network_namespaces(7)。
用户需要运行dockerd-rootless.sh 而不是dockerd。
$ dockerd-rootless.sh --experimental
由于无根模式是实验性的,用户需要始终运行dockerd-rootless.sh 与-实验。
重要阅读: Linux的安装后步骤 (它还链接到 Docker守护进程攻击面细节).
以非root用户身份管理Docker
Docker守护程序绑定到Unix套接字而不是TCP端口。 默认情况下,Unix套接字由用户root拥有,其他用户只能使用sudo访问它。 Docker守护程序始终以root用户身份运行。
如果您不想在使用docker命令时使用sudo,请创建一个名为docker的Unix组并将用户添加到其中。 当docker守护进程启动时,它使Unix套接字的所有权可由docker组读取/写入。
如果码头工人组还不存在,请添加码头工人组:
sudo groupadd docker
将连接的用户"$USER"添加到docker组。 如果您不想使用当前用户,请更改用户名以匹配您的首选用户:
sudo gpasswd -a $USER docker
要么做一个 newgrp docker
或者注销/登录以激活对组的更改。
您可以使用
docker run hello-world
检查你是否可以在没有sudo的情况下运行docker。
管理码头工人指挥 sudo
,您需要将您的用户(拥有root权限)添加到docker组。 对于此运行以下命令:
sudo usermod -aG docker $USER
现在,让用户注销,然后再次登录。 这个解决方案很好地解释了 这里 用适当的安装过程。
将用户添加到组的机制 docker
授予管理码头工人的权限,是在 /var/run/docker.sock
. 如果包含的文件系统 /var/run
已安装启用Acl,这也可以通过Acl实现。
sudo setfacl -m user:$USER:rw /var/run/docker.sock
我只是为了完整起见。
一般情况下,我建议避免Acl,只要基于组的一个好的替代方案是可用的:如果系统中的特权可以通过查看组成员身份来理解,那就更好了。 必须扫描ACL条目的文件系统为了了解系统特权是安全审计的额外负担。
警告1:这具有相同的 root
等同于添加 $USER
致 docker
组。 您仍然可以以具有以下功能的方式启动容器 root
访问主机文件系统。
警告2:Acl对于安全审计来说要比基于组的安全困难得多。 如果可能的话,至少在审计相关的环境中,可以使用组来避免Acl。
在创建码头工人组并将我的用户添加到它之后
sudo groupadd dockersudo usermod -aG docker $USER
... 我还是得给 /var/run/docker.sock
插座和 /var/run/docker
目录适当的权限,使其工作:
sudo chown root:docker /var/run/docker.socksudo chown -R root:docker /var/run/docker
注销并重新登录(使用该用户),然后您将能够运行docker命令,而无需 sudo
:
docker run hello-world
Docker容器需要由root用户运行。 您可以将自己添加到 docker
组(例如通过运行 sudo usermod -aG docker $USER
),但这使得任何可以访问 $USER
帐户以获得对机器的根访问权限(例如,通过在特权容器中安装根卷)。
作为非root用户运行Docker容器的更安全意识的方法是使用Podman: https://podman.io/. 从其网站:
Podman是一个无守护进程的容器引擎,用于在Linux系统上开发、管理和运行OCI容器。 容器可以以root身份运行,也可以在 无根模式. 简单地说:
alias docker=podman
.
另一种选择是Singularity,它更常用于HPC环境: https://sylabs.io/.
化名怎么样:? 这样,您仍然使用sudo,带有密码保护。 别名docker=“sudo docker”
不要忘记启用ufw;)
推荐的安装是默认ubuntu repos中的码头工人;相反,这里的说明(https://docs.docker.com/engine/installation/linux/ubuntulinux/),建议使用docker repo。 删除所有现有的码头工人的东西,并验证你是从正确的来源得到的:“apt-缓存策略码头工人引擎”(apt url应该来自dockerproject.org)
这是什么垃圾要求root做简单的事情,如docker info
。 像’docker info’需要原始访问我的所有文件,设备和端口才能运行。
是的,在Docker实现policykit或类似的东西之前,我强烈建议使用别名,否则您还不如以root身份运行所有内容。
sudo chmod666/var/run/docker.袜子,袜子