在 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。
Run Code Online (Sandbox Code Playgroud)$ dockerd-rootless.sh --experimental
由于无根模式是实验性的,用户需要始终使用 –experimental 运行 dockerd-rootless.sh。
重要阅读:Linux 的安装后步骤(它还链接到Docker 守护进程攻击面详细信息)。
以非 root 用户身份管理 Docker
docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字由用户 root 拥有,其他用户只能使用 sudo 访问它。docker 守护进程始终以 root 用户身份运行。
如果您在使用 docker 命令时不想使用 sudo,请创建一个名为 docker 的 Unix 组并将用户添加到其中。当 docker 守护进程启动时,它使 Unix 套接字的所有权由 docker 组读/写。
如果 docker 组不存在,请添加它:
sudo groupadd docker
Run Code Online (Sandbox Code Playgroud)
将连接的用户 "$USER" 添加到 docker 组。如果您不想使用当前用户,请更改用户名以匹配您的首选用户:
sudo gpasswd -a $USER docker
Run Code Online (Sandbox Code Playgroud)
执行newgrp docker
或注销/登录以激活对组的更改。
您可以使用
docker run hello-world
Run Code Online (Sandbox Code Playgroud)
检查是否可以在没有 sudo 的情况下运行 docker。
小智 331
要在没有 的情况下运行 docker 命令sudo
,您需要将您的用户(具有 root 权限)添加到 docker 组。对于此运行以下命令:
sudo usermod -aG docker $USER
Run Code Online (Sandbox Code Playgroud)
现在,让用户注销然后再次登录。此处通过正确的安装过程很好地解释了此解决方案。
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
与添加$USER
到docker
组具有相同的等价性。您仍然可以以可以root
访问主机文件系统的方式启动容器。
警告 2:ACL 的安全审计比基于组的安全要困难得多。当您可以使用组代替时,如果可能的话,可能避免使用 ACL,至少在与审计相关的环境中是这样。
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)
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/。
归档时间: |
|
查看次数: |
1138512 次 |
最近记录: |