【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),邀你进群
|