我正在参加「掘金·启航计划」
最近云原生的发展如火如荼,容器技术在云原生领域起着至关重要的作用,容器技术及容器编排技术是容器云的核心。那么,容器技术究竟是怎么一回事,较之传统的虚拟机技术又有哪些区别,下面我们一起探究一下容器技术的原理。(本文我们所说的容器是以Docker为主的Linux容器)
1 简单介绍
Docker是容器技术的具体技术实现之一,也是可以说是容器技术的代表。Docker采用Go语言开发。很多人在刚刚接触Docker的时候,会错误的认为它是轻量级的虚拟机,其实Docker和传统的虚拟机有本质区别。容器的本质是运行在操作系统上的一个进程,与宿主机共享操作系统,因此文件小,启动速度很快,虚拟机是要在宿主机装载一个完整的操作系统,文件大,启动速度缓慢。
就上文而言,我们可以知道容器是离不开宿主系统的,他只是系统中的一个进程,可以说容器是寄生在宿主系统的。在服务器领域,我们最常用的操作系统就是Linux系统,Linux系统就是通过cgroup和namespace两大特性为容器提供了生存环境,下面我们一起来了解下cgroup和namespace这两大特性。
- cgroup 资源限制
- namespace 进程隔离
2 cgroup(Control Group)
cgroup 是 Control group 的简称,是 Linux 内核提供的一个特性,早期版本出现在2008年前后,后续不断完善。
cgroup 的作用基本上就是控制一个进程或一组进程可以访问或使用给定关键资源(CPU、内存、磁盘 、网络等)的量。一个容器中通常运行了多个进程,并且需要对这些进程实施统一控制,因此cgroup 是容器的关键组件。
cgroup 对不同资源的具体管理是由各个子系统分工完成的,比如管理CPU资源有cpu子系统,管理内存有memory 子系统。
3 namespace
namespace 作为 Linux 内核的组成部分大约出现于 2002 年,随着时间的推移,Linux 内核添加了更多的工具和 namespace 类型。然而,直到 2013 年,Linux 内核才添加了真正的容器支持,并得到了广泛应用。
namespace 的关键特性是进程隔离。将各个服务及其相关进程相互隔离能够减少变更带来的影响以及安全性方面的问题。
Linux 内核包含了不同类型的 namespace。每个 namespace 都有自己的独特属性。
- Network namespace 隔离了与网络相关的系统资源,拥有独立的网络,专用路由表、IP 地址集、套接字列表、连接跟踪表、防火墙及其他网络相关资源。
- Mount namespace 隔离了各空间中挂载的进程实例,拥有独立的挂载点列表,并对该 namespace 中的进程可见。在 mount namespace 中挂载和卸载文件系统,而不会影响主机文件系统。
- Interprocess communication (IPC) namespace 隔离了 IPC 资源,使namespace拥有自己的 IPC 资源。
- UNIX Time‑Sharing (UTS) namespace 允许单个系统对不同的进程显示不同的主机名和域名。
- User namespace 隔离了用户,拥有自己的一组用户 ID 和组 ID,用于分配给进程。这意味着进程可以拥有 root权限。
- Process ID (PID) namespace 分配给独立于其他 namespace 中的一组 PID (进程号)的进程。
- ...
4 总结
namespace 支持对一组进程进行资源隔离,而 cgroup 则支持对这些资源进行精细的控制和限制。他们配合起来就可以既做隔离又做限制,再结合Linux的一些其他特性,就可以实现容器的功能。