323-docker原理浅析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33781658/article/details/88717716






docker原理浅析






docker核心技术
1.namespaces		
2.control groups	
3.union filesystem	






1.namespaces 命名空间
命名空间是linux为我们提供的用于
分离进程树,网络接口,挂载点以及进程间通信等资源的方法
在日常使用linux的时候,我们并没有运行多个完全分离的服务器的需要
但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的
每一个服务都能看到其他服务的进程
也可以访问宿主机上的任意文件
我们更希望运行在同一台机器上的不同服务能做到完全隔离

linux的命名空间机制提供了7种不同的命名空间
1.CLONE_NEWCGROUP
2.CLONE_NEWIPC
3.CLONE_NEWNET
4.CLONE_NEWNS
5.CLONE_NEWPID
6.CLONE_NEWUSER
7.CLONE_NEWUTS

通过这7个选项,我们能在创建进程的时候
设置新进程应该在哪些资源上与宿主机进行隔离








进程

在ubuntu上,ps -ef可以看到进程
有两个很特殊
1.pid为1的/sbin/init
2.pid为2的kthreadd

这两个进程都是被linux中的上帝进程idle创建出来的
前者负责执行内核的一部分初始化工作和系统配置
也会创建一些类似getty的注册进程
后者负责管理和调度其他的内核进程

如果我们在当前的linux操作系统下运行一个新的docker容器
然后我们通过exec进入其内部的bash
然后打印其中的全部进程
我们看见只有
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 15:42 pts/0    00:00:00 /bin/bash
root         9     0  0 15:42 pts/1    00:00:00 /bin/bash
root        17     9  0 15:43 pts/1    00:00:00 ps -ef

这样三个进程

这样当前的docker容器就成功将容器内的进程与宿主机中的进程隔离


这是在创建新进程时传入CLONE_NEWPID实现的
也就是使用linux的命名空间实现进程的隔离
docker容器内部的任意进程都对宿主机进程一无所知








在linux系统中,可以同时存在多用户多进程,
可以对这些进程进行进程调度,进程管理
但是,整体资源是有限的,怎么把有限的资源(进程号,通信资源,网络资源等等)
合理分配给各个用户所在的进程

linux的namespace机制是一种轻量级的虚拟化形式
在此之前,linux中很多资源是全局管理的,比如
系统中所有进程,都是通过pid来标识的,
系统中所有用户,都是通过uid来标识的,
为了资源分配管理,就有了namespace机制

对于每一个命名空间,在用户看来,应该像一台独立的linux计算机一样,
有自己的init进程,
子容器的进程映射到父容器的进程上,
父容器可以知道每一个子容器的运行状态
子容器与子容器之间是隔离的




linux的命名空间机制提供了一种资源隔离的解决方案
PID,PIC,Network等系统资源不再是全局性的,而是属于特定的namespace
linux namespace机制为实现基于容器的虚拟化技术提供了很好的基础
LXC(Linux containers)就是利用了这一特性实现了资源的隔离
不同container内的进程属于不同的namespace,彼此透明,互不干扰

namespace是对全局系统资源的一种封装隔离,使得处于不同namespace的进程
拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前的namespace里的进程
对其他namespace中的进程没有影响






docker的容器就是使用上述技术实现与宿主机的进程隔离
当我们每次运行docker run或者docker start的时候
都会创建一个用于设置进程间隔离的Spec

而且不仅会设置进程相关的命名空间
还会设置与用户,网络,IPC以及UTS相关的命名空间

所有命名空间相关的设置,最后都会作为Create函数的入参
在创建新的容器的时候进行设置







猜你喜欢

转载自blog.csdn.net/qq_33781658/article/details/88717716
323
今日推荐