Namespaceb

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,运行一些与父级不共享某些名称空间的程序。」
我们通过一个实例来验证下 UTS Namespace 的作用。
1、首先我们使用 unshare 命令来创建一个 UTS Namespace
创建好 UTS Namespace 后,宿主机shelllsns列出namespace信息,会发现最后一条就是我们使用unshare创建了一个uts类型的namespace
notion image
2、回到上步uts命名空间shell下,使用 hostname 命令设置一下主机名:
通过上面命令的输出,我们可以看到当前 UTS Namespace 内的主机名已经被修改为 container-docker
3、回到宿主机shell下,查看一下主机的 hostname
可以看到主机的名称仍然为 VM-4-14-centos,并没有被修改,这就是使用UTS Namespace技术实现主机名隔离功能。

Docker原理验证

1、使用docker run创建并运行一个Docker容器:
  • -hostname指定docker容器的hostname,上面指定--hostname docker-nginx,通过docker exec指令进入到docker容器中,使用hostname查看Docker容器的hostname已被正确修改。
2、查看刚创建的Docker容器对应的宿主机PID信息:
或者通过lsns指令也可以查看到我们刚才创建的Docker容器Namespace信息:
notion image
3、在宿主机shell下使用nsenter指令可以进入到Docker容器相同的Namespace下:
说明:
  1. t:指定被进入命名空间的目标进程的pid,即指定Docker容器在宿主机上对应pid;
  1. u:进入uts命令空间;
  1. n:进入net命令空间。
「nsenter:一个可以在指定进程的命令空间下运行指定程序的命令。」
有很多image内部是没有bash的,所以我们docker exec是无法进入容器的,此时如果还想看一下容器内的情况,其实只需要想办法加入到容器对应的namespace就可以了。我们使用nsenter工具即可实现,该工具启动后会将自己加入到指定的namespace中,然后exec执行我们指定的程序(通常就是bash)。
这个命令大家在容器网络调试下可能常用,比如在一些没有网络调试工具(ip addresspingtelnetsstcpdump)的容器内利用宿主机上的命令进行容器内网络连通性的调试等等。
4、使用hostnameip addr验证,和Docker容器在相同的UTS NamespaceNetwork Namespace下:
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP