当前位置: 首页 > article >正文

容器、虚拟机和 Docker

容器、虚拟机和 Docker

    • 什么是“容器(container)”和“虚拟机(VM)”
    • 虚拟机(VM)
    • 容器(container)
    • Docker 从哪里来?

如果你是一个程序员或技术人员,那你很可能听说过 Docker:在“容器”中打包、分发和运行应用程序的一款非常有用的工具。近来很难不引起大家的注意力——从开发者到系统管理员。即使像谷歌,VMware 和亚马逊这样的大公司都在构建支持它的服务。

不管你是否想要使用 Docker,我都认为了解一些“容器”的基本概念以及它与虚拟机的区别是很重要的。

我们首先了解什么是虚拟机和容器。

什么是“容器(container)”和“虚拟机(VM)”

容器和虚拟机的目的类似:隔离应用程序和它的依赖至一个可以在任何地方运行的独立单元。

此外,容器和虚拟机消除了对物理硬件的需求,从而在能耗和成本效率方面允许更有效地使用计算资源。

容器和虚拟机之间的主要区别在于它们的架构方法。

虚拟机(VM)

虚拟机本质上是对真实计算机的仿真,像真机一样执行程序。虚拟机使用 hypervisor 在物理机上允许。反过来,hypervisor 既可以在主机上运行,也可以在“裸机”上运行。

让我们理解下面的行话:

hypervisor 是运行虚拟机的软件,固件或硬件的中间层。hypervisor 本身在物理计算机上运行,称为“主机”。主机为虚拟机提供资源,包括内存(RAM)和中央处理器(CPU)。这些资源在虚拟机之间划分,可以根据需要分发。如果一个虚拟机运行的应用程序消耗更多的资源,你可能会给它分配更多的资源。

在主机上运行的虚拟机(同样使用 hypervisor)通常也称为“客机”。该客机包含应用程序以及运行它需要的所有东西(比如系统二进制文件和库)。它还带有自己的整个虚拟化硬件栈,包括虚拟化网络适配器,存储和 CPU——这意味着它还拥有自己的完整的客户操作系统。从内部来看,客机表现地就像有自己的专属资源一样。从外部看,我们知道它是一个虚拟机——共享主机提供的资源。

如上所述,客机既可以在一个主机的 hypervisor 也可以在裸机的 hypervisor 上运行。但是它们之间很不相同。

首先,主机虚拟化的 hypervisor 在主机的操作系统上运行。例如,运行 OSX 的计算机可以在这个操作系统上安装虚拟机(VirtualBox 或 VMware Workstation)。虚拟机不得不通过主机操作系统才能访问硬件。

主机虚拟化的 hypervisor 的好处在于底层硬件不那么重要了。主机的操作系统负责硬件驱动程序而不是 hypervisor 本身,因此被认为更兼容硬件。另一方面,硬件和 hypervisor 之间的附加层产生了更多的资源开销,以至于降低虚拟机的性能。

裸机虚拟化 hypervisor 环境通过直接安装和运行在主机的硬件上来解决性能问题。因为它直接与底层硬件交互,所以不需要运行主机操作系统。在这种情况下,作为操作系统第一个被安装在主机上的就是 hypervisor。与主机虚拟化的 hypervisor 不同,裸机版 hypervisor 有自己的硬件驱动程序,可以直接与每个组件交互,I/O,计算或者执行某些类操作系统的任务。结果是获得了更好的性能,扩展性和稳定性。这里的权衡是 hypervisor 预装的设备驱动程序数量有限,所以硬件兼容性也有限。

在讨论了 hypervisor 之后,你可能想知道为什么在虚拟机和主机之间需要额外的 hypervisor 层。

由于虚拟机拥有自己的操作系统,所以 hypervisor 扮演了一个重要的角色:为虚拟机提供了一个平台来管理和执行操作系统,允许虚拟机共享主机资源。

如下图所示,虚拟机包含了虚拟硬件、内核(操作系统)和用户空间。
在这里插入图片描述

容器(container)

与硬件虚拟化的虚拟机不同,容器提供提供抽象的“用户空间”来提供操作系统级的虚拟化。

出于意图和目的,容器看起来像虚拟机。比如,它们具有私有空间来计算,可以 root 权限执行命令,有私有的网络接口和 IP 地址,允许自定义路由和 IP 规则表,可以挂在文件系统等。

下图显示容器仅包含用户空间,而不是像虚拟机那样有内核或虚拟硬件。每个容器都有自己独立的用户空间以允许多个容器在单个主机上运行。我们可以看到容器们之间共享操作系统级架构。唯一需要抠出来创建的部分是 bins 和 libs。这就是容器如此轻量的原因。
在这里插入图片描述

Docker 从哪里来?

Docker 是一个基于 Linux 容器的开源项目。它使用 Linux 命名空间和控制组等内核功能在操作系统上创建容器。

容器远不是什么新事物;谷歌多年来一直在使用自己的容器技术。其他 Linux 容器技术包括Solaris Zones,BSD jails 和 LXC 早已存在多年。

那为什么 Docker 突然获得了成功?

  • 易于使用:Docker 使任何人,不论开发、系统管理员、架构师还是其他,更容易利用容器来快速构建和测试便携式应用程序。它允许任何人在自己的笔记本电脑上打包应用程序,而这些应用程序不做修改又可以在任何公共云,私有云甚至裸机上运行。这就是:“构建一次,到处运行”。
  • 速度:Docker 容器非常轻量,快速。由于容器只是在内核上运行的沙盒环境,因此它们占用更少的资源。你可以在几秒钟内创建并运行 Docker 容器,而虚拟机每次都不得不花更多的时间启动整个虚拟操作系统。
  • Docker Hub:Docker 的用户从日益丰富的 Docker Hub 生态系统中受益,你可以将其看作“Docker 镜像的应用商店”。Docker Hub 拥有数万个社区创建的公共镜像,它们随时都可以使用。搜索想要的镜像令人难以置信的简单,随时都可以拉取下来并且不用修改。
  • 模块化和可扩展:Docker 可以轻松地将应用程序的功能拆分到独立的容器中运行。例如,你的 Postgres 数据库可能在一个容器中运行,而 Redis 服务器在另一个容器中运行,而 Node.js 应用程序在另一个容器中。使用 Docker,将这些容器链接在一起以创建应用程序变得更加容易,将来轻松扩展或更新组件。

况且,谁不喜欢 Docker 鲸呢?;)
在这里插入图片描述


http://www.kler.cn/a/5789.html

相关文章:

  • 跟着逻辑先生学习FPGA-第八课 基于 I2C 协议的 EEPROM 驱动控制
  • 【GlobalMapper精品教程】093:将tif影像色彩映射表(调色板)转为RGB全彩模式
  • Unity2D初级背包设计后篇 拓展举例与不足分析
  • 代码随想录 哈希 test 8
  • MySQL 视图 存储过程与存储函数
  • 【git】在服务器使用docker设置了一个gogs服务器,访问和现实都不理想
  • 基于PHP的英语四六级在线模拟考试平台(论文+源码)_kaic
  • Python3 File flush() 方法、 Python3 File write() 方法
  • Chapter9.1:线性系统状态空间基础(上)
  • Java 8 中需要知道的4个函数式接口-Function、Consumer、Supplier、Predicate
  • 吉时利源表出现数据不准怎么办?
  • 通道流量设计
  • 自动驾驶路径规划与控制:讨论自动驾驶车辆的路径规划算法,如A*、Dijkstra等,以及控制策略,如PID控制等
  • 【数据结构与算法】线性表--数组
  • 利用json-server快速在本地搭建一个JSON服务
  • leetcode125:验证回文串
  • JavaScript函数及面向对象
  • GPT-4报告解读
  • 【HDR图像处理】HDR图像,HDRI技术的一些基础概念 | GPT对话记录
  • Appium - 自动化测试框架 - 工作原理、环境搭建
  • SpringBoot整合SpringSecurity权限控制(动态拦截url+单点登录)
  • 多机器人集群网络通信协议分析
  • 设计模式-结构型模式-适配器模式
  • Python字符串常用方法
  • 初赛-图的概念
  • PyTorch动态图 vs. TensorFlow静态图:深度学习框架之争