社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

VM的Guesto和Docker的Basic Image有什么区别?

David kim • 3 年前 • 1720 次点击  

我一直在重读 the Docker documentation 试图理解Docker和完整VM之间的区别。它是如何提供一个完整的文件系统、隔离的网络环境等而又不至于如此沉重的呢?

为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128934
 
1720 次点击  
文章 [ 22 ]  |  最新文章 3 年前
peterh
Reply   •   1 楼
peterh    4 年前

docker文档(以及自我解释)区分了“虚拟机”和“容器”。他们倾向于以一种有点不寻常的方式解释和使用事物。他们可以做到这一点,因为这取决于他们自己,他们在文档中写了什么,因为虚拟化的术语还不是很准确。

事实上,Docker文档对“容器”的理解是 paravirtualization (有时是“操作系统级虚拟化”)在现实中,与之相反的是 hardware virtualization ,这不是docker。

Docker是一个低质量的半虚拟化解决方案。容器与虚拟机的区别是由docker development发明的,目的是解释其产品的严重缺点。

它之所以如此流行,是因为 gave the fire to the ordinary people

Windows主机上的docker在HyperV中使用了嵌入式Linux,其容器也在其中运行,这一事实让情况变得更加复杂。因此,Windows上的docker使用硬件和半虚拟化相结合的解决方案。

简而言之,Docker容器是低质量(para)虚拟机,有巨大的优势,也有很多缺点。

Sulaiman Al-farisi
Reply   •   2 楼
Sulaiman Al-farisi    4 年前

在我看来,这取决于你的应用程序的需求,为什么决定部署到Docker,因为Docker根据其功能将应用程序分解为小部分,这变得有效,因为当一个应用程序/功能出错时,它对其他应用程序没有影响,而不是使用完整的vm,它的配置会更慢、更复杂,但在某些方面比docker更安全

Gupta
Reply   •   3 楼
Gupta    3 年前
Feature virtualization (Docker) Containers
每个虚拟机都包含一个 Guest OS 每个Docker容器 不要 包含一个 客户操作系统
H/W 每个虚拟机都包含操作系统运行所需硬件的虚拟副本。 没有虚拟化的H/W 用容器
重量 虚拟机很重——原因就在上面-- 容器重量轻,因此速度快
所需序列号 使用名为 hypervisor 使用称为Docker的软件实现集装箱化
果心 虚拟机提供虚拟硬件(或可以安装操作系统和其他程序的硬件) Docker容器不使用任何硬件虚拟化**它有助于使用容器
抽象 虚拟机提供 硬件抽象 所以你可以运行多个操作系统。 容器提供 操作系统抽象 所以你可以运行多个容器。
开机时间 它需要很长时间(通常是几分钟)来创建,并且需要大量的资源开销,因为它们除了运行您想要使用的软件外,还运行整个操作系统。 因为在Docker容器中运行的程序直接与主机的Linux内核接口,所以所需时间更少。
Peter Mortensen user7226407
Reply   •   4 楼
Peter Mortensen user7226407    6 年前

这里有很多很好的技术答案,清楚地讨论了虚拟机和容器之间的区别,以及Docker的起源。

对我来说,VMs和Docker的根本区别在于如何管理应用程序的推广。

通过虚拟机,您可以将应用程序及其依赖关系从一个虚拟机升级到下一个开发人员,从UAT升级到PRD。

  1. 这些虚拟机通常会有不同的补丁和库。
  2. 多个应用程序共享一个VM并不罕见。这需要管理所有应用程序的配置和依赖关系。
  3. 回退需要撤消VM中的更改。或者如果可能的话修复它。

Docker的想法是将应用程序与它所需的库捆绑在自己的容器中,然后升级应用程序 整体 容器作为一个单独的单元。

  1. 除了内核,补丁和库是相同的。
  2. 一般来说,每个容器只有一个应用程序,这简化了配置。
  3. 回退包括停止和删除容器。

因此,在最基本的层面上,使用虚拟机,您可以将应用程序及其依赖项提升为离散组件,而使用Docker,您可以一次性提升所有组件。

是的,容器也存在一些问题,包括管理容器,尽管Kubernetes或Docker Swarm等工具大大简化了任务。

Community rockerest
Reply   •   5 楼
Community rockerest    4 年前

这就是为什么 码头工人 自我介绍:

Docker是推动集装箱运输的公司,也是唯一一家 容器平台提供商可以解决全球范围内的每个应用程序 混合云。今天的企业面临着数字化的压力 但受现有应用程序和 基础设施,同时使日益多样化的投资组合合理化 云、数据中心和应用程序架构。Docker启用 应用程序和基础架构之间真正的独立性 开发人员和IT人员将开发他们的潜力,并创建一个模型 为了更好的合作和创新。

所以 码头工人 是基于容器的,这意味着您可以在当前机器上运行图像和容器。它不包括像这样的操作系统 虚拟机 s、 但就像Java、Tomcat等不同的工作包一样。

如果你了解容器,你就会知道Docker是什么,它与 虚拟机 s

那么,什么是容器?

容器映像是一个轻量级的、独立的、可执行的 一款软件,包括运行它所需的一切:代码, 运行时、系统工具、系统库、设置。两者都有 基于Linux和Windows的应用程序、容器化软件将始终运行 同样,无论环境如何。容器隔离软件 例如,从其周围环境来看,发展和 暂存环境,有助于减少运行团队之间的冲突 同一基础设施上的不同软件。

Docker

如下图所示,每个容器都有一个单独的包,运行在一台机器上,共享该机器的操作系统。。。它们安全且易于运输。。。

Hassan Ahmed Touraj Ebrahimi
Reply   •   6 楼
Hassan Ahmed Touraj Ebrahimi    5 年前

我经常在生产环境和舞台上使用Docker。当你习惯了它,你会发现它对于构建一个多容器和隔离的环境非常强大。

Docker是基于LXC(Linux容器)开发的,在许多Linux发行版,尤其是Ubuntu中都能完美运行。

Docker容器是孤立的环境。你可以在发布 top 从Docker映像创建的Docker容器中的命令。

例如,您可以创建一个Docker映像,配置Docker文件,并告诉它,例如,当它运行时,wget'this',apt get'that',运行'some shell script',设置环境变量等等。

在微服务项目和架构中,Docker是一项非常可行的资产。您可以通过Docker、Docker swarm、Kubernetes和Docker Compose实现可伸缩性、弹性和弹性。

关于Docker的另一个重要问题是Docker Hub及其社区。 例如,我使用Prometheus、Grafana、Prometheus JMX Exporter和Docker实现了一个监控卡夫卡的生态系统。

为此,我下载了zookeeper、kafka、Prometheus、Grafana和jmx collector的配置Docker容器,然后使用YAML文件为其中一些容器或其他容器安装了我自己的配置,我更改了Docker容器中的一些文件和配置,并在一台机器上使用多容器Docker构建了一个监控kafka的完整系统,该系统具有隔离性、可扩展性和弹性,该体系结构可以轻松地移动到多个服务器中。

除了Docker Hub网站,还有另一个名为quay的网站。io,您可以使用它在那里拥有自己的Docker images仪表板,并在其中拉/推。您甚至可以将Docker图像从Docker Hub导入quay,然后在自己的机器上从quay运行它们。

注意:首先学习Docker似乎既复杂又困难,但当你习惯了它,你就不能没有它工作。

我记得第一次使用Docker的时候,我发出了错误的命令,或者错误地删除了我的容器以及所有的数据和配置。

TastyCode
Reply   •   7 楼
TastyCode    6 年前

Difference between how apps in VM use cpu vs containers

资料来源:库伯内特斯在行动。

Peter Mortensen user7226407
Reply   •   8 楼
Peter Mortensen user7226407    6 年前

用一个 虚拟机 ,我们有一台服务器,服务器上有一个主机操作系统,然后我们有一个虚拟机监控程序。然后运行在虚拟机监控程序之上,我们有任意数量的客户操作系统,其中包含一个应用程序及其依赖的二进制文件,以及该服务器上的库。它带来了一个完整的客户操作系统。它相当重。此外,你可以在每台物理机器上实际投入多少也有限制。

Enter image description here

码头集装箱 另一方面,两者略有不同。我们有服务器。我们有主机操作系统。但是 而是一个虚拟机监控程序 ,我们有 Docker引擎 ,在这种情况下。在这种情况下,我们不会带来一个完整的客户操作系统。 我们带来了一层非常薄的操作系统 ,容器可以向下与主机操作系统对话,以获得那里的内核功能。这让我们有了一个非常轻的容器。

它所拥有的只是应用程序代码以及所需的任何二进制文件和库。这些二进制文件和库实际上可以在不同的容器中共享,如果您希望的话。这使我们能够做很多事情。他们有 .你不可能在几秒钟内就站起来一个虚拟机。同样,尽快把它们取下来。。所以我们可以很快地放大和缩小,稍后我们将讨论这一点。

Enter image description here

每个容器都认为它在自己的操作系统副本上运行。它有自己的文件系统,自己的注册表等等,这是一种谎言。它实际上被虚拟化了。

Jayabalan Bala
Reply   •   9 楼
Jayabalan Bala    7 年前

有许多答案更详细地解释了这些差异,但这里是我非常简短的解释。

一个重要的区别是 虚拟机使用单独的内核来运行操作系统 .这就是它很重并且需要时间引导的原因,会消耗更多的系统资源。

在Docker中,容器共享内核 和主人在一起;因此,它重量轻,可以快速启动和停止。

在虚拟化中,资源是在设置开始时分配的,因此,当虚拟机在很多时候处于空闲状态时,资源没有得到充分利用。 在Docker中,容器没有分配固定数量的硬件资源,可以根据需求自由使用资源,因此具有高度可扩展性。

Docker使用 联合文件系统 …Docker使用写时拷贝技术来减少容器消耗的内存空间。 Read more here

Greg Trevellick
Reply   •   10 楼
Greg Trevellick    8 年前

关于:-

“为什么将软件部署到docker映像比简单地部署更容易 部署到一致的生产环境?"

大多数软件部署到许多环境中,通常至少有以下三种:

  1. 个人开发者个人电脑
  2. 共享开发人员环境
  3. 个人测试仪PC
  4. 共享测试环境
  5. 质量保证环境
  6. UAT环境
  7. 负载/性能测试
  8. 现场表演
  9. 生产
  10. 档案文件

还需要考虑以下因素:

  • 根据工作的性质,开发人员,甚至测试人员,都将拥有微妙或巨大不同的PC配置
  • 开发者通常可以在公司或业务标准化规则无法控制的PC上开发(例如,在自己的机器上开发(通常是远程开发)的自由职业者,或开源项目的贡献者,他们没有“受雇”或“签约”以某种方式配置PC)
  • 有些环境将由固定数量的多台机器组成,采用负载平衡配置
  • 许多生产环境将根据流量级别动态(或“弹性地”)创建和销毁基于云的服务器

正如你所看到的,一个组织的服务器外推总数很少是一位数,通常是三位数,而且很容易更高。

这一切都意味着,仅仅因为巨大的容量(即使在绿地场景中),从一开始创建一致的环境就已经足够困难,但是 考虑到大量服务器、添加新服务器(动态或手动)、来自o/s供应商、防病毒供应商、浏览器供应商等的自动更新、由开发人员或服务器技术人员执行的手动软件安装或配置更改,等等。让我重复一遍——保持环境一致几乎是不可能的(没有双关语的意思)(好吧,对于纯粹主义者来说,这是可以做到的,但它涉及大量的时间、精力和纪律,这正是为什么VM和容器(例如Docker)最初被设计出来的原因)。

所以,请像这样思考你的问题 “考虑到保持所有环境一致性的极端困难,即使考虑到学习曲线,将软件部署到docker映像是否更容易?” .我想你会发现答案总是“是”——但只有一种方法可以找到答案,将这个新问题发布在Stack Overflow上。

mohan08p
Reply   •   11 楼
mohan08p    8 年前

有三种不同的设置提供了一个堆栈来运行应用程序(这将帮助我们认识到什么是容器,以及是什么使它比其他解决方案强大):

1) Traditional Servers(bare metal)
2) Virtual machines (VMs)
3) Containers

1) 传统服务器 堆栈由运行操作系统和应用程序的物理服务器组成。

优势:

  • 原材料资源的利用

  • 隔离

缺点:

  • 部署时间非常慢
  • 昂贵的
  • 浪费的资源
  • 难以衡量
  • 难以迁移
  • 复杂配置

2) 那个 虚拟机堆栈 由运行操作系统的物理服务器和管理虚拟机、共享资源和网络接口的虚拟机监控程序组成。每个虚拟机运行一个来宾操作系统、一个应用程序或一组应用程序。

优势:

  • 善用资源
  • 易于扩展
  • 易于备份和迁移
  • 成本效益
  • 灵活性

缺点:

  • 资源分配存在问题
  • 供应商锁定
  • 复杂配置

3) 那个 容器设置 ,与其他堆栈的关键区别在于基于容器的虚拟化使用主机操作系统的内核来管理多个独立的来宾实例。这些来宾实例称为容器。主机可以是物理服务器或虚拟机。

优势:

  • 隔离
  • 轻量的
  • 资源有效
  • 易于迁移
  • 安全
  • 低开销
  • 镜子的生产和发展环境

缺点:

  • 相同的架构
  • 资源密集型应用
  • 网络和安全问题。

通过将容器设置与之前的设置进行比较,我们可以得出结论,容器化是迄今为止我们知道的最快、最有效、最安全的设置。容器是运行应用程序的独立实例。 Docker以某种方式旋转容器,层获得运行时内存,其中包含默认存储驱动程序(覆盖驱动程序),这些驱动程序在几秒钟内运行,并在我们提交到容器后在其上创建的写入层上进行复制,从而为容器的执行提供动力。 如果是虚拟机,则需要大约一分钟才能将所有内容加载到虚拟化环境中。这些轻量级实例可以轻松替换、重建和移动。这使我们能够反映生产和开发环境,对CI/CD流程有很大帮助。容器所能提供的优势是如此引人注目,它们肯定会继续存在。

Community rockerest
Reply   •   12 楼
Community rockerest    4 年前

Docker,基本上是容器,支持 操作系统虚拟化 i、 e.你的应用程序觉得它有一个完整的OS实例,而VM支持 硬件虚拟化 .你觉得它是一台物理机器,你可以在其中启动任何操作系统。

在Docker中,运行的容器共享主机OS内核,而在VM中,它们有自己的OS文件。将应用程序部署到各种服务环境(如“测试”或“生产”)时,开发应用程序的环境(操作系统)是相同的。

例如,如果您开发了一个在端口4000上运行的web服务器,当您将其部署到“测试”环境时,该端口已经被其他程序使用,因此它停止工作。容器中有多层;您对操作系统所做的所有更改都将保存在一个或多个层中,这些层将是图像的一部分,因此无论图像走到哪里,依赖关系都会存在。

在下面的示例中,主机有三个虚拟机。为了在虚拟机中提供完全隔离的应用程序,每个虚拟机都有自己的操作系统文件、库和应用程序代码副本,以及一个完整的操作系统内存实例。 Without Containers 而下图显示了容器的相同情况。在这里,容器只是共享主机操作系统,包括内核和库,因此它们不需要启动操作系统、加载库或为这些文件支付私有内存成本。它们占用的唯一增量空间是应用程序在容器中运行所需的任何内存和磁盘空间。虽然应用程序环境感觉像一个专用的操作系统,但应用程序的部署就像它部署到专用主机上一样。容器化应用程序在几秒钟内启动,与VM相比,机器上可以容纳更多的应用程序实例。 enter image description here

资料来源: https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trends/

cizixs
Reply   •   13 楼
cizixs    7 年前

1.轻便

首先,docker映像通常比VM映像小,因此易于构建、复制和共享。

其次,Docker容器可以在几毫秒内启动,而VM可以在几秒钟内启动。

2.分层文件系统

这是Docker的另一个关键特性。图像有层,不同的图像可以共享层,使其更节省空间,构建速度更快。

如果所有容器都使用Ubuntu作为基础图像,那么不是每个图像都有自己的文件系统,而是共享相同的Ubuntu下划线文件,只是在各自的应用程序数据中有所不同。

3.共享操作系统内核

把容器想象成过程!

主机上运行的所有容器实际上是一组具有不同文件系统的进程。它们共享相同的操作系统内核,只封装了系统库和依赖项。

这在大多数情况下都很好(没有额外的OS内核维护),但如果容器之间需要严格隔离,则可能会出现问题。

为什么重要?

所有这些似乎都是进步,而不是革命。好 量的积累导致质的转变 .

考虑一下应用程序部署。如果我们想要部署一个新的软件(服务)或升级一个,最好是更改配置文件和进程,而不是创建一个新的VM。因为使用更新的服务创建虚拟机、测试它(开发人员和质量保证人员共享),部署到生产环境需要数小时甚至数天。如果出了什么问题,你必须重新开始,浪费更多的时间。因此,使用配置管理工具(puppet、saltstack、chef等)安装新软件,下载新文件是首选。

对于docker,不可能使用新创建的docker容器替换旧容器。维护更容易!构建一个新映像,与QA共享,测试它,部署它只需要几分钟(如果一切都是自动化的),在最坏的情况下需要几个小时。这叫做 不变的基础设施 :不要维护(升级)软件,而是创建一个新的。

它改变了服务的交付方式。我们需要应用程序,但必须维护虚拟机(这是一件痛苦的事情,与我们的应用程序几乎没有关系)。Docker让你专注于应用程序并平滑一切。

resultsway
Reply   •   14 楼
resultsway    8 年前

他们都很不一样。Docker是轻量级的,使用LXC/libcontainer(它依赖于内核名称空间和cGroup),并且没有机器/硬件仿真,比如hypervisor、KVM。它们很重。

Docker和LXC更多用于沙箱、集装箱化和资源隔离。它使用主机操作系统(目前只有Linux内核)的克隆API,为IPC、NS(装载)、网络、PID、UTS等提供名称空间。

内存、I/O、CPU等呢。?这是使用cgroups控制的,在cgroups中,您可以创建具有特定资源(CPU、内存等)规格/限制的组,并将您的进程放在其中。在LXC之上,Docker提供了一个存储后端( http://www.projectatomic.io/docs/filesystems/ )例如,union mount filesystem,您可以在其中添加层,并在不同的装载命名空间之间共享层。

这是一个强大的功能,基本图像通常是只读的,只有当容器修改层中的内容时,它才会将内容写入读写分区(也称为写时复制)。它还提供了许多其他包装,比如注册和图像版本控制。

对于普通的LXC,您需要附带一些rootfs或共享rootfs,当共享时,这些更改会反映在其他容器上。由于这些新增功能,Docker比LXC更受欢迎。LXC在嵌入式环境中很受欢迎,用于围绕暴露于网络和UI等外部实体的进程实现安全性。Docker在云多租户环境中很受欢迎,因为在云多租户环境中,需要一致的生产环境。

普通虚拟机(例如VirtualBox和VMware)使用虚拟机监控程序,相关技术要么具有专用固件,成为第一个操作系统(主机操作系统或来宾操作系统0)的第一层,要么具有在主机操作系统上运行的软件,以向来宾操作系统提供CPU、USB/附件、内存、网络等硬件仿真。VM(截至2015年)在高安全性多租户环境中仍然很流行。

Docker/LXC几乎可以在任何便宜的硬件上运行(只要有更新的内核,内存小于1GB也可以),而普通虚拟机至少需要2GB的内存等,才能用它做任何有意义的事情。但在Windows(截至2014年11月)等操作系统中,主机操作系统上的Docker支持不可用,在Windows、Linux和Mac上可能会运行多种类型的虚拟机。

这是docker/rightscale的一张照片: Here is a pic from rightscale

Peter Mortensen user7226407
Reply   •   15 楼
Peter Mortensen user7226407    6 年前

Docker封装应用程序及其所有依赖项。

虚拟机封装了一个操作系统,可以运行它通常可以在裸机上运行的任何应用程序。

Peter Mortensen user7226407
Reply   •   16 楼
Peter Mortensen user7226407    8 年前

通过这篇文章,我们将画出VMs和LXC之间的一些区别。让我们首先定义它们。

虚拟机 :

虚拟机模拟物理计算环境,但对CPU、内存、硬盘、网络和其他硬件资源的请求由虚拟化层管理,虚拟化层将这些请求转换为底层物理硬件。

在此上下文中,VM被称为来宾,而它运行的环境被称为主机。

LXC s:

Linux容器(LXC)是操作系统级别的功能,可以在一台控制主机(LXC主机)上运行多个独立的Linux容器。Linux容器作为虚拟机的轻量级替代品,因为它们不需要虚拟机监控程序viz。Virtualbox、KVM、Xen等。

现在,除非你被艾伦(宿醉系列中的扎克·加利菲亚纳基斯)下药并在拉斯维加斯待了一年,否则你会非常清楚Linux容器技术的巨大兴趣激增,如果我要说的是具体的话,在过去几个月里在全世界引起轰动的一个容器项目是Docker,它引发了一些呼应的观点,即云计算环境应该放弃虚拟机(VM),并用容器代替它们,因为它们的开销更低,性能可能更好。

但最大的问题是,它可行吗?,这样做明智吗?

a、 LXC的作用域是Linux的一个实例。它可能是不同风格的Linux(例如CentOS主机上的Ubuntu容器,但它仍然是Linux)类似地,基于Windows的容器现在的作用域是Windows的一个实例,如果我们看一下虚拟机,它们的作用域相当大,并且使用虚拟机监控程序,您不局限于操作系统Linux或Windows。

b、 与虚拟机相比,LXC具有较低的开销和更好的性能。工具,即。基于LXC技术的Docker为开发人员提供了一个运行其应用程序的平台,同时也为运营人员提供了一个工具,使他们能够在生产服务器或数据中心部署相同的容器。它试图让运行应用程序、引导和测试应用程序的开发人员与部署该应用程序的操作人员之间的体验无缝连接,因为这就是所有摩擦的所在,而DevOps的目的就是打破这些竖井。

因此,最好的方法是云基础设施提供商应该提倡适当使用VM和LXC,因为它们都适合处理特定的工作负载和场景。

到目前为止,放弃虚拟机并不现实。所以VMs和LXC都有各自的存在和重要性。

L0j1k
Reply   •   17 楼
L0j1k    8 年前

这里的大多数答案都是关于虚拟机的。我将给你们一个简单的回答,这个问题在过去几年使用Docker对我帮助最大。是这样的:

Docker只是一种运行进程的奇特方式,而不是虚拟机。

现在,让我进一步解释一下这意味着什么。虚拟机是它们自己的野兽。我想解释一下 is将帮助您理解这一点,而不仅仅是解释虚拟机是什么。尤其是因为这里有很多很好的答案,告诉你某人说“虚拟机”时的确切意思。所以

Docker容器只是一个使用 cgroups 在主机系统的内核中从其他进程中分离出来。通过运行 ps aux 在主机上。例如,开始 apache2 “容器中”才刚刚开始 apache2 作为主机上的特殊进程。它只是与机器上的其他过程分开。重要的是要注意,容器在容器化流程的生命周期之外不存在。当进程终止时,容器也将终止。那是因为Docker取代了 pid 1 将应用程序放入容器中( 通常是init系统)。最后一点是关于 pid 1 这非常重要。

对于每个容器进程使用的文件系统,Docker使用 UnionFS -备份的图像,这是您在进行备份时下载的图像 docker pull ubuntu .每个“图像”只是一系列层和相关元数据。分层的概念在这里非常重要。每一层只是它下面的一层的变化。例如,当您在构建Docker容器时删除Docker文件中的一个文件时,实际上您只是在最后一层的顶部创建了一个层,上面写着“此文件已被删除”。顺便说一句,这就是为什么可以从文件系统中删除一个大文件,但映像仍然占用相同的磁盘空间。文件仍然在那里,在当前文件下面的层中。层本身只是文件的tarball。你可以用 docker save --output /tmp/ubuntu.tar ubuntu 然后 cd /tmp && tar xvf ubuntu.tar .然后你可以四处看看。所有那些看起来像长散列的目录实际上都是单独的层。每一个都包含文件( layer.tar )和元数据( json )关于那个特定层的信息。这些层只描述对文件系统的更改,这些更改被保存为“在”其原始状态之上的层。当读取“当前”数据时,文件系统读取数据时,就好像它只查看最顶层的更改一样。这就是为什么文件似乎被删除了,尽管它仍然存在于“之前”的层中,因为文件系统只查看最顶层。这允许完全不同的容器共享它们的文件系统层,即使每个容器最顶层的文件系统可能发生了一些重大变化。当容器共享其基本图像层时,这可以节省大量磁盘空间。但是,当您通过卷将目录和文件从主机系统装载到容器中时,这些卷会“绕过”UnionFS,因此更改不会存储在层中。

Docker中的网络是通过使用以太网桥(称为 docker0 主机上),以及主机上每个容器的虚拟接口。它会在中创建一个虚拟子网 docker0 让你的容器相互“交流”。这里有很多联网选项,包括为容器创建自定义子网,以及“共享”主机的联网堆栈以供容器直接访问的功能。

Docker进展得很快。它的 documentation 是我见过的最好的文档之一。它通常写得很好、简洁、准确。我建议您查看可用的文档以了解更多信息,并相信这些文档胜过您在网上阅读的任何其他内容,包括堆栈溢出。如果你有具体问题,我强烈建议你加入 #docker 在Freenode IRC上并在那里询问(你甚至可以使用Freenode的 webchat 为了这个!)。

Hassan Ahmed Touraj Ebrahimi
Reply   •   18 楼
Hassan Ahmed Touraj Ebrahimi    5 年前

Docker不是一种虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker最初使用的是LXC驱动程序,后来改为libcontainer,现在更名为runc。Docker主要关注应用程序容器内应用程序的自动化部署。应用程序容器设计用于打包和运行单个服务,而系统容器设计用于运行多个进程,如虚拟机。因此,Docker被认为是容器化系统上的容器管理或应用程序部署工具。

为了了解它与其他虚拟化有什么不同,我们来看看虚拟化及其类型。那么,就更容易理解其中的区别了。

虚拟化

在其构思形式中,它被认为是一种逻辑划分大型机的方法,以允许多个应用程序同时运行。然而,当公司和开源社区能够提供一种以某种方式处理特权指令的方法,并允许多个操作系统在一个基于x86的系统上同时运行时,情况发生了巨大的变化。

管理程序

虚拟机监控程序负责创建来宾虚拟机运行的虚拟环境。它监督来宾系统,并确保在必要时为来宾分配资源。虚拟机监控程序位于物理机和虚拟机之间,为虚拟机提供虚拟化服务。为了实现它,它拦截虚拟机上的来宾操作系统操作,并模拟主机操作系统上的操作。

虚拟化技术的快速发展(主要是在云端)进一步推动了虚拟化的使用,它允许在Xen、VMware Player、KVM等虚拟机监控程序的帮助下,在一台物理服务器上创建多个虚拟服务器,并将硬件支持纳入商品处理器中,比如英特尔VT和AMD-V。

虚拟化的类型

虚拟化方法可以根据其模拟客户操作系统硬件和模拟客户操作环境的方式进行分类。主要有三种类型的虚拟化:

  • 模仿
  • 半虚拟化
  • 基于容器的虚拟化

模仿

Emulation

这类示例包括VMware Player、VirtualBox、QEMU、Bochs、Parallels等。

半虚拟化

半虚拟化,也称为1型虚拟机监控程序,直接在硬件或裸机上运行,并直接向其上运行的虚拟机提供虚拟化服务。它帮助操作系统、虚拟化硬件和真实硬件协作以实现最佳性能。这些虚拟机监控程序通常占用的空间很小,而且本身不需要大量资源。

这一类的例子包括Xen、KVM等。

Paravirtualization

基于容器的虚拟化

基于容器的虚拟化,也称为操作系统级虚拟化,支持在单个操作系统内核中执行多个独立的执行。它具有尽可能最好的性能和密度,并具有动态资源管理功能。这种类型的虚拟化提供的隔离虚拟执行环境称为容器,可以被视为一组跟踪的进程。

Container-based virtualization

容器的概念是由Linux内核2.6.24版中添加的名称空间特性实现的。容器向每个进程添加其ID,并向每个系统调用添加新的访问控制检查。可以通过 克隆() 允许创建以前全局命名空间的单独实例的系统调用。

名称空间可以以多种不同的方式使用,但最常见的方法是创建一个孤立的容器,该容器无法查看或访问容器外的对象。容器中运行的进程似乎是在普通的Linux系统上运行的,尽管它们与位于其他名称空间中的进程共享底层内核,对于其他类型的对象也是如此。例如,在使用名称空间时,容器内的root用户不会被视为容器外的root用户,从而增加了额外的安全性。

Linux控制组(cgroups)子系统是支持基于容器的虚拟化的下一个主要组件,用于对进程进行分组并管理它们的总资源消耗。它通常用于限制容器的内存和CPU消耗。由于容器化Linux系统只有一个内核,并且内核对容器具有完全可见性,因此只有一个级别的资源分配和调度。

Linux容器有几种管理工具,包括LXC、LXD、systemd nspawn、lmctfy、Warden、Linux VServer、OpenVZ、Docker等。

容器与虚拟机

与虚拟机不同,容器不需要启动操作系统内核,因此可以在不到一秒钟的时间内创建容器。与其他虚拟化方法相比,此功能使基于容器的虚拟化具有独特性和可取性。

由于基于容器的虚拟化几乎不会给主机增加开销,因此基于容器的虚拟化具有接近本机的性能

与其他虚拟化不同,基于容器的虚拟化不需要额外的软件。

主机上的所有容器共享主机的调度程序,从而节省额外资源的需要。

与虚拟机映像相比,容器状态(Docker或LXC映像)的大小较小,因此容器映像易于分发。

容器中的资源管理是通过cGroup实现的。cGroup不允许容器消耗超过分配给它们的资源。然而,到目前为止,主机的所有资源都在虚拟机中可见,但无法使用。这可以通过运行 top htop 同时在容器和主机上。所有环境中的输出看起来都是相似的。

更新:

Docker如何在非Linux系统中运行容器?

如果容器因为Linux内核中的可用特性而成为可能,那么显而易见的问题是非Linux系统如何运行容器。Docker for Mac和Windows都使用Linux虚拟机来运行容器。Docker工具箱用于在虚拟机中运行容器。但是,最新的Docker在Windows和Hypervisor中使用Hyper-V。Mac中的框架。

现在,让我详细描述Docker for Mac如何运行容器。

https://github.com/moby/hyperkit 为了模拟hypervisor功能,Hyperkit使用hypervisor。其核心是框架。管理程序。框架是Mac的本机管理程序解决方案。Hyperkit还使用VPNKit和DataKit分别为网络和文件系统命名。

Docker在Mac中运行的Linux虚拟机是只读的。但是,您可以通过运行以下命令来实现:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty .

现在,我们甚至可以检查这个虚拟机的内核版本:

# uname -a Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux .

所有容器都在这个虚拟机中运行。

虚拟机监控程序有一些限制。框架因为Docker不会暴露 docker0 Mac中的网络接口。因此,您无法从主机访问容器。到目前为止, docker0 仅在虚拟机内部可用。

Hyper-v是Windows中的本机虚拟机监控程序。他们还试图利用Windows 10的功能在本地运行Linux系统。

enzo aholbreich
Reply   •   19 楼
enzo aholbreich    3 年前

我喜欢 Ken Cochrane's answer .

但我想补充一点,这里没有详细介绍。在我看来,Docker在整个过程中也有所不同。与VMs相比,Docker不仅(仅)关注硬件的最佳资源共享,而且还提供了一个打包应用程序的“系统”(作为一组微服务更好,但不是必须的)。

对我来说,这正好符合rpm等面向开发人员的工具之间的差距, Debian 包装, Maven ,一边是npm+Git,一边是ops工具,比如 Puppet ,VMware,Xen,随便你怎么说。。。

为什么将软件部署到docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?

你的问题假设生产环境是一致的。 但如何保持一致性呢? 考虑一些数量((10))的服务器和应用程序,流水线中的阶段。

为了保持同步,你可以开始使用木偶之类的东西, Chef 或者您自己的配置脚本、未发布的规则和/或大量文档。。。理论上,服务器可以无限期地运行,并保持完全一致和最新。Practice无法完全管理服务器的配置,因此存在很大的配置漂移和对正在运行的服务器进行意外更改的空间。

因此,有一种已知的模式可以避免这种情况,即所谓的 immutable server .但不可变的服务器模式并不受欢迎。主要是因为Docker之前使用的虚拟机的局限性。处理几GB的大图像,移动这些大图像,只是为了改变应用程序中的一些字段,这是非常费力的。可以理解。。。

有了Docker生态系统,你将永远不需要在“小变化”(感谢aufs和Registry)上移动大约千兆字节,也不需要担心在运行时将应用程序打包到Docker容器中会损失性能。你不必担心图像的版本。

最后,您甚至可以在Linux笔记本电脑上重现复杂的生产环境(如果在您的情况下不起作用,请不要打电话给我;)

当然,您可以在VMs中启动Docker容器(这是个好主意)。减少虚拟机级别的服务器资源调配。所有这些都可以由Docker管理。

与此同时,Docker使用自己的实现“libcontainer”而不是LXC。但LXC仍然可用。

Uwe Keim Sharath
Reply   •   20 楼
Uwe Keim Sharath    6 年前

回答得好。为了获得容器与虚拟机的图像表示,请看下面的一个。

enter image description here

Source