容器概念入门
容器,其实是一种特殊的进程而已
容器技术核心
通过 约束 和 修改进程的动态表现, 为其创造出一个 ‘边界’
1 2 3 4
| 总结: 1. 容器只是特殊的进程, 真正对隔离环境负责的是宿主机操作系统本身 2. 隔离技术: 使用 cgroups技术 制造约束(限制资源) , 使用 namespace技术 修改进程视图 3. 隔离不彻底: 使用的都是宿主机的内核,无法namespace化的资源多容器公用
|
cgroups : control group
1 2 3 4 5 6
| 制造约束。 Linux 内核中用来为进程设置资源限制, 包括 CPU、内存、磁盘、网络带宽等等 理解: 一个子系统目录加上一组资源限制文件的组合
|
namespace
1 2 3 4 5 6 7 8 9 10
| 修改进程视图 namespace技术 只是修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容
linux中,创建一个新的进程用 clone(), 其中有多个可选参数。 如pid进程号,每次创建可选择创建新的PID namespace,则不同namespace之间就看不到进程号
启动容器,其实还是启动的进程,只是为这个进程加了很多 namespace参数 对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
linux 提供的namespace: PID, Mount、UTS、IPC、Network 和 User 这些,用来对各种不同的进程上下文进行“障眼法”操作
|
- 虚拟机Hypervisor 和 Docker Engine
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Docker Engine 不对应用进程的隔离环境负责, 真正对隔离环境负责的是宿主机操作系统本身
虚拟机消耗大,本身启动就需要一定的内存, 对宿主机进行系统调用又不可避免需要经过虚拟化软件处理和拦截。 计算,网络,磁盘IO消耗都很大 而容器化的应用,本质还是一个普通进程,由宿主机操作系统统一管理,性能消耗都是忽略不计
容器优点: “敏捷”和“高性能”
缺点: 隔离不彻底 容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核 所以跨内核跑容器是不可能的 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就是:时间。 所以修改了宿主机时间,所有容器的时间都会变
|