使用用户命名空间共享 docker 套接字

lbe*_*ski 6 docker linux-namespaces

使用用户命名空间时,是否可以使用从 docker 容器内的主机安装的 docker 套接字?

我有以下配置:

/etc/subuid

 user:100000:65536
Run Code Online (Sandbox Code Playgroud)

/etc/subgid

 user:100000:65536
Run Code Online (Sandbox Code Playgroud)

/etc/docker/daemon.json

{                              
  "userns-remap": "ns-user" 
}
Run Code Online (Sandbox Code Playgroud)

我创建了 UID 为 100000 的用户 ns-user 和 GID 为 100000 的组 ns-user。另外,我已将 ns-user 添加到组 docker。当我在主机上以 ns 用户身份登录时,我可以通过套接字使用 docker。

问题是,当我运行安装了 docker 套接字的容器时,套接字上的权限被拒绝。docker 容器内的套接字权限:

srw-rw---- 1 nobody nogroup 0 Jun 26 15:00 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

编辑1:

为了澄清,我认为容器内的 root (uid 0) 映射到有权访问 docker socket 的主机上的 ns-user (uid 100000)。但事实上我的许可被拒绝了。为什么?

我不想使用 --userns=host 参数。

Rou*_*tor 3

您可以通过使用socat为命名空间用户创建具有正确权限的套接字来完成此操作:

sudo socat UNIX-LISTEN:/var/run/docker-userns.sock,user=1000,group=1000,mode=0600,fork UNIX-CLIENT:/var/run/docker.sock &
Run Code Online (Sandbox Code Playgroud)

您需要编写一个脚本,在容器启动之前启动它。如果套接字在 docker 之后出现,它仍然可以工作,您的容器可能会重新启动几次,直到它们能够连接到用户套接字。

我一直在寻找比这更可配置的东西。可能可以使用使用 pty 模块的 python 脚本,如此处所述