我正在通过Laravel Sail运行docker-compose设置,我想从容器内访问docker套接字。
我已经将/var/run/docker.sock
套接字添加到卷中,但当我试图通过curl访问套接字时,它会回复curl: (7) Couldn't connect to server
:
$ curl --unix-socket /var/run/docker.sock http://localhost/version
reply: curl: (7) Couldn't connect to server
这是我的docker撰写的一部分。yml文件:
services:
laravel.test:
volumes:
- '.:/var/www/html'
- /var/run/docker.sock:/var/run/docker.sock
我在这里做错了什么?
提前感谢!
基本上您正在尝试访问root
拥有的Unix套接字,因为它是/var/run/docker.sock
与root
不同的用户。
你唯一应该做的就是在你想要使用的映像中创建一个组docker
,并将该映像的用户添加到该组中,因为Socket也属于docker
组。
srw-rw---- 1 root docker 0 Jul 29 07:51 docker.sock
Dockerfile
不要使用这个,因为@David Maze注释了创建的DOCKER组的GID与主机的GID不匹配。
FROM ...
USER root
RUN groupadd docker
RUN usermod -aG docker sail
USER sail
...
Docker Compose v3
Docker Compose在其格式版本v2中有可能包括group_add
,但在v3中不再是一个选项。
即使你只能使用版本2的撰写,也可以使用版本3。
services:
laravel.test:
user: "sail:${GIP}"
volumes:
- '.:/var/www/html'
- /var/run/docker.sock:/var/run/docker.sock
当您要使用docker-compose up -d
启动容器时,首先导出主机中docker
组的组ID。
export GIP=$(cut -d: -f3 < <(getent group docker))
docker-compose up -d
那么你的sail
用户将有权访问/var/run/docker.sock
和所有Docker CLI命令。
另外,请记住docker
组授予与root
用户相同的权限。看一下Docker守护进程攻击面,了解可能对系统产生的安全影响。