深入剖析Linux容器
Docker本质是宿主机上的进程,通过namespace实现资源隔离,通过cgroups实现资源限制
docker深度学习-github
Docker技术原理
Docker 是利用 Linux 的 Namespace 、Cgroups 和联合文件系统三大机制来保证实现的, 所以它的原理是使用 Namespace 做主机名、网络、PID 等资源的隔离,使用 Cgroups 对进程或者进程组做资源(例如:CPU、内存等)的限制,联合文件系统用于镜像构建和容器运行环境。
● namespace
○ 实现机器内核资源的隔离
○ 使得容器进程可以在单独的命名空间下运行,并且只可以访问当前容器命名空间的资源
● Cgroups:Linux Control Group
○ 限制和隔离进程资源使用情况(CPU,内存,磁盘I/O,网络)
○ 优先级控制
○ 审计-计费用
○ controle- 挂起和回复进程
○ 限制容器资源的使用
● UnionFS:联合文件系统
○ 分层、轻量级并且高性能的文件系统,
○ 它支持对文件系统的修改作为一次提交来一层层的叠加
○ 同时可以将不同目录挂载到同一个虚拟文件系统下
○ Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
○
○ 最上面的容器层是可写的,下面的镜像层都是只读;实现一个镜像被多个容器共享
Nasmespace资源隔离机制
namespace是Linux提供的资源隔离机制,只有同一个ns下的进程可以相互联系,但是无法感受到外部进程的存在
简单来说,Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID、主机名、用户 ID、文件名、网络和进程间通信等资源的隔离。Docker 利用 Linux 内核的 Namespace 特性,实现了每个容器的资源相互隔离,从而保证容器内部只能访问到自己 Namespace 的资源。
mount namespace
用来隔离不同进程或者进程组看到的挂载点,实现不同的进程看到不同的挂载目录;实现容器的文件系统隔离
PID namespace
再不用的PIDns中,进程可以拥有相同的PID,理由PID NS可以实现每个容器的主进程都是1号进程,二容器内的进程在主机上却拥有不同的PID;例如一个进程在主机上 PID 为 122,使用 PID Namespace 可以实现该进程在容器内看到的 PID 为 1
UTS namespace
隔离主机名,允许每个uts NS拥有一个独立的主机名
IPC namespace
隔离进程通信,PID NS和IPC NS一起使用可以实现,同一IPC NS下的进程可以彼此通信,不同IPC NS 下的进程却不能通讯;
User namespace
隔离用户和用户组
应用:在主机上以非root用户运行的进程可以在一个单独的User NS中映射成Root用户
Net namespace
隔离网络设备、IP地址和端口登信息
Net NS可以让每个进程拥有自己独立的IP地址,端口和网卡信息