/etc/group 和 /etc/subgid 有什么区别?

/etc/group 和 /etc/subgid 有什么区别?

我位于 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 位于较高范围内,因此无法访问该资源。

相关内容