没有sudo如何使用docker?

在码头工人的文档页面上,所有的示例命令都没有显示 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 等同于添加 $USERdocker 组。 您仍然可以以具有以下功能的方式启动容器 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;)

在Ubuntu14.04[有](Ubuntu – Error

推荐的安装是默认ubuntu repos中的码头工人;相反,这里的说明(https://docs.docker.com/engine/installation/linux/ubuntulinux/),建议使用docker repo。 删除所有现有的码头工人的东西,并验证你是从正确的来源得到的:“apt-缓存策略码头工人引擎”(apt url应该来自dockerproject.org

这是什么垃圾要求root做简单的事情,如docker info。 像’docker info’需要原始访问我的所有文件,设备和端口才能运行。

@anatolytechtonik我也用’docker’代替’docker.io’在Ubuntu14.04LTS

是的,在Docker实现policykit或类似的东西之前,我强烈建议使用别名,否则您还不如以root身份运行所有内容。

sudo chmod666/var/run/docker.袜子,袜子