sudo
,就像这个例子一样:docker ps
在Ubuntu上,二进制文件被称为
docker.io
。它也不能在没有sudo
的情况下工作。sudo docker.io ps
如何配置Docker,以便我不需要在每个Docker命令前加上“sudo”?
sudo
,就像这个例子一样:docker ps
docker.io
。它也不能在没有sudo
的情况下工作。sudo docker.io ps
关于非root用户Docker模式的一些注意事项
Docker工程师表示,非root用户模式不能被视为完整的Docker引擎功能套件的替代品。非root用户模式的一些限制包括:
- cgroups资源控制、apparmor安全配置文件、检查点/恢复、覆盖网络等在非root用户模式下无法工作。
- 从容器中暴露端口目前需要手动进行socat辅助进程。
- 只有基于Ubuntu的发行版支持非root用户模式下的覆盖文件系统。
- 非root用户模式目前仅适用于可能不像您习惯的那样稳定的夜间构建版本。
Giving non-root access
The docker daemon always runs as the root user, and since Docker version 0.5.2, the docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root, and so, by default, you can access it with sudo.
Starting in version 0.5.3, if you (or your Docker installer) create a Unix group called docker and add users to it, then the docker daemon will make the ownership of the Unix socket read/writable by the docker group when the daemon starts. The docker daemon must always run as the root user, but if you run the docker client as a user in the docker group then you don't need to add sudo to all the client commands. As of 0.9.0, you can specify that a group other than docker should own the Unix socket with the -G option.
Warning: The docker group (or the group specified with -G) is root-equivalent; see Docker Daemon Attack Surface details and this blogpost on Why we don't let non-root users run Docker in CentOS, Fedora, or RHEL (thanks michael-n).
In the recent release of the experimental rootless mode on GitHub, engineers mention rootless mode allows running dockerd as an unprivileged user, using user_namespaces(7), mount_namespaces(7), network_namespaces(7).
Users need to run dockerd-rootless.sh instead of dockerd.
$ dockerd-rootless.sh --experimental
As Rootless mode is experimental, users need to always run dockerd-rootless.sh with –experimental.
以非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
或注销/重新登录。
您可以使用以下命令检查是否可以在没有sudo
的情况下运行Docker:
docker run hello-world
newgrp docker
对我来说没有起作用,我不得不退出登录。 - lolmaus - Andrey Mikhaylovsystemctl reload docker
命令。 - jpaughdocker
组允许通过Unix套接字访问,从而进行请求。这完全是在客户端上进行的,不会主动运行,并且不受service docker restart
的影响。 - Pijusndocker login
命令,你可能会发现在你的主文件夹中创建的.docker
文件夹属于root
用户。因此,在运行docker命令时,你会遇到以下警告:WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied
。为了让我的用户能够在没有sudo权限的情况下访问.docker
文件夹,我执行了以下命令:sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker
。然而,chgrp
命令似乎没有起作用,所以我建议只执行chown
步骤。 - BirchlabsGot permission denied while trying...
错误了吗?我仍然在Docker version 20.10.2, build 20.10.2-0ubuntu1~20.04.2
上遇到这个错误,并且我仍然需要通过groupadd
过程来解决它。 - Kvothe$USER:$USER
),如果低于它则无所谓。 - Rinzwindsudo
的情况下运行docker命令,您需要将具有root权限的用户添加到docker组中。为此,请运行以下命令: sudo usermod -aG docker $USER
usermod
/useradd
,而不是使用友好且方便的前端工具adduser $USER docker
,这正是Debian推荐的方式。 - Pablo Bianchidocker
的机制是获取对位于/var/run/docker.sock
的docker套接字的访问权限。如果包含/var/run
的文件系统已启用ACL,则还可以通过ACL实现此目的。sudo setfacl -m user:$USER:rw /var/run/docker.sock
/var/run/docker.sock
的Docker套接字的访问权限”吗? - Yuval Atzmonsetfacl
命令。 - Christian Hujersudo groupadd docker
sudo usermod -aG docker $USER
/var/run/docker.sock
套接字和/var/run/docker
目录设置适当的权限,以使其正常工作:sudo chown root:docker /var/run/docker.sock
sudo chown -R root:docker /var/run/docker
sudo
的情况下运行docker命令:docker run hello-world
chown: changing ownership of '/var/run/docker/netns/ingress_sbox': Operation not permitted
的错误信息。 - Sorenchown
命令前加上sudo
,应该不会收到任何错误信息。尝试重新启动计算机,登录root账户并运行两条chown
命令(无需使用sudo
)。然后退出root用户账户,登录你的普通用户账户,并尝试在不使用sudo
的情况下使用docker。现在可以正常工作吗? - miuchown
命令。请使用 systemctl stop docker
停止 Docker,然后按照这个解决方案的命令进行操作,最后使用 systemctl start docker
启动它。 - A.Casanovadocker
组中(例如通过运行sudo usermod -aG docker $USER
),但这会使得任何具有访问$USER
帐户的人都可以轻松获得机器的root访问权限(例如通过在特权容器中挂载根卷)。另一种选择是Singularity,这在HPC环境中更常见。Podman是一个无守护进程的容器引擎,用于开发、管理和运行OCI容器。容器可以作为root或在无根模式下运行。简单来说:
alias docker=podman
。
docker info
这样简单的任务,这是什么垃圾?就像docker info
需要访问我所有的文件、设备和端口一样。 - Rolfdocker
组中,以获得用户的无限制执行权限 - 不过这样做存在安全风险,所以在需要以管理员身份运行的情况下,你应该使用sudo
来处理相关命令。 - Thomas Ward