目前云计算平台经常使用的虚拟化技术有虚拟机(Virtual Machine)和容器(Container)两种。虚拟机已是比较成熟的技术,容器技术做为下一代虚拟化技术,国内的各厂商应用还不广,但彷佛其表明着将来的发展方向。linux
先来看一下虚拟机和容器的架构图:编程

左图是虚拟机服务器
从下到上理解:网络
- 基础设施(Infrastructure)。它能够是你的我的电脑,数据中心的服务器,或者是云主机。
- 主机操做系统(Host Operating System)
- 虚拟机管理系统(Hypervisor)。利用Hypervisor,能够在主操做系统之上运行多个不一样的从操做系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V、Xen以及KVM。类型2的Hypervisor有VirtualBox和VMWare workstation。
- 客户机操做系统(Guest Operating System)。假设你须要运行3个相互隔离的应用,则须要使用Hypervisor启动3个客户机操做系统,也就是3个虚拟机。这些虚拟机都很是大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗不少CPU和内存。
- 各类依赖。每个客户机操做系统都须要安装许多依赖。若是你的应用须要链接PostgreSQL的话,则须要安装libpq-dev;若是你使用Ruby的话,应该须要安装gems;若是使用其余编程语言,好比Python或者Node.js,都会须要安装对应的依赖库。
- 应用。安装依赖以后,就能够在各个客户机操做系统分别运行应用了,这样各个应用就是相互隔离的。
因为有了多个操做系统,因此虚拟机的架构中咱们知道每一个虚机中都有一个独立的Kernel.架构
什么是Kernel?
简单来说Kernel 就是链接操做系统(OS)和硬件(Hardware)的一个中间组件。编程语言
大概个架构图以下微服务
上面的右图是
测试
- 基础设施(Infrastructure)。
- 主操做系统(Host Operating System)。全部主流的Linux发行版均可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。
- Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操做系统之上的后台进程,负责管理Docker容器。
- 各类依赖。对于Docker,应用的全部依赖都打包在Docker镜像中,Docker容器是基于Docker镜像建立的。
- 应用。应用的源代码与它的依赖都打包在Docker镜像中,不一样的应用须要不一样的Docker镜像。不一样的应用运行在不一样的Docker容器中,它们是相互隔离的。
很明显图中只有一个操做系统,即只有一个独立的Kernel.spa
咱们知道每一个操做系统有多个进程(Process)
简单来说容器能够理解为进程沙盒(sandbox)
那到底这个进程沙盒里装了些什么呢?
- process namespace (进程命名空间): 来规定可使用什么资源
- Cgroups (控制组) : 来规定能够用多少资源:如CPU,内存, 网络等
- Union-capable file system: 把不一样文件联合到一个挂载点的文件系统服务
在linux系统中有6种Namespace能够给linux资源提供进程级别的隔离。Namespace保证了每一个容器只能够看到它本身所拥有的环境,而且不会影响运行在其余容器中的进程。
Namespace也让容奇港拥有本身的网络设备,所以每个容器都有本身的IP地址和主机名,这让容器之间能够相互独立。
相对虚拟机架构来说,容器架构有什么好处呢?
左图的虚拟机架构中,咱们的主机有Host 三个不一样的操做系统,这个就意味着须要模拟(emulate) 三个操做系统。
对比右图的容器架构中,咱们的3个容器都在一个操做系统上运行,并不须要模拟任何操做系统。因此相对左图咱们会消耗更少的资源,并达到跟虚拟机架构中等同的效果。
用一张图大概描述容器相对虚拟机的优点
- 容器架构下降了硬件成本
- 更快速的部署开发/测试/生产环境
- 更简便的维护开发/测试/生产环境
- 与微服务架构更为契合
参考:
https://www.jianshu.com/p/d132333dbf40
https://www.zhihu.com/question/48174633/answer/180743885