Docker三大支柱核心技术:Namespace、Cgroups和UnionFS,这节通过一个UTS Namespace简单实践小案例,更加直观理解Namespace资源隔离技术。
UTS Namespace 主要是用来隔离主机名和域名的隔离,它允许每个 UTS Namespace 拥有一个独立的主机名。例如我们的主机名称为 VM-4-14-centos,使用 UTS Namespace 可以实现在容器内的主机名称为 container-docker 或者其他任意自定义主机名。
在进行UTS Namespace案例实践之前,我们先来了解个关键指令:「unshare,运行一些与父级不共享某些名称空间的程序。」
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
# unshare --uts --fork /bin/bash
创建好 UTS Namespace 后,宿主机shell下lsns列出namespace信息,会发现最后一条就是我们使用unshare创建了一个uts类型的namespace:
2、回到上步uts命名空间shell下,使用 hostname 命令设置一下主机名:
[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:
[root@VM-4-14-centos ~]# hostname
VM-4-14-centos
可以看到主机的名称仍然为 VM-4-14-centos,并没有被修改,这就是使用UTS Namespace技术实现主机名隔离功能。
1、使用docker run创建并运行一个Docker容器: