这里 说 的 容器 是 操作系统 层 的 容器, 比如 ixc 、Docker 这种 。
容器, 有 自己 的 硬件资源, 可以 给 每个 容器 分配 指定 的 硬件资源 , 容器 和 容器 之间 是 隔离 的 , 隔离 是指 一个 容器 里 的 应用程序 不能 访问 到 另一个 容器 的 资源 , 容器 和 容器 之间 就像 一个个 独立 的 计算机 和 操作系统 。
对 使用者 来说, 容器 提供 的 接口 和 操作系统 一样, 所以 容器 也是 一个 虚拟操作系统 。
这就是 容器, 可以用 容器 实现 虚拟化, 或者说, 可以 把 容器 当 虚拟机 用 。
了解了 容器 的 功能, 那么, 要 怎么 实现 容器 呢 ?
我 提出 2 个 方案 :
方案一 , 进程组
方案二 , 进程
方案一 是 把 容器 当成 一个 进程组, 方案二 是 把 容器 当成 一个 进程 。
先来 看看 方案一, 上面说到 容器 有 自己 的 硬件资源, 这些 “硬件资源” 不是 直接 的 硬件资源, 而是 经过 操作系统 抽象 的, 比如 虚拟内存, 文件系统 。
虚拟内存 由 内存 和 外存 组成, 文件系统 对应 的 硬件 是 硬盘 、光盘 、U 盘, 文件系统 是 对 硬盘 、光盘 、U 盘 等 外部存储器 的 抽象 。
具体 的 , 容器 的 资源 有 :
1 CPU, 按 占用率 算
2 虚拟内存, 按 存储空间 和 地址空间 算, 存储空间 表示 大小, 地址空间 表示 范围, 地址空间 用于 容器 间 的 隔离
3 文件系统, 每个 容器 有 一个 虚拟 的 文件系统, 比如 每个 容器 有 自己 的 C 盘 、D 盘 、E 盘 ……
4 虚拟 IP, 每个 容器 都有 一个 自己 的 IP, 甚至 可以 有 多个 IP, 这些 IP 都是 虚拟 IP, 是 从 操作系统 的 IP 协议 里 虚拟出来的, 而 操作系统 的 IP 协议 的 底层 是 物理网卡 。 如果 认为 一个 IP 对应 一个 网卡, 那么 也可以 认为 容器 有 一个 或 多个 虚拟网卡 。
设计 容器, 就是 要 设计 怎样 分配 和 隔离 CPU 、虚拟内存 、文件系统 、虚拟 IP 这 4 项 资源 。
在 方案一 里 , 容器 是 一个 进程组, 这些 进程 都是 操作系统 里 的 普通 的 进程, 只要 让 这些 进程 的 CPU 占用率 总和 不超过 分配 的 大小 就可以 。
这 在 操作系统 的 进程调度 里 可以实现 。 就是 在 进程调度 的 时候, 考虑 给 哪个进程 分配时间片 的 时候, 计算 和 判断 一下 容器 里 的 进程 的 CPU 占用率 总和 就可以了 。
这 对 操作系统 的 进程调度 部分 的 代码 稍作修改 就可以 。 也就是 对 操作系统 的 内核代码 稍作修改 就可以 。