docker.sock 权限被拒绝

2024-10-14 08:40:00
admin
原创
119
摘要:问题描述:当我尝试运行简单的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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用