您现在的位置是:首页 >其他 >Docker-资源隔离和限制实现原理网站首页其他
Docker-资源隔离和限制实现原理
你好,我是舞羡,你也可以叫我Hinsteny.
今天在这里,我主要想探索一下Docker容器实现各种资源如用户、域名、进程、网络的隔离机制以及CPU、内存的限制原理,以便我们在遇到相关容器问题时有更快、更准确的排查思路!
–
目录
概览
为何要搞容器化?
- 一开始为了在同一个电脑(操作系统)上部署多个APP,并且希望APP彼此间互不影响;
- 诞生了虚拟化技术(虚拟机),通过虚拟程序,在主操作系统上启动运行多个独立的虚拟操作系统,进而再运行各自的APP.
- 虚拟化是将整个操作系统加载到独立进程空间运行,有点太浪费资源,而Docker诞生了;
Build Once, Run Anywhere!
Docker 是一个软件平台,让您可以快速构建、测试和部署应用程序。Docker 将软件打包成名为容器的标准化单元,这些单元具有运行软件所需的所有功能,包括库、系统工具、代码和运行时。使用 Docker,您可以将应用程序快速部署和扩展到任何环境中,并且知道您的代码将运行。
容器化要怎么搞?
类别 | 包含项 | 关键技术 |
---|---|---|
隔离 | UTS、IPC、PID、Network、Mount、User | Namespace |
控制 | CPU、Memory | Cgroups |
Namespace介绍
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认为自己具有独立的资源实例。这项技术本来没有掀起多大的波澜,是容器技术的崛起让它重新引起了大家的注意。
Cgroups介绍
Linux Cgroups 是Linux提供的一种用于隔离限制资源的机制,能够实现对资源(CPU、内存、磁盘I/O、网络等)进行使用量限制、优先级排序、资源使用量统计及进程状态控制。
如何实现资源隔离?
各个namespace说明–链接
UTS–域名、主机名
UTS名称空间提供了两个系统标识符的隔离 — 主机名和NIS域名。
PID–进程
PID名称空间隔离进程ID号空间,这意味着不同PID命名空间中的进程可以使用相同的PID。PID名称空间允许容器提供诸如挂起/恢复容器中的进程集将容器迁移到新主机,同时在其中运行进程容器保持相同的PID。
新的PID名称空间中的PID从1开始,有点像独立系统,并调用fork(2)、vfork(2)或clone(2)将生产具有唯一的pid的工艺名称空间。
IPC–进程间通讯(用到的消息队列、共享内存)
每个IPC名称空间都有自己的System V IPC标识符集 以及它自己的POSIX消息队列文件系统。创建的对象IPC名称空间对所有其他进程可见的成员,但对其他IPC名称空间中的进程不可见。
Mount–进程间通讯(用到的消息队列、共享内存)
所看到的挂载列表的挂载名称空间提供了隔离每个名称空间实例中的进程。因此,进程在每个挂载名称空间实例将看到不同的独立目录层次结构。
User–系统用户、用户组
用户名称空间隔离与安全相关的标识符和属性,特别是用户id和组id、根目录、密钥和
能力。进程的用户和组用户命名空间内外的id可以不同。在特别是,进程可以具有普通的非特权用户ID在用户名称空间之外,同时具有用户ID命名空间内的0;换句话说,进程已经满了用户名称空间内的操作权限,但是对命名空间之外的操作没有特权。
Network–容器的网络隔离与通讯
网络名称空间提供了对系统资源的隔离与网络相关:网络设备,IPv4和IPv6协议栈,IP路由表,防火墙规则,/proc/net
目录(它是到/proc/PID/net的符号链接)/sys/class/net目录,/proc/sys/net下的各种文件,port数字(套接字),等等。此外,还有网络名称空间隔离UNIX域抽象套接字命名空间。