iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >docker容器中的uid和gid是什么
  • 838
分享到

docker容器中的uid和gid是什么

2024-04-02 19:04:59 838人浏览 八月长安
摘要

本篇内容介绍了“Docker容器中的uid和gid是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先来

本篇内容介绍了“Docker容器中的uid和gid是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

docker容器中的uid和gid是什么

先来了解下 uid 和 gid

uid 和 gid 由 linux 内核负责管理,并通过内核级别的系统调用来决定是否应该为某个请求授予特权。比如当进程试图写入文件时,内核会检查创建进程的 uid 和 gid,以确定它是否有足够的权限修改文件。注意,内核使用的是 uid 和 gid,而不是用户名和组名。

简单起见,本文中剩下的部分只拿 uid 进行举例,系统对待 gid 的方式和 uid 基本相同。

很多同学简单地把 docker 容器理解为轻量的虚拟机,虽然这简化了理解容器技术的难度但是也容易带来很多的误解。事实上,与虚拟机技术不同:同一主机上运行的所有容器共享同一个内核(主机的内核)。容器化带来的巨大价值在于所有这些独立的容器(其实是进程)可以共享一个内核。这意味着即使由成百上千的容器运行在 docker 宿主机上,但内核控制的 uid 和 gid 则仍然只有一套。所以同一个 uid 在宿主机和容器中代表的是同一个用户(即便在不同的地方显示了不同的用户名)。

注意,由于普通的用来显示用户名的 linux 工具并不属于内核(比如 id 等命令),所以我们可能会看到同一个 uid 在不同的容器中显示为不同的用户名。但是对于相同的 uid 不能有不同的特权,即使在不同的容器中也是如此。

如果你已经了解了 linux 的 user namespace 技术,参考《linux namespace : user》,你需要注意的是到目前为止,docker 默认并没有启用 user namesapce,这也是本文讨论的情况。笔者会在接下来的文章中介绍如何配置 docker 启用 user namespace。

容器中默认使用 root 用户

如果不做相关的设置,容器中的进程默认以 root 用户权限启动,下面的 demo 使用 ubuntu 镜像运行 sleep 程序:

$ docker run -d --name sleepme ubuntu sleep infinity

注意上面的命令中并没有使用 sudo。笔者在宿主机中的登录用户是 nick,uid 为 1000:

docker容器中的uid和gid是什么

在宿主机中查看 sleep 进程的信息:

$ ps aux | grep sleep

docker容器中的uid和gid是什么

sleep 进程的有效用户名称是 root,也就是说 sleep 进程具有 root 权限。

然后进入容器内部看看,看到的情况和刚才一样,sleep 进程也具有 root 权限:

docker容器中的uid和gid是什么

那么,容器内的 root 用户和宿主机上的 root 用户是同一个吗?

答案是:是的,它们对应的是同一个 uid。原因我们在前面已经解释过了:整个系统共享同一个内核,而内核只管理一套 uid 和 gid。

其实我们可以通过数据卷来简单的验证上面的结论。在宿主机上创建一个只有 root 用户可以读写的文件:

docker容器中的uid和gid是什么

然后挂载到容器中:

$ docker run --rm -it -w=/testv -v $(pwd)/testv:/testv ubuntu

在容器中可以读写该文件:

docker容器中的uid和gid是什么

我们可以通过 dockerfile 中的 user 命令或者是 docker run 命令的 --user 参数指定容器中进程的用户身份。下面我们分别来探究这两种情况。

在 dockerfile 中指定用户身份

我们可以在 dockerfile 中添加一个用户 appuser,并使用 user 命令指定以该用户的身份运行程序,dockerfile 的内容如下:

from ubuntu
run useradd -r -u 1000 -g appuser
user appuser
entrypoint ["sleep", "infinity"]

编译成名称为 test 的镜像:

$ docker build -t test .

docker容器中的uid和gid是什么

用 test 镜像启动一个容器:

$ docker run -d --name sleepme test

在宿主机中查看 sleep 进程的信息:

docker容器中的uid和gid是什么

这次显示的有效用户是 nick,这是因为在宿主机中,uid 为 1000 的用户的名称为 nick。再进入到容器中看看:

$ docker exec -it sleepme bash

docker容器中的uid和gid是什么

容器中的当前用户就是我们设置的 appuser,如果查看容器中的 /etc/passwd 文件,你会发现 appuser 的 uid 就是 1000,这和宿主机中用户 nick 的 uid 是一样的。

让我们再创建一个只有用户 nick 可以读写的文件:

docker容器中的uid和gid是什么

同样以数据卷的方式把它挂载到容器中:

$ docker run -d --name sleepme -w=/testv -v $(pwd)/testv:/testv test

docker容器中的uid和gid是什么

在容器中 testfile 的所有者居然变成了 appuser,当然 appuser 也就有权限读写该文件。

这里到底发生了什么?而这些又这说明了什么?

首先,宿主机系统中存在一个 uid 为 1000 的用户 nick。其次容器中的程序是以 appuser 的身份运行的,这是由我们通过 user appuser 命令在 dockerfile 程序中指定的。

事实上,系统内核管理的 uid 1000 只有一个,在宿主机中它被认为是用户 nick,而在容器中,它则被认为是用户 appuser。
所以有一点我们需要清楚:在容器内部,用户 appuser 能够获取容器外部用户 nick 的权利和特权。在宿主机上授予用户 nick 或 uid 1000 的特权也将授予容器内的 appuser。

从命令行参数中自定用户身份

我们还可以通过 docker run 命令的 --user 参数指定容器中进程的用户身份。比如执行下面的命令:

$ docker run -d --user 1000 --name sleepme ubuntu sleep infinity

docker容器中的uid和gid是什么

因为我们在命令行上指令了参数 --user 1000,所以这里 sleep 进程的有效用户显示为 nick。进入到容器内部看一下:

$ docker exec -it sleepme bash

docker容器中的uid和gid是什么

这是个什么情况?用户名称居然显示为 "i have no name!"!去查看 /etc/passwd 文件,里面果然没有 uid 为 1000 的用户。即便没有用户名称,也丝毫不影响该用户身份的权限,它依然可以读写只有 nick 用户才能读写的文件,并且用户信息也由 uid 代替了用户名:

docker容器中的uid和gid是什么

需要注意的是,在创建容器时通过 docker run --user 指定的用户身份会覆盖掉 dockerfile 中指定的值。
我们重新通过 test 镜像来运行两个容器:

$ docker run -d test

查看 sleep 进程信息:

docker容器中的uid和gid是什么

$ docker run --user 0 -d test

再次查看 sleep 进程信息:

docker容器中的uid和gid是什么

指定了 --urser 0 参数的进程显示有效用户为 root,说明命令行参数 --user 0 覆盖掉了 dockerfile 中 user 命令的设置。

“docker容器中的uid和gid是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: docker容器中的uid和gid是什么

本文链接: https://www.lsjlt.com/news/96666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • docker容器中的uid和gid是什么
    本篇内容介绍了“docker容器中的uid和gid是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先来...
    99+
    2024-04-02
  • Linux系统怎么修改已有用户的uid和gid
    本篇内容介绍了“Linux系统怎么修改已有用户的uid和gid”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Linux系统下有时需要在不同主...
    99+
    2023-06-06
  • Docker镜像和Docker容器的关系是什么
    本篇内容主要讲解“Docker镜像和Docker容器的关系是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker镜像和Docker容器的关系是什么”吧...
    99+
    2024-04-02
  • 什么是Docker容器
    本篇内容主要讲解“什么是Docker容器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Docker容器”吧!容器技术的起源假设你们公司正在秘密研发下一个“...
    99+
    2024-04-02
  • Docker和容器镜像的区别是什么
    本篇文章为大家展示了Docker和容器镜像的区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。很多刚刚接触容器技术的朋友,不容易弄清楚容器,容器镜像和Docker这几个词的区别和联系。我们首先...
    99+
    2023-06-04
  • linux uid的作用是什么
    这篇文章主要介绍“linux uid的作用是什么”,在日常操作中,相信很多人在linux uid的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux uid的...
    99+
    2023-03-13
    linux uid
  • uid在linux中的概念是什么
    本篇内容介绍了“uid在linux中的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!UID在linux中是“用户标识码”的意思。U...
    99+
    2023-06-29
  • Kubernetes和Docker容器的存储方式是什么
    Kubernetes和Docker容器的存储方式是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。目前,容器存储是容器离不开的一个话题,对于无状态的Docke...
    99+
    2023-06-05
  • Docker中列出容器的方法是什么
    在Docker中,要列出正在运行的容器可以使用docker ps命令。这个命令会列出当前正在运行的容器的一些基本信息,如容器ID、名...
    99+
    2024-03-14
    Docker
  • docker中容器与镜像的区别是什么
    本篇文章为大家展示了docker中容器与镜像的区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是镜像?镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AU...
    99+
    2023-06-15
  • docker容器管理的方法是什么
    Docker容器可以通过以下几种方法进行管理: Docker CLI:使用Docker命令行工具来管理和操作容器,如创建、启动、...
    99+
    2024-04-02
  • Docker容器采用的趋势是什么
    这篇文章主要讲解了“Docker容器采用的趋势是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Docker容器采用的趋势是什么”吧!linux操作系统在...
    99+
    2024-04-02
  • Docker容器的创建原理是什么
    这篇文章主要讲解了“Docker容器的创建原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Docker容器的创建原理是什么”吧!一:简介容器的核心技术是Cgroup+Namespac...
    99+
    2023-06-04
  • Docker容器使用方法是什么
    这篇文章主要介绍了Docker容器使用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker容器使用方法是什么文章都会有所收获,下面我们一起来看看吧。新建并启动所需要的命令主要为 dockerru...
    99+
    2023-07-02
  • docker进入mysql容器的方法是什么
    可以通过以下步骤进入MySQL容器: 首先可以运行docker ps命令查看正在运行的Docker容器,并找到MySQL容器的ID...
    99+
    2024-04-09
    docker mysql
  • docker容器间通信的方法是什么
    Docker容器间通信的方法有以下几种: 使用容器名称或ID进行通信:每个Docker容器都有一个唯一的名称或ID,可以使用这个...
    99+
    2023-10-25
    docker
  • docker容器部署redis步骤是什么
    这篇文章主要介绍“docker容器部署redis步骤是什么”,在日常操作中,相信很多人在docker容器部署redis步骤是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”docker容器部署redis步骤...
    99+
    2023-06-21
  • docker容器自启动命令是什么
    本篇内容主要讲解“docker容器自启动命令是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“docker容器自启动命令是什么”吧!docker容器自启动命令可以通过增加参数来达到,服务重启后...
    99+
    2023-07-04
  • docker显示所有容器的方法是什么
    要详细显示所有 Docker 容器的信息,您可以使用以下命令: docker ps -a 这将列出所有的 Docker 容器,并显...
    99+
    2024-04-02
  • Docker查询、停止、删除和重启容器的方法是什么
    本文小编为大家详细介绍“Docker查询、停止、删除和重启容器的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Docker查询、停止、删除和重启容器的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-05
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作