Docker中的用户概念是什么,卷中的权限是如何工作的?

25

我不理解 Docker 中的用户概念。

我的问题如下:

  1. 每个 Docker 容器是否有自己的用户和组,或者 Docker 容器使用主机用户管理?

  2. 我们传递给 docker run 命令的 --user 参数是什么?

  3. Docker 容器或 Docker 守护进程是否能在主机操作系统上创建用户?

  4. Docker 卷中的所有权和文件权限是如何工作的?

对于第 4 个问题,假设我有以下卷:

--volume /var/run/docker.sock:/var/run/docker.sock

而主机操作系统中 lsid 命令的结果如下:

root@tashkhisi:/var/run# ls -l docker.sock
srw------- 1 root docker 0 Jul 30 18:44 docker.sock

root@novinhost:/var/run# id -u  root
0

这是不是意味着我只能通过Docker容器内的id为0的用户来访问该文件?
我的意思是容器看到该文件与原始文件权限相同,但使用自己的用户?

请注意,我只想了解权限如何工作,请不要注意/var/run/docker.sock文件。
我只是用它作为一个常见的用例。


请查看以下网址:https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf - fjc
5个回答

11
是的,每个容器都有自己的一组用户。如果您查看容器内部的用户ID,您会发现非常大的数字(在Linux中完全正常),这些数字是单独创建的。Dockerd具有用于此目的的UID范围。
--user选项只是运行su的快捷方式;它从默认的root切换到另一个用户,以便在容器内部调用第一个命令。
您通常无法从容器内部创建主机用户(除非您通过容器外部的方法或执行奇怪的操作,如将主机的/etc挂载到容器中...这可能不是您所问的);而且守护程序本身当然也没有这样做。
对于您的最后一个问题:挂载主机卷通常会导致权限问题-例如,在容器内部创建文件,它们将以主机端的大UID结尾(即我上面提到的临时UID)。在您的情况下,默认情况下只有root才能访问该文件。您需要适当地使用chown。您可以运行docker run --user uid:group,从而覆盖dockerd通常为您创建的临时UID / GID。
但是您的特定问题似乎涉及一种称为“docker in docker”或“dind”的东西,在其中通过将主机docker套接字挂载到容器中来从容器内部运行docker命令。请搜索该内容或提出更具体的问题。应该有大量教程等可用。
此外,一个最后的提示:可以将docker守护进程本身作为非root用户运行。对此,我也将参考您到谷歌或Docker文档,因为您目前没有询问这方面的问题,如果您选择这个路线,事情会变得非常复杂...

谢谢您的回答,我已经更新了我的问题,请您回答第四个问题。 - Tashkhisi
谢谢,但我只想知道Docker卷中权限是如何工作的。我只是使用了/var/run/docker.sock,因为这是一个常见的用例。 - Tashkhisi
我对您第一个回答@anoe持有不同的意见,如果您参考https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf,主机和容器都使用相同的UID集合。 - ashishpm

7
每个Docker容器都有自己的用户和组。
Docker容器不使用主机用户管理。
我们在docker run命令中传递的--user参数是什么?Dockerfile USER指令文档很短,我将转述它的内容:一个容器内的默认用户是root(id=0)。镜像开发者可以创建其他用户。这些用户可以通过名称访问。开发者可以选择一个用户来使用--user命令行选项运行第一个进程。
Docker容器或Docker守护进程是否能够在主机操作系统上创建用户?您可以在主机上启动sshd,在docker容器到主机的登录中通过ssh进行操作。
"docker volume"中的所有权和文件权限如何工作?没有任何区别。在此不必解释*unix用户-组-其他权限模型如何工作,请参考无尽的网络资源...
这是否意味着我只能使用Docker容器中ID为0的用户从Docker容器内部访问该文件?是的——权限是rw-------...我的意思是容器使用原始文件权限,但使用自己的用户查看该文件?是的。--volume选项只是mount -o bind的一种方式。

谢谢您的回答,我已经更新了我的问题,请您回答第四个问题。 - Tashkhisi

3
一般来说,容器不会在主机操作系统上创建任何东西1。它们启动、运行并被销毁,不留下任何永久的痕迹。
“用户”完全在容器内部,实际上只是一个ID号,与组相同。它们存在于容器的限制范围内,并对主机操作系统没有影响。也就是说,/etc/passwd文件用于定义用户及其相对权限,与文件系统所有权和潜在的SElinux相关。这实际上取决于您的容器使用什么作为基础。
有时容器会为了各种原因(通常是安全)使用具有更受限制的权限的用户来运行服务。这很常见。--user选项允许您像在容器本身中定义的特定用户一样运行命令。
一个超级简单的容器可能只有root作为用户,ID为1。大多数容器由于各种历史原因而拥有更多的用户2,但它们通常不被使用。
1 从技术上讲,它们确实会创建一些工件,比如正在运行的容器图像,开放的端口等等,但不会像用户、组或任意文件那样。在任何情况下,如果您拥有足够广泛的特权容器,它可以随意操作。 2 例如,许多容器都带有像邮件、FTP、游戏甚至UUCP这样的陈旧遗物,尽管这些都不会被使用。

谢谢您的回答,我已经更新了我的问题,请您回答第四个问题。 - Tashkhisi
文件权限的工作方式与以往相同,应用用户/组/其他设置与进程的UID/GID进行比较。 - tadman
那是用户的UID,而不是进程。 - Tashkhisi
@tashkhisi 如果没有正在运行的进程,“用户”只是“/etc/passwd”文件中的一行。 - tadman

1
请查看以下答案。
  • 每个Docker容器都有自己的用户和组,还是Docker容器使用主机用户管理?

    在构建Docker镜像时,我们必须指定要为容器创建的用户。默认情况下,所有内容都使用root用户创建。

  • 我们向docker run命令传递的--user参数是什么?

    在Docker中运行容器时,我们可以通过使用--user来指定启动容器的用户。只有当在Docker镜像构建期间创建了相同的用户时,容器才会启动,否则它将无法启动容器。

  • Docker容器或Docker守护程序是否可以在主机操作系统上创建用户?

    Docker守护程序在主机操作系统上创建Docker容器,但每个容器都有自己的内核,因此无法在主机操作系统中创建用户。

您可以在这篇文章中了解更多细节:Docker 容器中 uid 和 gid 的工作原理 | 作者 Marc Campbell | Medium


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接