docker的空间隔离使用的是namespace(空间),它是内核提供的一种空间隔离,在一个空间下,每个进程看到的视图是一致的,相应的如果不在一个空间下看到资源视图是不一致的,举个例子,如果两个进程在同一个网络命令空间下,那么他们看到的网络信息(网卡、ip、路由等)是一样的,可以通过localhost的方式互相访问。常用的有6种namespace,在linux 内核4.6之后又添加了cgroup这namespace,5.6 之后又添加了时钟namespace。
namespace系统调用参数隔离内容
utsclone_newuts主机名与域名
ipcclone_newipc信号量、消息队列和共享内存
pidclone_newpid进程编号
networkclone_newnet网络设备、网络栈、端口等等
mountclone_newns挂载点(文件系统)
userclone_newuser用户和用户组
cgroupclone_newcgroupcgroup的根目录
timeclone_newtime时钟
这里有个小细节,上面表格创建mount namespace的系统调用参数是clone_newns,而不是clone_newmount。从字面理解是创建一个命名空间的意思,这是由于历史原因导致的,因为mount namespace是第一个namespace,内核的开发者可能也没有预料到后续还有其它的namespace的加入,所以就先把clone_newns给占用了。
可见,namespace的隔离其实并不充分,除了上面的隔离能力,其他的都一样。譬如,时钟在内核5.6版本之前,所有容器和操作系统都共享同一个时钟,如果修改了操作系统的时间,所有容器都时间都会变化。
namespace实现原理也非常简单,每个进程(task_struct)都有一个关于namespace的属性nsproxy,表示自己所属的namespace。
struct task_struct { 。。.
/* namespaces */
struct nsproxy *nsproxy;
。。.
}
其中的nsproxy就是指向各种namespace的一个代理。
当新进程被创建后会继承其父进程的namespace,这就是为啥一个容器里面的所有进程都共享namespace。在linux集群上面,通过读取“/proc/进程id/ns/”下的文件可以获取到每个进程对应的namespace。
文章转载:https://os.51cto.com/art/202107/671347.htm
(版权归原作者所有,侵删)
手机销量9年来最惨,市值反超5700亿美元,三星是如何闷声发财的?
4G工业路由器与4G DTU的区别介绍详解
智能穿戴产品防护等级,ePTFE 膜在智能穿戴的应用
时钟树优化与有用时钟延迟
苹果借助第四代Apple Watch征战医疗市场
简述Docker的底层技术原理之Namespace
荣耀MagicBook2019锐龙版高清图赏
vivo X30系列手机正式发布支持5G双模网络和60倍超级变焦
MTIC工业大脑,海量接入网关
特斯拉马斯克分享智能HVAC系统想法
物联网技术在工业自动化智能工厂中的作用
iOS10.2越狱来了,越么?
奇瑞新能源旗下重磅车型——10万元级纯电SUV全新瑞虎e焕新上市
索尼正式发布了旗下新机Xperia 10 Plus采用了21:9带鱼屏设计
常用算法的分类以及加密算法的选用
使用JRMPClient模块进行测试
触摸屏与施耐德PLC之间MODBUS无线通讯
鱼和熊掌可兼得!全新Air Book评测:超高性价比的2K屏轻薄本
解答与PCB“过孔”有关的疑难问题
MAX16834构成的HB-LED驱动器电路