Docker背后的内核知识Linux namespace

来源:互联网 发布:淘宝飞猪旅行好不好 编辑:程序博客网 时间:2024/05/21 07:12

Docker引擎的基础是Linux容器技术(Linux Containers,LXC)容器有效地将由单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。具体体现在6个方面:

namespaces Mount CLONE_NEWNS 挂载点(文件系统) UTS CLONE_NEWUTS 主机名与域名 IPC CLONE_NEWIPC 信号量、消息队列和共享内存 PID CLONE_NEWPID 进程号 Net CLONE_NEWNET 网络设备、网络栈、端口等等 User CLONE_NEWUSER 用户和用户组

模拟Docker引擎如何使用linux namespace实现容器隔离

/* 定义一个给 clone 用的栈,栈大小1M */\#define STACK_SIZE (1024 * 1024)static char container_stack[STACK_SIZE];char* const container_args[] = {    "/bin/bash",    NULL};int container_main(void* arg){    /* 直接执行一个shell,以便我们观察这个进程空间里的资源是否被隔离了 */    execv(container_args[0], container_args);     return 1;}int main(){    /* 调用clone函数,其中传出一个函数,还有一个栈空间的(为什么传尾指针,因为栈是反着的) */    int container_pid = clone(container_main, container_stack+STACK_SIZE, CLONE_* | SIGCHLD, NULL);    /* 等待子进程结束 */    waitpid(container_pid, NULL, 0);    return 0;}

我们可以理解为,linux启动的时候会内核默认创建一个父命名空间,每一个docker都是父命名空间创建的子命名空间,子命名空间中的所有资源(以下6个资源)在子命名空间中都有自己的标识,同时会在父命名空间映射一个标识。该父命名空间是所有docker子命名空间的祖先,所以所有docker子命名空间对linux父命名空间来说都是可见的,但是docker子命名空间对于这些资源来收是它们独立的空间,不同命名空间的资源是不能共享的,保证了隔离。
1.每个docker都有自己的文件目录。
2.每个docker都有自己的主机名与域名。
3.每个docker都有自己的信号量、消息队列和共享内存。虽然进程间通信被隔离,但是大多数情况下docker之间的通信都是用socket来实现,例如本机上的不同docker之间使用unix socket,不同主机上的docker就可以理解为tcp/udp通信了。
4.每个docker都有自己的进程号。例如linux系统进程号为1的进程是init进程,在子命名空间中创建的第一个进程pid也是1,它映射到父命名空间中还有自己的一个pid,相互隔离。
5.每个docker都有自己的网络设备、网络栈、端口等等。
6.每个docker都有自己的用户和用户组。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁宝宝嗓子有痰怎么办 喉咙总感觉有痰怎么办 感冒了喉咙有痰怎么办 咽喉有异物感是怎么办 老感觉喉咙有痰怎么办 感冒有痰怎么办最有效 感冒快好了有痰怎么办 喉咙里一直有痰怎么办 一到晚上就咳嗽怎么办 1岁宝宝咳嗽痰多怎么办 3岁宝宝咳嗽痰多怎么办 六岁儿童咳嗽有痰怎么办 很多白痰在喉咙怎么办 我喉咙总是有痰怎么办 喉咙老感觉有痰怎么办 喉咙痒老是有痰怎么办 抽烟多了嗓子疼怎么办 抽烟多了老咳嗽怎么办 抽烟抽多了咳嗽怎么办 嗓子咳出异物臭怎么办 鼻子有鼻涕喉咙有痰怎么办 怀孕39周感冒了怎么办 一口痰卡在喉咙怎么办 鼻塞黄鼻涕黄痰怎么办 小孩咳嗽流黄鼻涕怎么办 小孩鼻塞怎么办最简单方法 有黄鼻涕黄痰怎么办 咳嗽有泡沫白痰怎么办 痰多咳嗽老不好怎么办 5岁儿童咳嗽有痰怎么办 感冒后一直有痰怎么办 感冒吐绿色的痰怎么办 孕妇咳嗽有痰怎么办啊 没结婚的人死了怎么办 金花鼠尾巴断了怎么办 辞职交了不批怎么办 离职了又想回去怎么办 想辞职领导不批怎么办 急辞职领导不批怎么办 她生气不理我了怎么办 分手了之前的钱怎么办