进程:
在程序的运行过程中,计算机内存的数据,CPU 寄存器里的数据,内存堆栈中的指令,读取写入的文件,以及运行过程中计算机的状态,这些信息的集合,就是进程。
对于进程来说,它的静止态就是一个二进制可执行文件,它的运行态就是与它相关的计算机数据和状态的总和。而子进程的所有资源都继承父进程,只要控制住父进程的资源,通过父进程衍生的子进程也会被控制。
容器:
简单来说容器技术的实质就是:通过各种手段,修改、约束一个”容器”进程的运行状态,按照用户的意图“误导”它能看到的资源,控制它的边界,从而达到环境隔离,或者说虚拟化的目的
**
容器技术其实是一种基于虚拟化的沙盒技术。
容器的本质是一个进程。
容器技术的核心有两个:Namespace 和 Cgroup
Namespace :
Namespace 可以为容器提供系统资源隔离能力
假如一个容器中的进程需要使用 root 权限,出于安全考虑,我们不可能把宿主机的 root 权限给他。但是通过 Namespace 机制,我们可以隔离宿主机与容器的真实用户资源,谎称一个普通用户就是 root,骗过这个程序。从这个角度看,Namespace 就是内核对进程说谎的机制,目前(Linux最新的稳定版本为5.6),内核可以说的谎话有 8 种:
| Namespace | 系统调用 |
|---|---|
| Mount | CLONE_NEWNS |
| UTS | CLONE_NEWUTS |
| IPC | CLONE_NEWIPC |
| PID | CLONE_NEWPID |
| Network | CLONE_NEWNET |
| User | CLONE_NEWUSER |
| Cgroup | CLONE_NEWCGROUP |
| Time | CLONE_NEWTIME |
容器核心技术–CGroup
CGroup 是用来对进程进行资源管理的
一台宿主机的容器中运行了一个监控服务,但监控服务占用了宿主机全部的 CPU 和内存等资源,导致宿主机上的其他服务和容器都被卡死,无法正常运行。
监控类服务不应占用大量资源,无论是什么原因引起的问题,都不应该影响宿主机的正常使用,否则容器的隔离就没有意义。Namespace 只能做到系统资源维度的隔离,无法做到硬件资源的控制。我们需要使用一种机制 Cgroup,指定容器应用最大占用多少资源。
Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(CPU、Memory、IO 等)。
镜像是静态的定义,容器是镜像运行时的实体。
