设为首页收藏本站language 语言切换
查看: 1131|回复: 0
收起左侧

[分享] 【SPOTO思博网络】【网工入门基础】运维基础《容器技术Namespace》

[复制链接]
发表于 2021-11-18 15:53:52 | 显示全部楼层 |阅读模式
本帖最后由 goodluck 于 2022-8-18 11:54 编辑

【SPOTO思博网络】【网工入门基础】运维基础《容器技术Namespace》
Namespace是将内核的全局资源做封装,使得每个namespace都有一份独立的资源,因此不同的进程在各自的namespace内对同一种资源的使用互不干扰。


举个例子,执行sethostname这个系统调用会改变主机名,这个主机名就是全局资源,内核通过UTSNamespace可以将不同的进程分隔在不同的UTSNamespace 中,在某个Namespace修改主机名时,另一个Namespace的主机名保持不变。


目前,Linux内核实现了6种Namespace。与命名空间相关的三个系统调用:


clone创建全新的Namespace,由clone创建的新进程就位于这个新的namespace里。


创建时传入flags参数,可选值有CLONE_NEWIPC,CLONE_NEWNET, CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWUTS, CLONE_NEWUSER,分别对应上面六种namespace。


unshare为已有进程创建新的namespace,setns把某个进程放在已有的某个namespace里。


6种命名空间

UTSnamespace


UTSnamespace 对主机名和域名进行隔离。为什么要隔离主机名?因为主机名可以代替IP来访问。如果不隔离,同名访问会出冲突。


IPCnamespace


Linux提供很多种进程通信机制,IPCnamespace 针对System V和POSIX消息队列,这些IPC机制会使用标识符来区别不同的消息队列,然后两个进程通过标识符找到对应的消息队列。


IPCnamespace 使得相同的标识符在两个 namespace代表不同的消息队列,因此两个namespace中的进程不能通过IPC 来通信。


PIDnamespace


隔离进程号,不同namespace的进程可以使用相同的进程号。当创建一个PIDnamespace 时,第一个进程的PID是1,即init进程。它负责回收所有孤儿进程的资源,所有发给init进程的信号都会被屏蔽。


Mountnamespace


隔离文件挂载点,每个进程能看到的文件系统都记录在/proc/$$/mounts里。在一个namespace里挂载、卸载的动作不会影响到其他namespace。


Networknamespace


隔离网络资源。每个namespace都有自己的网络设备、IP、路由表、/proc/net目录、端口号等。网络隔离可以保证独立使用网络资源,比如开发两个web应用可以使用80端口。

新创建的Networknamespace 只有loopback一个网络设备,需要手动添加网络设备。


Usernamespace


隔离用户和用户组。它的厉害之处在于,可以让宿主机上的一个普通用户在namespace里成为0 号用户,也就是root用户。


这样普通用户可以在容器内“随心所欲”,但是影响也仅限在容器内。最后,回到Docker上,经过上述讨论,namespace和cgroup的使用很灵活,需要注意的地方也很多。


Docker 通过Libcontainer来做这些脏活累活。用户只需要使用DockerAPI 就可以优雅地创建一个容器。dockerexec 的底层实现就是上面提过的setns 。

——————————————————————————————————
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-3-12 14:04 , Processed in 0.175583 second(s), 22 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表