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

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

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

docker ps

在 Ubuntu 上,二进制文件名为docker.io。如果没有 ,它也无法运行sudo

sudo docker.io ps

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

答案1

好消息:新版 Docker 19.03(目前处于试验阶段)将能够以无根方式运行,从而消除使用根用户时可能出现的问题。不再需要处理提升的权限、根权限以及任何可能在您不想打开计算机时打开的东西。

关于此内容的视频来自[DockerCon 2019] 使用 Rootless 模式强化 Docker 守护进程

关于 rootless Docker 模式的一些注意事项

Docker 工程师表示,rootless 模式不能被视为 Docker 引擎全套功能的替代品。rootless 模式的一些限制包括:

  • 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 守护程序将在守护程序启动时使 Unix 套接字的所有权由 docker 组读取/写入。docker 守护程序必须始终以 root 用户身份运行,但如果您以 docker 组中的用户身份运行 docker 客户端,则无需向所有客户端命令添加 sudo。从 0.9.0 开始,您可以使用 -G 选项指定除 docker 之外的组应拥有 Unix 套接字。

警告:docker 组(或用 -G 指定的组)与 root 等效;请参阅Docker Daemon 攻击面详细信息以及这篇博文为什么我们不允许非 root 用户在 CentOS、Fedora 或 RHEL 中运行 Docker(感谢 michael-n)。

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

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

$ dockerd-rootless.sh --experimental

由于 Rootless 模式尚处于实验阶段,用户需要始终使用 –experimental 运行 dockerd-rootless.sh。


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

以非 root 用户身份管理 Docker

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

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


  • docker如果组尚不存在,请添加该组:

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

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

  • 您可以使用

     docker run hello-world
    

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

答案2

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

 sudo usermod -aG docker $USER

现在,让用户注销然后再次登录。这个解决方案解释得很好这里采用正确的安装过程。

答案3

将用户添加到组以授予运行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与添加$USER到组具有相同的等效性。您仍然可以以可以访问主机文件系统docker的方式启动容器。root

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

答案4

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

以非 root 用户身份运行 Docker 容器的更安全的方式是使用波德曼. 摘自其网站:

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

另一种选择是奇点,其在 HPC 环境中部署更为普遍。

相关内容