解决 Linux 中 IntelliJ IDEA 连接 Docker 守护进程权限问题
问题
如果使用 Linux 系统,并且本地安装了 Docker Engine,在 IDEA 中可以通过 Unix socket 连接到 Docker 守护进程,但是有可能出现权限不够无法连接的错误:
Cannot connect: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (Details: [13]权限不够)
解决方法一
可以通过 sudo
或以 root 用户启动 IDEA,这种方式启动后可以解决权限问题,但是 IDEA 会在 root 用户目录下创建隐藏配置目录(同时也可以在 IDEA 中使用 1024 以下端口启动项目了)。我本人不太想使用这种方式,会修改到 root 用户的一些文件,并且我自己平常也要尽可能少的使用 root 用户,Linux 也有 capabilities 等扩大普通用户能力的方式,也是可以更少地使用超级用户做一些工作。
解决方法二
查看 /run/docker.sock
的权限可知只有 root 用户和 docker 组有读写权限:
$ ls -l /var/run
lrwxrwxrwx 1 root root 4 12月 8 14:22 /var/run -> /run # /var/run 是 /run 的链接文件
$ ls -l /run/docker.sock
srw-rw---- 1 root docker 0 4月 14 22:15 /run/docker.sock
可以将当前用户加入 docker 组获得访问权限:
sudo usermod -aG docker $USER # 将登录用户添加到 docker 组中
newgrp docker # 更改 GID
这种方式将当前登录用户的 gid 修改为 docker,可能在其他地方会出现权限问题。
解决方法三
- 查看 docker.socket 状态信息:
$ systemctl status docker.socket ● docker.socket - Docker Socket for the API Loaded: loaded (/lib/systemd/system/docker.socket; enabled; vendor preset: enabled) Active: active (running) since Fri 2023-04-14 22:15:44 CST; 22min ago Until: Fri 2023-04-14 22:15:44 CST; 22min ago Triggers: ● docker.service Listen: /run/docker.sock (Stream) Tasks: 0 (limit: 38111) Memory: 4.0K CGroup: /system.slice/docker.socket
- 修改 docker.socket 单元文件:
$ sudo vim /lib/systemd/system/docker.socket [Unit] Description=Docker Socket for the API [Socket] # If /var/run is not implemented as a symlink to /run, you may need to # specify ListenStream=/var/run/docker.sock instead. ListenStream=/run/docker.sock SocketMode=0660 SocketUser=root SocketGroup=root [Install] WantedBy=sockets.target
- 重新加载守护进程配置,重启守护进程:
$ sudo systemctl daemon-reload $ sudo systemctl restart docker.socket $ ls -l /run/docker.sock srw-rw---- 1 root root 0 4月 14 22:58 /run/docker.sock
这种方式可以自定义 /run/docker.sock
的权限,解决权限不够问题。
最终效果:
成功解决!