前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【云原生 • Docker】Docker核心UTS Namespace原理实践

【云原生 • Docker】Docker核心UTS Namespace原理实践

作者头像
Reactor2020
发布2023-04-20 20:03:13
9211
发布2023-04-20 20:03:13
举报
文章被收录于专栏:【云原生 • Prometheus】

【云原生 • Docker】Docker核心UTS Namespace原理实践

Docker三大支柱核心技术:NamespaceCgroupsUnionFS,这节通过一个UTS Namespace简单实践小案例,更加直观理解Namespace资源隔离技术。

UTS Namespace 主要是用来隔离主机名和域名的隔离,它允许每个 UTS Namespace 拥有一个独立的主机名。例如我们的主机名称为 VM-4-14-centos,使用 UTS Namespace 可以实现在容器内的主机名称为 container-docker 或者其他任意自定义主机名。

UTS Namespace案例实践

在进行UTS Namespace案例实践之前,我们先来了解个关键指令:「unshare,运行一些与父级不共享某些名称空间的程序。」

代码语言:javascript
复制
root@node3:~# unshare --help
Usage:
 unshare [options] <program> [<argument>...]

Run a program with some namespaces unshared from the parent.

Options:
-h,--help
显示帮助文本并退出。
-i,-- ipc 取消共享IPC名称空间。
-m,-- mount 取消共享安装名称空间。
-n,-- net 取消共享网络名称空间。
-p,-- pid 取消共享pid名称空间。另请参见--fork和--mount-proc选项。
-u,-- uts 取消共享UTS名称空间。
-U,--user 取消共享用户名称空间。
-f,-将指定程序fork为取消共享的子进程,而不是直接运行它。这在创建新的pid命名空间时很有用。
--mount-proc [=mountpoint]在运行程序之前,将proc文件系统挂载到mountpoint (默认为/ proc)。这在创建新的pid名称空间时很有用。这也意味着创建一个新的挂载名称空间,因为/ proc挂载否则会破坏系统上的现有程序。新的proc文件系统显式安装为私有文件(由MS_PRIVATE | MS_REC)。
-r,-- map-root-user 仅在当前有效的用户和组ID已映射到新创建的用户名称空间中的超级用户UID和GID之后,才运行该程序。这样即使在没有特权的情况下运行,也可以方便地获得管理新创建的名称空间各个方面所需的功能(例如,在网络名称空间中配置接口或在安装名称空间中安装文件系统)。仅作为一项便利功能,它不支持更复杂的用例,例如映射多个范围的UID和GID。

我们通过一个实例来验证下 UTS Namespace 的作用。

1、首先我们使用 unshare 命令来创建一个 UTS Namespace

代码语言:javascript
复制
# unshare --uts --fork /bin/bash

创建好 UTS Namespace 后,宿主机shelllsns列出namespace信息,会发现最后一条就是我们使用unshare创建了一个uts类型的namespace

2、回到上步uts命名空间shell下,使用 hostname 命令设置一下主机名:

代码语言:javascript
复制
[root@VM-4-14-centos ~]# hostname
VM-4-14-centos
[root@VM-4-14-centos ~]# hostname -b container-docker
[root@VM-4-14-centos ~]# hostname
container-docker

通过上面命令的输出,我们可以看到当前 UTS Namespace 内的主机名已经被修改为 container-docker

3、回到宿主机shell下,查看一下主机的 hostname

代码语言:javascript
复制
[root@VM-4-14-centos ~]# hostname
VM-4-14-centos

可以看到主机的名称仍然为 VM-4-14-centos,并没有被修改,这就是使用UTS Namespace技术实现主机名隔离功能。

Docker原理验证

1、使用docker run创建并运行一个Docker容器:

代码语言:javascript
复制
[root@VM-4-14-centos ~]# docker run -d --name test-nginx --hostname docker-nginx nginx
0fd5ec42923553ec2600c51ef4f119e4025ebf5adf13561b0e847cd816f332b7
[root@VM-4-14-centos ~]# docker exec -it 0fd sh
# hostname
docker-nginx

❝--hostname指定docker容器的hostname,上面指定--hostname docker-nginx,通过docker exec指令进入到docker容器中,使用hostname查看Docker容器的hostname已被正确修改。 ❞

2、查看刚创建的Docker容器对应的宿主机PID信息:

代码语言:javascript
复制
[root@VM-4-14-centos ~]# docker inspect -f {{.State.Pid}} test-nginx
29424

或者通过lsns指令也可以查看到我们刚才创建的Docker容器Namespace信息:

3、在宿主机shell下使用nsenter指令可以进入到Docker容器相同的Namespace下:

代码语言:javascript
复制
[root@VM-4-14-centos ~]# nsenter -t 29424 -u -n

说明:

  1. -t:指定被进入命名空间的目标进程的pid,即指定Docker容器在宿主机上对应pid;
  2. -u:进入uts命令空间;
  3. -n:进入net命令空间。

「nsenter:一个可以在指定进程的命令空间下运行指定程序的命令。」 有很多image内部是没有bash的,所以我们docker exec是无法进入容器的,此时如果还想看一下容器内的情况,其实只需要想办法加入到容器对应的namespace就可以了。我们使用nsenter工具即可实现,该工具启动后会将自己加入到指定的namespace中,然后exec执行我们指定的程序(通常就是bash)。 这个命令大家在容器网络调试下可能常用,比如在一些没有网络调试工具(ip addresspingtelnetsstcpdump)的容器内利用宿主机上的命令进行容器内网络连通性的调试等等。 ❞

4、使用hostnameip addr验证,和Docker容器在相同的UTS NamespaceNetwork Namespace下:

代码语言:javascript
复制
[root@docker-nginx ~]# hostname
docker-nginx
[root@docker-nginx ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:07 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.7/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Reactor2020 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【云原生 • Docker】Docker核心UTS Namespace原理实践
    • UTS Namespace案例实践
      • Docker原理验证
      相关产品与服务
      容器镜像服务
      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档