从容器内连接到 docker 套接字

Connect to docker socket from within container

我是 运行 一个 docker-compose setup via Laravel Sail 我想从容器中访问 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-compose.yml 文件的一部分:

services:
    laravel.test:
        volumes:
            - '.:/var/www/html'
            - /var/run/docker.sock:/var/run/docker.sock

我做错了什么?

提前致谢!

基本上,您正在尝试访问 root 拥有的 Unix 套接字,因为它 /var/run/docker.sock 的用户不同于 root

您唯一应该做的就是在您要使用的图像中创建一个组 docker 并将图像的用户添加到该组,因为套接字也由 docker组。

srw-rw----  1 root  docker     0 Jul 29 07:51 docker.sock

Docker文件

DO NOT USE THIS, AS @David Maze COMENTED THE GID OF THE CREATED DOCKER GROUP COULD NOT MATCH THE GID FROM THE HOST.

FROM ...

USER root
RUN groupadd docker
RUN usermod -aG docker sail

USER sail
...

Docker 编写 v3

Docker Compose 在其格式版本 v2 中有可能包括 group_add 但在 v3 中不再是一个选项。

即使您可以只使用 compose 的版本 2,也可以选择使用 v3。

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 Daemon Attack Surface 以了解可能对您的系统造成的安全影响。