1. 容器
1.1 定义
一种沙盒技术,
- 可以将应用运行在其中,与外界隔离
- 这个沙盒可以被方便地“转移”。
本质上,他就是一种特殊的进程。通过在创建容器进程的时候,指定了这个进程所需要启用的一组Namespace参数,进而让该容器进程只能看到当前Namespace所限定的资源、文件、设备、状态或者配置。–进程划分独立空间思想
一个正在运行的Linux容器,可以被一分为二地看待:
- 一组联合挂载在/var/lib/docker/aufs/mnt上的rootfs,这部分被称为“容器镜像”(Container Image),是容器的静态视图
- 一个由Namespace + Cgroups构成的隔离环境,这部分被称为“容器运行时”,是容器的动态视图
1.2 核心原理小结
在为待创建的用户进程
- 启动Linux Namespace配置
- 设置指定的Cgroups参数
- 切换进程的根目录(change root, 配合namespace mount)
切换进程的根目录的时,Docker项目会在最后一步优先使用pivot_root的系统调用,如果系统不支持,才会使用chroot。
2. 虚拟机
虚拟机在物理宿主机上存在一层Hypervisor的硬件虚拟化层,通过Hypervisor虚拟化出了CPU, 内存,I/O设备等,然后在这些虚拟设备上装了一个新的操作系统,即GuestOS,通过不同的操作系统,来实现同一个物理宿主机上的环境隔离。
容器和虚拟机的区别
# | 容器 | 虚拟机 |
---|---|---|
关键技术 | Docker Engine | Hypervisor,GuestOS |
实现原理 | Docker Engine通过在原有物理宿主机上的原操作系统,在起Docker进程的时候,通过指定各种namespace参数实现了不同Docker容器(进程)之间的进程隔离 | Hypervisor通过虚拟化出硬件设备,在硬件设备上安装若干个GuestOS,通过操作系统,实现不同操作系统内的进程互相不感知 |
本质 | 不同的Docker容器本质上是物理宿主机上的操作系统中运行的不同进程 | 不同的虚拟机本质上是Hypervisor虚拟化出来硬件上安装的不同的操作系统 |
优劣 | GuestOS会带来很大的性能消耗:1. 不做优化的场景,根据实验一个运行CentOS的KVM VM启动之后V |