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

Fli*_*imm 985 docker

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

docker ps
Run Code Online (Sandbox Code Playgroud)

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

sudo docker.io ps
Run Code Online (Sandbox Code Playgroud)

如何配置 Docker 以便我不需要在每个 Docker 命令前添加 sudo 前缀?

Rin*_*ind 1343

好消息:新的 docker(版本 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 守护程序将使 Unix 套接字的所有权由 docker 组读/写. docker 守护进程必须始终以 root 用户身份运行,但如果您以 docker 组中的用户身份运行 docker 客户端,那么您无需在所有客户端命令中添加 sudo。从 0.9.0 开始,您可以使用 -G 选项指定 docker 以外的组应拥有 Unix 套接字。

警告:docker 组(或用 -G 指定的组)是 root 等效的;请参阅Docker Daemon Attack Surface 详细信息和这篇关于为什么我们不允许非 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
Run Code Online (Sandbox Code Playgroud)

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


重要阅读:Linux 的安装后步骤(它还链接到Docker 守护进程攻击面详细信息)。

以非 root 用户身份管理 Docker

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

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


  • 值得指出的是,这为用户提供了_不受限制、不受密码保护的 root 访问权限_。查看[此处的漏洞]的详细信息(https://fosterelli.co/privilege-escalation-via-docker.html) (59认同)
  • 如果你使用`docker login`,你可能会发现在你的home文件夹中创建的`.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 步骤。 (6认同)
  • 我不得不重新启动Ubunutu。注销没有用。 (6认同)
  • 是的,但每个特权进程都可能被利用。docker 是否深入到操作系统中以真正授权该级别的权限? (4认同)
  • `newgrp docker` 对我不起作用,我不得不注销。 (4认同)
  • 您无需重新启动 docker 守护进程即可进行此更改!!只需让您刚刚添加的用户注销然后重新登录 (3认同)
  • @Tommy,我还必须重新启动 docker 服务器。由于我的 docker 组不存在,/var/run/docker.sock 文件上的文件所有权是 root:root。当我重新启动 docker 服务器时,它是 root:docker。然后它对我有用。 (3认同)
  • 这不是最不安全的生产架构吗?我肯定错过了什么 (2认同)

小智 331

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

 sudo usermod -aG docker $USER
Run Code Online (Sandbox Code Playgroud)

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

  • 将用户添加到组后,运行以下命令:sg group_name -c "bash" (29认同)
  • 您能否添加文档给出的警告:“ docker group [...] is root-equivalent”,以便人们有机会思考它 (21认同)
  • 您无需重新启动操作系统即可进行此更改!这将轰炸所有正在运行的容器!只需让您刚刚添加的用户注销然后登录即可。 (8认同)
  • 该命令与其他答案中的“sudo gpasswd -a ${USER} docker”有何不同?如果根本... (7认同)
  • 效果与 2 岁以上的接受答案相同,但没有关于安全风险的警告 (7认同)
  • 这确实是 [official Docker documentation](https://docs.docker.com/engine/installation/linux/linux-postinstall/#/manage-docker-as-a-non-root-user) 建议做的能够与非特权用户一起运行 docker: (2认同)
  • @Soren 注销经常不起作用,重新启动机器并重试。可以用此信息更新答案。 (2认同)
  • 注销/登录不起作用。我这样做了 3 次,但没有成功。只有在系统重新启动后,它才起作用。Ubuntu 22.04 LTS。将答案更改为需要重新启动。 (2认同)

Chr*_*jer 118

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

sudo setfacl -m user:$USER:rw /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

我只是为了完整性而包括这个。

一般而言,我建议在基于组的良好替代方案可用时避免使用 ACL:最好仅通过查看组成员身份就可以理解系统中的权限。必须扫描文件系统中的 ACL 条目以了解系统权限是安全审计的额外负担。

警告 1:这root与添加$USERdocker组具有相同的等价性。您仍然可以以可以root访问主机文件系统的方式启动容器。

警告 2:ACL 的安全审计比基于组的安全要困难得多。当您可以使用组代替时,如果可能的话,可能避免使用 ACL,至少在与审计相关的环境中是这样。

  • @Xerus 如果我理解正确,[任何可以写入此套接字的人也可以获得与 root 等效的权限](https://www.projectatomic.io/blog/2015/08/why-we-dont-let-non-root -users-run-docker-in-centos-fedora-or-rhel/)。因此,通过 ACL 授予某人访问此套接字的权限与将该人添加到 docker 组具有相同的安全效果。 (10认同)
  • 它适用于 16.04 (8认同)
  • 我认为更好的方法。docker 组与 root 等效,这始终是危险的迹象。我不认为拥有这个文件的所有权有任何缺点。 (2认同)
  • 在 Ubuntu 20.04 上帮我完成这项工作 (2认同)
  • 工作于 22.04 (2认同)

miu*_*miu 11

创建 docker 组并将我的用户添加到其中后

sudo groupadd docker
sudo usermod -aG docker $USER
Run Code Online (Sandbox Code Playgroud)

...我仍然必须给/var/run/docker.sock套接字和/var/run/docker目录适当的权限才能使其工作:

sudo chown root:docker /var/run/docker.sock
sudo chown -R root:docker /var/run/docker
Run Code Online (Sandbox Code Playgroud)

  • 我得到“chown:更改 '/var/run/docker/netns/ingress_sbox' 的所有权:不允许操作” (2认同)

ost*_*ach 5

Docker 容器需要由 root 用户运行。您可以将自己添加到docker组中(例如,通过运行sudo usermod -aG docker $USER),但这使得有权访问该$USER帐户的任何人都可以轻松获得对机器的根访问权限(例如,通过在特权容器中安装根卷)。

以非 root 用户身份运行 Docker 容器的一种更具安全意识的方式是使用 Podman:https ://podman.io/ 。从它的网站:

Podman 是一个无守护进程的容器引擎,用于在 Linux 系统上开发、管理和运行 OCI 容器。容器可以以 root 或rootless 模式运行。简单地说:alias docker=podman

另一种选择是 Singularity,它更常部署在 HPC 环境中:https : //sylabs.io/

  • Docker无需root权限即可运行。请参阅_以非 root 用户身份运行 Docker 守护进程(Rootless 模式)_ https://docs.docker.com/engine/security/rootless/ 部分 (2认同)