从容器内连接到docker socket



我正在通过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.sockroot不同的用户。

你唯一应该做的就是在你想要使用的映像中创建一个组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守护进程攻击面,了解可能对系统产生的安全影响。

最新更新