我位于 Docker 上下文中,并且使用用户命名空间将容器的用户映射到主机的用户(假设为 foo)。当我使用 portainer (作为容器)时,我需要绑定 Docker 套接字。
$ll /var/run/docker.sock
srw-rw---- 1 root docker 0 nov. 14 11:47 /var/run/docker.sock
$sudo cat /etc/docker/daemon.json
{
"userns-remap": "foo"
}
$id
uid=1000(foo) gid=1000(foo) groupes=1000(foo),999(docker)
$getent group docker
docker:x:999:foo
即使我的 foo 用户被允许访问 docker 组的文件并且 Docker 使用我的 foo 用户运行 docker 进程,我的 portainer 也不允许访问套接字。
现在,如果我将此行添加到 /etc/subgid,我的问题就解决了:
foo:999:1
我对这一行的理解是:foo用户被允许访问gid从999开始的第一个组,即999(999+0)。我的 foo 用户被允许访问 999 gid,即 docker 组。
正如我所看到的,以下之间存在差异:
$getent group docker
docker:x:999:foo
和
grep 999 /etc/subgid
foo:999:1
我的问题:这两种配置有什么区别,为什么我需要 subgid 设置来允许我的容器访问我的 Docker 套接字?
谢谢 !
答案1
具有用户命名空间映射
/etc/subuid for User IDs
/etc/subgid for Group IDs
用于确定容器上下文中的用户 ID 映射到实际主机 ID 的范围。
所以,对于一个
/etc/subuid > foo:100000:5000
例如属于“0”的进程在该容器实际上可能属于主机上的 User NS,其用户 ID 位于 100000+5000 之间。
如果现在在主机上下文中某些资源仅限于特定的用户 ID,则可能是虽然在容器中用户 ID 在实际主机上下文中看起来不错,但该 ID 位于较高范围内,因此无法访问该资源。