雏鹰部落

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 458|回复: 0

[学习/资料] 【SPOTO思博网络】【网工入门基础】运维基础《容器技术Namespace》

[复制链接]
发表于 2021-11-18 15:55:52 | 显示全部楼层 |阅读模式
【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 。

进入全国网络工程师交流群 ,请扫描下方二维码↓↓↓
群里有行业大咖、实战分享、技术交流、技术咨询、企业内推等机会
若群满,请添加老杨
微信(spotoa),邀你进群



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|熊猫同学技术论坛|小黑屋| 网络工程师论坛 ( 沪ICP备09076391 )

GMT+8, 2024-4-28 03:50 , Processed in 0.082471 second(s), 19 queries , Gzip On.

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