docker的底层原理

docker的底层原理
在Linux系统中,可以同时存在多用户多进程,那么对他们的运行协调管理,通过进程调度和进度管理可以解决,但是,整体资源是有限的,怎么把有限的资源(进程号、网络资源等等)合理分配给各个用户所在的进程?

                            namespace1(进程1-1)

底层硬件---->Linux kernel ----->
namespace1(进程1-2)

Linuxnamespace机制提供了一种资源隔离方案。pid ipc network等系统资源不再是全局性的,而是属于某个特定的namespace。每个namespace下的资源对于其他namespace下的资源都是透明的,不可见的。因此在操作系统层面上看,就会出现多个相同的PID的进程,由于属于不同的namespace,所以他们之间并不从冲突。而是在用户层面上只能看到属于用户自己namespace下的资源,例如使用ps命令只能列出自己的namespace下的进程。这样每个namespace看上去就象一个单独的Linux系统。

父命名空间 子命名空间
命名空间建立系统的不同视图,对于每一个命名空间,从用户来看,应该想单独的Linux计算机一样,有自己的init进程(PID为0) ,其他进程的PID一次递增,A和B空间都有PID为0的init进程,子容器的进程映射到父容器的进程上,父容器可以知道每一个子容器的运行状态,而子容器和子容器之间是隔离的

Mount namespace
Mount namespace用来隔离文件系统的挂载点, 使得不同的mount namespace拥有自己独立的挂载点信息,不同的namespace之间不会相互影响,这对于构建用户或者容器自己的文件系统目录非常有用。

UTS namespaces
提供了主机名和域名的隔离。能够使得子进程有独立的主机名和域名,这一个特性在docker容器技术中被用到,使得docker容器在网络上被视为一个独立的节点,而不仅仅是宿主机上的一个进程

IPC namespace

特定的进程通信资源
IPC全称 Inter-Process Communication,是Unix/Linux下进程间通信的一种方式,IPC有共享内存、信号量、消息队列等方法。所以,为了隔离,我们也需要把IPC给隔离开来,这样,只有在同一个Namespace下的进程才能相互通信。如果你熟悉IPC的原理的话,你会知道,IPC需要有一个全局的ID,即然是全局的,那么就意味着我们的Namespace需要对这个ID隔离,不能让别的Namespace的进程看到。

PID namespaces
用来隔离进程的ID空间,使得不同pid namespace里的进程ID重复且相互之间不影响
PIDnamespace 可以嵌套,也就是说有父子关系,在当前namespace里面创建的所欲偶新的namespace都是当前namespace的子namespace。父namespace里面可以看到所有子孙后代namespace里的进程信息,而子namespace里看不到同级的进程信息

network namespace
网络相关的系统资源,每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。这也使得一个 host 上多个容器内的同一个应用都绑定到各自容器的 80 端口上。

user namespace 用户组合ID空间

user namespace用来隔离user权限相关的Linux资源,包括user用户和group用户组权限
这是目前实现的namespace中,最复杂的一个,因为user和权限息息相关,而权限又事关容器的安全,所以稍有不慎,就会出安全问题。
同样一个用户的user id 和group的ID 可以不一样,换句话说,一个用户可以在父user namespace中是普通用户,在子user namespace中是超级用户。

有了namespace为什么还用cgroup?
docker容器中使用Linux namespace来隔离其运行环境,使得容器中的进程看起来像一个独立环境中运行一样。但是光有运行环境还不够,因为这些进程还是可以不受限制地使用系统资源,比如 网络 磁盘 CPU以及内存等。关于其目的,一方面是 为了防止他占用太多的资源而影响带其他的进程;另一个方面,在资源消耗殆尽的时候,Linux内核会触发OOM机制,这会让一些被杀掉的进程成了无辜的替死鬼。因此,为了让容器中的进程更加可控,docker使用Linux cgroups来限制容器中的进程允许使用的系统资源。

原理:
Linux cgroup 可以为系统所运行的任务(进程)的用户定义群组分配资源 比如CPU时间 系统内存 网络带宽或者这些资源的组合。可以监控管理员配置的cgroup,拒绝cgroup访问某些资源,甚至在运行的系统中动态配置cgroup。所以,可以将controll groups 理解为controller group 也就是说它以一组进程为目标进行资源分配和控制。它主要提供了如下功能:

1、Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
2、Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐。
3、Accounting: 一些审计或一些统计,主要目的是为了计费。
4、Controll: 挂起进程,恢复执行进程。

使用cgroup,系统管理员可以更具体的控制对系统资源的分配、优先顺序、拒绝、管理和监控。可以更好的根据任务和用户分配硬件资源,提高总体效率

在实际中一般cgroup的作用:
1、隔离一个进程集合,并限制他们所消费的资源,比如绑定CPU的核心
2、为这组进程分配其足够使用的内存
3、为这组进程分配相应的网络带宽和磁盘存储限制
4、限制访问某些设备(设置设备的白名单)

docker的架构
基础设施(infrastructure) 主操作系统(host operating system) docker守护进程(docker daemon) 各种依赖 应用(APP)

1、基础设施:底层硬件支撑
主操作系统:管理硬件设备 进行资源的划分
2、docker守护进程:docker守护进程取代了hypervisor,它是运行在操作系统之上的后台进程,负责管理docker容器
3、各种依赖:对于docker,应用的所有依赖都打包在docker镜像中,dicker容器是基于docker镜像创建的。
4、应用:应用的源码与他的依赖都是打包在docker镜像中,不同的应用需要不同的docker镜像。不同的应用运行在不同的docker容器中,他们是相互隔离的

docker守护进程可以直接与主操作系统进行通讯,为各个docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器相互隔离。虚拟机启动需要数分钟,而docker容器可以在数毫秒内启动。由于没有臃肿的操作系统高,docker可以节省大量的磁盘空间以及其他系统资源;虚拟机更擅长于资源的完全隔离。

你可能感兴趣的:(笔记)