物理机如下,就像一个庄园,独立占用了一块土地,花园都是自己的,其他人无法共享使用。
虚拟机相当于开发商的一个楼盘, 一栋楼一套房子一户人家, 共享一块宅基地, 共享小区的花园, 共享小区的游乐设施
容器相当于在 1 个房子里面, 开辟出来一个又一个的胶囊公寓, 共享这套房子的卫生间、共享厨房、共享 WiFi, 只有衣服、电脑等私人物品是你自己的
🍂资源利用率高
将利用率较低的服务器资源进行整合, 用更少硬件资源运行更多业务, 降低 IT 支出和运维管理成本
🍂环境标准化
一次构建, 随处执行. 实现执行环境的标准化发布, 部署和运维
开发过程中一个常见的问题是环境一致性问题. 由于开发环境、测试环境、生产环境不一致, 导致有些 bug 并未在开发过程中被发现
而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 这段代码在我机器上没问题啊这类问题
🍂资源弹性伸缩
根据业务情况, 动态调整计算、存储、网络等硬件及软件资源. 比如遇到双 11 了, 把服务扩容 100 个, 双 11 过去了, 把扩容的 100 个收回去
🍂差异化环境提供
同时提供多套差异化的执行环境, 限制环境使用资源
比如我的服务一个依赖 Ubuntu 操作系统,一个服务依赖 CentOS 操作系统,但是没有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境
🍂沙箱安全
为避免不安全或不稳定软件对系统安全性、稳定性造成影响, 可使用虚拟化技术构建虚拟执行环境
比如我在容器里面执行rm -rf /*
不会把整个服务器搞死,也不影响其他人部署的程序使用
🍂容器对比虚拟机更轻量,启动更快
传统的虚拟机技术启动应用服务往往需要数分钟, 而 Docker 容器应用, 由于直接运行于宿主内核, 无需启动完整的操作系统, 因此可以做到秒级、甚至毫秒级的启动时间. 大大的节约了开发、测试、部署的时间
(docker 不需要虚拟内核, 所以启动可以更快, 相当于 windows 的开机时间省去了)
🍂维护和扩展容易
Docker 使用的分层存储以及镜像的技术, 使得应用重复部分的复用更为容易, 也使得应用的维护更新更加简单, 基于基础镜像进一步扩展镜像也变得非常简单
此外, Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像, 既可以直接在生产环境使用, 又可以作为基础进一步定制, 大大的降低了应用服务的镜像制作成本
比如 docker hub 提供了很多镜像, 各个系统一个命令就可以拿到了, 研发也可以自己定制镜像分享给各个产品
存在于硬件层和操作系统层间的虚拟化技术. 虚拟机通过"伪造"一个硬件抽象接口, 将一个操作系统以及操作系统层以上的层嫁接到硬件上, 实现和真实物理机几乎一样的功能
比如我们在一台 Windows 系统的电脑上使用 Android 虚拟机, 就能够用这台电脑打开 Android 系统上的应用
存在于操作系统层和函数库层之间的虚拟化技术. 容器通过"伪造"操作系统的接口, 将函数库层以上的功能置于操作系统上. 以 Docker 为例, 其就是一个基于 Linux 操作系统的 Namespace 和 Cgroup 功能实现的隔离容器, 可以模拟操作系统的功能
简单来说, 如果虚拟机是把整个操作系统封装隔离, 从而实现跨平台应用的话, 那么容器则是把一个个应用单独封装隔离, 从而实现跨平台应用. 所以容器体积比虚拟机小很多, 理论上占用资源更少. 容器化就是应用程序级别的虚拟化技术. 容器提供了将应用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法. 容器共享一个内核(操作系统),它安装在硬件上
存在于函数库层和应用程序之间的虚拟化技术. Java 虚拟机同样具有跨平台特性, 所谓跨平台特性实际上也就是虚拟化的功劳. 我们知道 Java 语言是调用操作系统函数库的, JVM 就是在应用层与函数库层之间建立一个抽象层, 对下通过不同的版本适应不同的操作系统函数库, 对上提供统一的运行环境交给程序和开发者, 使开发者能够调用不同操作系统的函数库
主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现. 这个虚拟化层可以在物理服务器和客户操作系统之间建立虚拟机, 使得它们可以独立运行
从软件框架的角度上, 根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上, 将虚拟化划分为 Type1 和 Type2
Type1 类的 Hypervisor(Hypervisor 是一种系统软件, 它充当计算机硬件和虚拟机之间的中介, 负责有效地分配和利用由各个虚拟机使用的硬件资源, 这些虚拟机在物理主机上单独工作. 因此, Hypervisor 也称为虚拟机管理器)直接运行在硬件之上, 没有宿主机操作系统, Hypervisor 直接控制硬件资源和客户机. 典型框架为 Xen、VmwareESX
Type2 类的 Hypervisor 运行在一个宿主机操作系统之上(Vmware Workstation)或者系统里面, Hypervisor 作为宿主机操作系统中的一个应用程序, 客户机就是在宿主机操作系统上的一个进程
容器虚拟化, 有别于主机虚拟化, 是操作系统层的虚拟化. 通过 namespace 进行各程序的隔离, 加上 cgroups 进行资源的控制, 以此来进行虚拟化