系统重启后Docker容器内Jenkins无法访问docker.sock问题求助
解决Docker套接字权限问题及Jenkins容器连接宿主机Docker的方案
报错信息
ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/_ping : dial unix /var/run/docker.sock: connect: permission denied
问题背景
- 已尝试给
docker.sock添加sudo权限、修改权限为666,但系统重启后权限会重置,且知晓666权限存在安全风险 - 需求:要么持久化
docker.sock的权限设置,要么解决Jenkins容器与宿主机docker.sock的连接问题 - 试过Stack Overflow上的方案,均未解决
方案一:通过用户组持久化权限(推荐,无安全风险)
这是Docker官方推荐的方式,避免直接修改套接字权限带来的安全隐患:
- 宿主机确认docker用户组存在,不存在则创建:
sudo groupadd docker - 将宿主机中启动Jenkins容器的用户加入docker组:
sudo usermod -aG docker $USER - 重启Docker服务:
sudo systemctl restart docker - 退出当前终端重新登录,使组权限生效
如果是Jenkins容器内部需要访问宿主机docker.sock,需额外配置:
- 启动容器时挂载宿主机的
/etc/group文件,同步宿主机组信息:docker run -d -v /var/run/docker.sock:/var/run/docker.sock -v /etc/group:/etc/group -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts - 进入容器,将jenkins用户加入docker组:
docker exec -it <你的Jenkins容器ID> bash usermod -aG docker jenkins - 重启Jenkins容器使权限生效
方案二:持久化设置docker.sock权限(不推荐,有安全风险)
如果必须使用666权限,可通过systemd服务实现持久化:
- 创建systemd服务文件:
sudo touch /etc/systemd/system/docker-sock-perms.service - 编辑文件,写入以下内容:
[Unit] Description=Set Docker socket permissions After=docker.service [Service] Type=oneshot ExecStart=/bin/chmod 666 /var/run/docker.sock [Install] WantedBy=multi-user.target - 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable docker-sock-perms.service sudo systemctl start docker-sock-perms.service
此配置会在每次Docker服务启动后自动设置docker.sock为666权限,系统重启后依然生效
方案三:使用Docker-in-Docker(DinD)(适用于隔离场景)
如果不需要共享宿主机Docker环境,可使用DinD模式:
- 启动Jenkins DinD镜像:
docker run -d --privileged -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-dind
这种模式下容器内有独立的Docker daemon,无需挂载宿主机docker.sock,但资源占用较高,且与宿主机环境完全隔离
内容的提问来源于stack exchange,提问作者hanisntsolo
相关产品推荐
相关产品推荐

