背景:使用docker命令的时候,报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock
解释:/var/run/docker.sock文件,简单理解就是docker命令和docker守护进程之间,进行调用的一个凭证,如果你的docker守护进程没启动,或者该文件没有权限,那都调用不通,就会报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock
解决思路①:
检查一下docker有没有启动:
# systemctl status docker
如果只是没有启动docker,那就简单了,启动一下就可以了。如果你已经启动了,也可以尝试重启一下,不影响:
# systemctl restart docker
解决思路②:
查看该文件有没有权限,是不是存在:
# ls -lh /var/run/docker.sock
该文件在启动docker的时候,会自动创建,如果你已经重启了,那一定存在。权限是660,属于docker组,root用户。
当你不用root用户启动的时候,如ubuntu,应该使用:
在ubuntu用户下,且ubuntu用户有sudo权限:
sudo usermod -aG docker ubuntu
在root用户下:
usermod -aG docker ubuntu
解决思路③:
重装docker
#!/bin/bash
# 停止 Docker 服务
sudo systemctl stop docker
# 卸载 Docker 相关的软件包
sudo apt-get remove --purge docker-engine docker docker.io containerd runc
# 自动清理不再需要的包和依赖
sudo apt-get autoremove -y
# 清理旧的 Docker 配置文件
sudo rm -rf /etc/docker/
# 重新安装 Docker 的依赖项
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
# 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置 Docker 的存储库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker CE
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
# 启动 Docker 服务
sudo systemctl start docker
# 验证 Docker 是否正确安装
sudo docker run hello-world
echo "Docker reinstallation is complete. Your images and containers should be intact."
将上述脚本保存为 reinstall_docker.sh
,然后通过在终端运行以下命令来执行脚本:
chmod +x reinstall_docker.sh
./reinstall_docker.sh
请注意,这个脚本不会删除你的镜像和容器,但是它会删除 Docker 的配置文件(例如在 /etc/docker/
目录下的文件)。
解决思路④:
如果以上都没有解决,那么你一定遇到了和我一样奇葩的问题,用户有docker命令的权限,且对/var/run/docker.sock也有权限,dockerd也是正常启动了!但仍然报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock
那么,我有一个方案,能够立刻快速解决,手动启动dockerd,并改变docker命令和dockerd的互通,100%成功:
#先把dockerd停了
systemctl stop docker.service
systemctl stop docker.socket
#手动启动dockerd,这类加了两个监听,一个是本机2375端口,一个是/var/run/docker.sock。
/usr/bin/dockerd -H 127.0.0.1:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock
#启动之后,你就可以看到2375端口已经已经打开了:
netstat -nutlp|grep dockerd
#tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 23443/dockerd
#现在在控制台,改一下docker命令的环境变量:
export DOCKER_HOST=tcp://127.0.0.1:2375
docker ps
#成功
如果你希望其他用户或者脚本要长期调用,export DOCKER_HOST="tcp://127.0.0.1:2375"可以写到 /etc/profile中。
如果是crontab使用,则把DOCKER_HOST="tcp://127.0.0.1:2375",写到第一列。
如果有其他解决办法的大佬,请给我,谢谢。