我在我有 Ubuntu 操作系统的机器上安装了 Docker。当我运行时:
sudo docker run hello-world
一切正常,但我想隐藏 sudo
命令以使命令更短。
如果我编写的命令没有 sudo
docker run hello-world
显示以下内容:
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied. See 'docker run --help'.
当我尝试运行时也会发生同样的情况:
docker-compose up
我该如何解决这个问题?
如果要以非 root 用户身份运行 docker,则需要将其添加到 docker 组。
如果 docker 组不存在,则创建它
$ sudo groupadd docker
将您的用户添加到 docker 组。
$ sudo usermod -aG docker $USER
运行以下命令或注销并再次登录并运行(这不起作用,您可能需要先重新启动计算机)
$ newgrp docker
检查docker是否可以在没有root的情况下运行
$ docker run hello-world
如果仍然出现错误,请重新启动
$ reboot
警告
docker 组授予与 root 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅 Docker Daemon Attack Surface..
取自 docker 官方文档:manage-docker-as-a-non-root-user
升级后,我的权限被拒绝。执行 'mkb' post install steps 的步骤没有任何改变,因为我的用户已经在 'docker' 组中;我以任何方式重试了两次,但均未成功。
经过一个小时的搜索,以下解决方案终于奏效了:
sudo chmod 666 /var/run/docker.sock
解决方案来自 Olshansk。
看起来升级在没有足够权限的情况下重新创建了 'docker' 组的套接字。
问题
这个硬 chmod 打开了安全漏洞,每次重启后,这个错误一次又一次地开始,你每次都必须重新执行上述命令。我想要一个一劳永逸的解决方案。为此,您有两个问题:
1) SystemD 的问题:套接字将仅使用所有者“root”和组“root”创建。您可以使用以下命令检查第一个问题: ls -l /lib/systemd/system/docker.socket 如果一切正常,您应该看到“root/docker”而不是“root/root”。
2)图形登录问题:https://superuser.com/questions/1348196/why-my-linux-account-only-belongs-to-one-group 您可以使用以下命令检查第二个问题:groups 如果一切正常正确,您应该在列表中看到 docker 组。如果没有尝试命令 sudo su $USER -c groups 如果你看到那么 docker group 那是因为错误。
解决方案
如果您设法获得图形登录的解决方法,这应该可以完成工作:
sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket
但是如果你不能管理这个错误,一个不错的解决方案可能是这样的:
sudo chgrp $USER /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket
这是因为您处于图形环境中,并且可能是您计算机上的唯一用户。在这两种情况下,您都需要重新启动(或 sudo chmod 666 /var/run/docker.sock
)
:ro
......只要我补充说我很高兴
添加泊坞窗组
$ sudo groupadd docker
将当前用户添加到 docker 组
$ sudo usermod -aG docker $USER
将会话切换到 docker 组
$ newgrp - docker
运行一个例子来测试
$ docker run hello-world
newgrp
命令提示输入密码,但不接受我的用户密码。相反,su - $USER
努力避免注销/登录。
将当前用户添加到 docker 组
sudo usermod -aG docker $USER
更改 docker socket 的权限以能够连接到 docker daemon /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock
我用以下命令解决了这个错误:
$ sudo chmod 666 /var/run/docker.sock
它只需要更改 sock 文件的权限。
sudo chmod 666 /var/run/docker.sock
这肯定会奏效。
您可以随时尝试 https://docs.docker.com/install/linux/linux-postinstall/ 文档中的 Manage Docker as a non-root user
段落。
这样做之后,如果问题仍然存在,那么您可以运行以下命令来解决它:
sudo chmod 666 /var/run/docker.sock
chmod 666
)都可读或可写是一场安全灾难......永远不建议这样做。
root
!请参阅以下示例:fosterelli.co/privilege-escalation-via-docker 以及有关 docker 权限提升的许多其他资源。使套接字世界可写有效地赋予所有 UNIX 用户 root
权限。
666
权限。 660
或 640
应该绰绰有余。
修复 Docker 问题:(权限被拒绝)
如果 docker 组不存在,则创建它:sudo groupadd docker
查看可用系统中的超级用户数: grep -Po '^sudo.+:\K.*$' /etc/group
在 linux 命令 shell 中导出用户:export USER=demoUser
将用户添加到 docker 组:sudo usermod -aG docker $USER
运行以下命令/登录或注销:newgrp docker
检查 docker 是否运行正常: docker run hello-world
如果仍然出现错误,请重新启动:reboot
如果它不起作用,请运行以下命令:
sudo chmod 660 /var/run/docker.sock
777
777
选项,它起作用了😅
777
意味着任何人都可以对这些文件做任何事情
777
!使用 660
或 640
660
不起作用。对我来说,它是默认设置的。
尝试在 unix:///var/run/docker.sock 连接到 Docker 守护程序套接字时获得权限被拒绝:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json:拨打 unix /var/run/docker.sock:连接:权限被拒绝
sudo chmod 666 /var/run/docker.sock
这解决了我的问题。
我们总是忘记 ACLs
。请参阅setfacl
。
sudo setfacl -m user:$USER:rw /var/run/docker.sock
sudo apt install acl
安装
为了解决这个问题,我搜索了我的 docker 和 docker-compose 安装在哪里。在我的例子中,docker
安装在 /usr/bin/docker
中,而 docker-compose
安装在 /usr/local/bin/docker-compose
路径中。然后,我在终端中写下这个:
到码头工人:
sudo chmod +x /usr/bin/docker
至docker-compose
:
sudo chmod +x /usr/local/bin/docker-compose
现在我不需要在我的命令中写 docker 单词 sudo
/************************************************* ************************/
勘误表:
@mkasberg 评论了这个问题的最佳解决方案。我引用评论:
That might work, you might run into issues down the road. Also, it's a security vulnerability. You'd be better off just adding yourself to the docker group, as the docs say. sudo groupadd docker, sudo usermod -aG docker $USER.
Docs:
https://docs.docker.com/install/linux/linux-postinstall/
docker
组中。 sudo groupadd docker
,sudo usermod -aG docker $USER
。
认真的家伙。不要在你的组中添加 Docker 或修改套接字 posix(没有强化 SELinux),这是一种创建 root privesc 的简单方法。只需在 .bashrc 中添加一个别名,这样更简单、更安全: alias dc='sudo docker'。
ubuntu 21.04 systemd 套接字所有权
让我先说一句,这对我来说是在本地开发过程中非常合适的解决方案,我来这里是为了寻找 ubuntu docker permission error
,所以我就把它留在这里。
我不拥有 unix 套接字,所以我把它弄丢了。
sudo chown $(whoami):$(whoami) /var/run/docker.sock
另一个更持久的开发环境解决方案是修改 unix 套接字创建的用户所有权。这将为您的用户提供所有权,因此它将在重新启动之间保持:
sudo nano /etc/systemd/system/sockets.target.wants/docker.socket
docker.socket:
[Unit]
Description=Docker Socket for the API
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=YOUR_USERNAME_HERE
SocketGroup=docker
[Install]
WantedBy=sockets.target
sudo systemctl restart docker
之后也是如此。
重新启动机器对我有用。
$ reboot
这对我有用:
进入容器并修改文件的 ACL
sudo usermod -aG docker $USER
sudo setfacl --modify user:$USER:rw /var/run/docker.sock
这是比使用 chmod 更好的解决方案。
lightdm 和 kwallet 附带了一个似乎在登录时没有通过补充组的错误。为了解决这个问题,除了 sudo usermod -aG docker $USER
,我还必须注释掉
auth optional pam_kwallet.so
auth optional pam_kwallet5.so
至
#auth optional pam_kwallet.so
#auth optional pam_kwallet5.so
在/etc/pam.d/lightdm
重新启动之前,让 docker-group 真正生效。
错误:https://bugs.launchpad.net/lightdm/+bug/1781418,此处:https://bugzilla.redhat.com/show_bug.cgi?id=1581495
使用这个命令
sudo usermod -aG docker $USER
然后重新启动您的计算机,这对我有用。
您可以按照以下步骤操作,这对您有用:
创建一个 docker 组 sudo groupadd docker 将您的用户添加到该组 sudo usermod -aG docker $USER 列出组以确保通过运行此命令成功创建 docker 组 groups 运行以下命令也可以更改 docker group newgrp docker 的会话更改文件 docker.socksudo chown root:docker /var/run/docker.sock 的组所有权 更改 .docker 目录的所有权 sudo chown "$USER":"$USER" /home/"$USER"/.docker - R 最后 sudo chmod g+rwx "$HOME/.docker" -R
在该测试之后,您可以运行 docker ps -a
chown
docker.sock 文件。
我用 sudo
推荐来尝试这个推荐,没问题。sudo docker pull hello-world
或 sudo docker run hello-world
最直接的解决方案是键入
sudo chmod 666 /var/run/docker.sock
每次启动机器时。但是,这种方法会破坏任何可能存在的系统安全性,并向所有人开放 Docker 套接字。如果您可以接受 - 例如:您机器的唯一用户 - 然后使用它。
不过,每次启动机器时都需要它,您可以通过添加使其在启动时运行
start on startup
task
exec chmod 666 /var/run/docker.sock
到 /etc/init/docker-chmod.conf
文件。
666
是权限过多。 660
或 640
应该绰绰有余
在 Linux 环境中,安装 docker
和 docker-compose
后需要重新启动才能更好地工作 docker 以避免此问题。
$ sudo systemctl restart docker
在 Centos 上安装 Docker 之后。在以下命令下运行时,出现以下错误。
[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.soc k/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
更改 docker.socket 的组和权限
[centos@aiops-dev-cassandra3 ~]$ ls -l /lib/systemd/system/docker.socket
-rw-r--r--. 1 root root 197 Nov 13 07:25 /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chgrp docker /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chmod 666 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$ ls -lrth /var/run/docker.sock
srw-rw-rw-. 1 root docker 0 Nov 20 11:59 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$
使用以下 docker 命令进行验证
[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
[centos@aiops-dev-cassandra3 ~]$
安装 docker 后,创建 'docker' 组并向其中添加用户,编辑 docker 服务单元文件:
sudo nano /usr/lib/systemd/system/docker.service
在 [Service] 部分添加两行:
SupplementaryGroups=docker
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
保存文件(Ctrl-X、y、Enter)
运行并启用 Docker 服务:
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker
我也遇到了类似的问题,但是我想创建的容器需要将 /var/run/docker.sock 作为一个卷(Portainer Agent)挂载,同时在不同的命名空间下运行它。通常一个容器不关心它是从哪个命名空间开始的——这就是重点——但由于访问是从不同的命名空间进行的,所以必须避免这种情况。
将 --userns=host
添加到容器的运行命令使其能够使用获得正确的权限。
相当具体的用例,但是经过比我想承认的更多的研究时间,我只是认为如果其他人最终陷入这种情况,我应该与世界分享它:)
绝对不是问题所在,但由于它是谷歌搜索错误消息时的第一个搜索结果,我将把它留在这里。
首先,使用以下命令检查 docker 服务是否正在运行:
systemctl status docker.service
如果它没有运行,请尝试启动它:
sudo systemctl start docker.service
...并再次检查状态:
systemctl status docker.service
如果尚未启动,请调查原因。可能,您修改了配置文件并出错(就像我在修改 /etc/docker/daemon.json
时所做的那样)
Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字由用户 root 拥有,其他用户只能使用 sudo 访问它。 Docker 守护程序始终以 root 用户身份运行。
如果您不想在 docker 命令前加上 sudo,请创建一个名为 docker 的 Unix 组并将用户添加到其中。当 Docker 守护进程启动时,它会创建一个可供 docker 组成员访问的 Unix 套接字。
要创建 docker 组并添加您的用户:
创建 docker 组 sudo groupadd docker 将您的用户添加到 docker 组 sudo usermod -aG docker $USER 注销并重新登录,以便重新评估您的组成员身份。如果在虚拟机上进行测试,可能需要重新启动虚拟机才能使更改生效。在桌面 Linux 环境(例如 X Windows)上,完全注销会话,然后重新登录。在 Linux 上,您还可以运行以下命令来激活对组的更改: newgrp docker 验证您是否可以在不使用 sudo 的情况下运行 docker 命令.下面的命令下载一个测试图像并在容器中运行它。当容器运行时,它会打印一条信息性消息并退出 docker run hello-world
如果您在将用户添加到 docker 组之前最初使用 sudo 运行 Docker CLI 命令,您可能会看到以下错误,这表明您的 ~/.docker/ 目录是由于 sudo 命令而使用不正确的权限创建的。
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied
要解决此问题,请删除 ~/.docker/ 目录(它会自动重新创建,但所有自定义设置都会丢失),或者使用以下命令更改其所有权和权限:
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R
可以在此处找到 docker 在 linux 上的所有其他安装后步骤https://docs.docker.com/engine/install/linux-postinstall/
我尝试了所有描述的方法,但没有任何帮助解决问题。解决方案是在运行 selenoid 和 selenoid-ui 时使用 --use-drivers 参数。下面是我的 Dockerfile 的完整列表。
FROM selenoid/chrome
USER root
RUN apt-get update
RUN apt-get -y install docker.io
RUN curl -s https://aerokube.com/cm/bash | bash
RUN ./cm selenoid start --vnc --use-drivers
RUN ./cm selenoid-ui start --use-drivers
EXPOSE 4444 8080
CMD ["-conf", "/etc/selenoid/browsers.json", "-video-output-dir", "/opt/selenoid/video/"]
在我的情况下,尝试运行 docker 命令的进程本身(CI 服务器代理)无法运行它,但是当我尝试从同一用户中运行相同的命令时,它可以工作。
重新启动运行 CI 服务器代理的守护程序解决了该问题。
之前命令在代理内部不起作用的原因是因为代理在我安装 docker 并授予 docker 组权限之前正在运行,并且代理进程使用缓存的旧权限并且失败了。重新启动进程会删除缓存并使事情顺利进行。
只需打开终端并输入此命令
sudo chmod 666 /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock
这在我登录 docker 时遇到错误时对我有所帮助但现在这在我的系统中完全可以正常工作。
sudo systemctl restart docker
docker
组中基本上授予 root 访问权限,而不强制执行常规 sudo 策略和审计。有关详细信息和讨论,请参阅 GitHub issue #9976。