docker.sock 权限被拒绝

2024-10-14 08:40:00
admin
原创
293
摘要:问题描述:当我尝试运行简单的docker命令时,例如:$ docker ps -a 我收到一条错误消息:权限被拒绝.../var/run/docker.sock:connect:权限被拒绝当我使用检查权限时$ ls -al /var/run/ 我看到这一行:srw-rw---- root docker doc...

问题描述:

当我尝试运行简单的docker命令时,例如:

$ docker ps -a

我收到一条错误消息:

权限被拒绝.../var/run/docker.sock:connect:权限被拒绝

当我使用检查权限时

$ ls -al /var/run/

我看到这一行:

srw-rw---- root docker docker.sock

因此,我遵循许多论坛的建议,将本地用户添加到 docker 组:

$ sudo usermod -aG docker $USER

但它没有帮助。我仍然收到相同的错误消息。我该如何修复它?


解决方案 1:

对于刚接触 shell 的人来说,命令如下:

$ sudo usermod -aG docker $USER

需要$USER在 shell 中定义。通常默认情况下会存在,但在某些 shell 中您可能需要将该值设置为您的登录 ID。


更改用户的组不会更改用户已打开的现有登录名、终端和 shell。为了避免再次执行登录,您只需运行:

$ newgrp docker

以便在当前 shell 中访问该组。


一旦完成此操作,用户实际上就拥有了服务器上的 root 访问权限,因此只对具有不受限制的 sudo 访问权限的受信任用户执行此操作。

解决方案 2:

原因:错误信息意味着当前用户无法访问docker引擎,因为用户没有足够的权限访问UNIX套接字来与引擎通信。

快速修复:

  1. 使用 sudo 以 root 身份运行该命令。

sudo docker ps
  1. 更改当前用户的 /var/run/docker.sock 权限。

sudo chown $USER /var/run/docker.sock

注意:运行sudo chmod 777 /var/run/docker.sock可以解决您的问题,但它会为所有人打开 docker 套接字,这是一个安全漏洞,正如 @AaylaSecura 指出的那样。因此,除非在本地系统上进行测试,否则不应使用它。

永久解决方案:

将当前用户添加到docker组。

sudo usermod -a -G docker $USER

注意:您必须注销并重新登录才能使更改生效。

请参阅此博客来了解有关以非 root 用户身份管理 Docker 的更多信息。

解决方案 3:

  1. 确保你的$USER变量已设置

$ echo $USER

$ sudo usermod -aG docker $USER
  1. 登出

  2. 登录后,重新启动docker服务

$ sudo systemctl restart docker

$ docker ps

解决方案 4:

输入命令并探索 docker,无需 sudo 命令

sudo chmod 666 /var/run/docker.sock

解决方案 5:

正如评论中前面提到的,更改只有在您重新登录后才会生效。如果您正在执行 SSH 并打开新终端,它将在新终端中运行

但由于您使用的是 GUI 并打开了新终端,因此更改未应用。这就是错误没有消失的原因

因此下面的命令确实完成了它的工作,只是错过了重新登录

sudo usermod -aG docker $USER

解决方案 6:

您需要以非 root 用户身份管理 docker。要创建 docker 组并添加您的用户:

  1. 创建 docker 组。

$ sudo groupadd docker

  1. 将您的用户添加到 docker 组。

$ sudo usermod -aG docker $USER

  1. 注销并重新登录,以便重新评估您的群组成员身份。

如果在虚拟机上测试,可能需要重新启动虚拟机才能使更改生效。

在桌面 Linux 环境(如 X Windows)上,完全注销您的会话,然后重新登录。

在 Linux 上,您还可以运行以下命令来激活对组的更改:

$ newgrp docker

  1. 验证您是否可以在没有 sudo 的情况下运行 docker 命令。

$ docker run hello-world

解决方案 7:

*关于这些答案的重要说明:docker 组并不总是“docker”,有时它是“dockerroot”,例如 Centos 7 安装的情况

sudo yum install -y docker

安装 Docker 后你应该做的第一件事是

sudo tail /etc/group

它应该说类似

......
sshd:x:74:
postdrop:x:90:
postfix:x:89:
yourusername:x:1000:yourusername
cgred:x:996:
dockerroot:x:995:

在这种情况下,它是“dockerroot”而不是“docker”。因此,

sudo usermod -aG dockerroot yourusername
logout

解决方案 8:

当我尝试运行简单的docker命令时,例如:$ docker ps -a

我收到一条错误消息:Got permission denied ... /var/run/docker.sock: connect: permission denied

[…] 我该如何修复它?

TL;DR:有两种方法(第一种方法,也在问题本身中提到,已被其他答案广泛解决,但存在安全问题;所以我将详细阐述这个问题,并开发第二种解决方案,它也适用于这个相当合理的用例)。


回顾一下上下文,Docker 守护进程套接字归以下人员所有root:docker

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 janv. 28 14:23 /var/run/docker.sock

因此,使用此默认设置,需要在所有 docker CLI 命令前面加上sudo

为了避免这种情况,可以:

  1. 将某人的用户帐户($USER)添加到docker组 - 但在个人工作站上这样做相当危险,因为这相当于为用户运行的所有程序提供 root 权限,而无需任何sudo密码提示或审核

参见:

* Docker 官方文档中的此页面:  

https://docs.docker.com/engine/security/#docker-daemon-attack-surface
* 记录相关*漏洞*的此页面:  

https://fosterelli.co/privilege-escalation-via-docker.html
  1. 否则,可以sudo自动添加而无需sudo docker手动输入:为此,解决方案是在中添加以下别名~/.bashrc(有关详细信息,请参阅此线程):

__docker() {
    if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
        docker "$@"
    else
        sudo docker "$@"
    fi
}
alias docker=__docker

然后可以通过打开一个新终端并输入以下内容来测试:

docker run --pul〈TAB〉 # → docker run --pull
                       # autocompletion works
docker run --pull always --rm -it debian:11  # ask one's password
docker run --help  # bypass the alias (thanks to the ) and ask no password

解决方案 9:

由于我的用户是 AD 用户,因此我必须通过手动编辑 /etc/group 文件将 AD 用户添加到本地组。遗憾的是,adduser 命令似乎不支持 nsswitch,在将某人添加到组时无法识别未在本地定义的用户。

然后重启或者刷新 /etc/group。现在,你就可以在不添加 sudo 的情况下使用 docker 了。

问候。

解决方案 10:

借助以下命令,我能够在没有 sudo 的情况下执行 docker 命令

sudo setfacl -m 用户:$USER:rw /var/run/docker.sock

解决方案 11:

我做了所有的事情,但仍然有错误。要解决这个问题,你的用户必须读/写/var/run/docker.sock

$ ls -al /var/run/ |grep docker
srw-rw----  1 root docker    0 Mar  3 10:07 docker.sock

因此,您可以进行编辑/etc/sudoers以授予您的用户 root 权限,或者您可以修改组/var/run/docker.sock以更改为 docker 组:

$ chgrp docker /var/run/docker.sock
$ ls -al /var/run/ |grep docker
srw-rw----  1 root docker    0 Mar  3 10:07 docker.sock

现在你可以docker ps不用 sudo 了。不建议更改 docker.sock 权限

解决方案 12:

如果您正在使用任何触发 docker run 命令的 node.js 进程,那么您可以使用:

sudo node index.js

如果您使用 pm2 启动 node.js 进程/服务器,进而触发 docker run 命令,则使用:

sudo pm2 start index.js

解决方案 13:

您必须使用 pns 执行程序而不是 docker。运行以下修改 configmap 的补丁,然后一切就绪了。

kubectl -n argo patch cm workflow-controller-configmap -p '{"data": {"containerRuntimeExecutor": "pns"}}' ;

参考: https: //www.youtube.com/watch? v=XySJb-WmL3Q&list=PLGHfqDpnXFXLHfeapfvtt9URtUF1geuBo&index=2&t=3996s

解决方案 14:

在docker服务器中运行下面的命令,你的问题就解决了

sudo chmod 777 /var/run/docker.sock

解决方案 15:

以 root 用户身份进入容器
docker exec -it --user root <dc5> bash

如果尚未创建,请创建 docker 组
groupadd -g 999 docker

将用户添加到docker组
usermod -aG docker jenkins

更改权限
chmod 777 /var/run/docker.sock

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   27  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   22  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   19  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用