Docker技术概论(1):Docker与虚拟化技术比较
- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at: https://jclee95.blog.csdn.net
My WebSite:http://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/136358470
HuaWei:https://bbs.huaweicloud.com/blogs/422803
【介绍】:本文将深入探讨Docker与传统虚拟机技术的区别,着重分析两者在抽象层级、隔离性、资源消耗、启动速度以及在实际应用中的优势和局限。通过对比分析,我们旨在为读者提供一个清晰的视角,以理解Docker技术如何在现代软件开发和运维中发挥其独特的价值。

目 录
1. 概述 1.1 引言
在当今的软件开发和部署领域,虚拟化技术扮演着至关重要的角色。它不仅提高了硬件的利用率,还极大地简化了应用的部署和管理过程。虚拟化技术可以大致分为两类:硬件级别的虚拟化和系统层面的虚拟化。硬件级别的虚拟化主要通过虚拟机(VM)实现,而系统层面的虚拟化则主要通过容器技术实现,Docker是后者中最为人熟知的技术之一。
虚拟机技术通过模拟整个硬件系统,允许在单一的物理机上运行多个操作系统实例。这种方法为每个虚拟机提供了完全独立的运行环境,但也因此导致了较高的资源消耗和管理复杂度。相比之下,Docker等容器技术在操作系统级别提供虚拟化,允许应用程序和其依赖被打包在轻量级的容器中。这些容器共享宿主机的操作系统内核,但在用户空间中作为独立进程运行,从而实现了快速启动、低资源消耗和易于管理的特点。
1.2 关于本文本文将深入探讨Docker与传统虚拟机技术的区别,着重分析两者在抽象层级、隔离性、资源消耗、启动速度以及在实际应用中的优势和局限。通过对比分析,我们旨在为读者提供一个清晰的视角,以理解Docker技术如何在现代软件开发和运维中发挥其独特的价值。
2. 虚拟机 => 硬件级别的虚拟化技术虚拟机技术主要针对那些需要完全独立运行环境的应用场景。例如,在软件开发和测试中,开发者可以在不同的虚拟机中安装不同的操作系统和软件环境,以测试软件在不同环境下的兼容性和性能。在企业IT环境中,虚拟机技术可以用于服务器的虚拟化,提高硬件资源的利用率,简化数据中心的管理。
2.1 虚拟机技术概述 2.1.1 虚拟机技术简介虚拟机(Visual Machine)是物理硬件的抽象,可将一台服务器变成多台服务器。虚拟机管理程序允许多个虚拟机在一台机器上运行。每个虚拟机都包含操作系统、应用程序、必要的二进制文件和库的完整副本 - 占用数十 GB。虚拟机的启动速度也可能很慢。
虚拟机技术是一种基于硬件层面的虚拟化技术,它通过软件模拟出一台或多台完整的计算机系统,允许用户在单一的物理硬件上同时运行多个操作系统实例。这种技术的核心在于它提供了一个抽象层,这个抽象层位于物理硬件和操作系统之间,使得虚拟机内的操作系统以为自己在访问真实的物理硬件。。这种技术手段主要针对那些需要完全独立运行环境的应用场景。
2.1.2 虚拟机的抽象层级虚拟机的实现依赖于虚拟机监视器(Virtual Machine Monitor, VMM)或称为 Hypervisor。
Hypervisor直接运行在物理硬件上(Type 1,裸机Hypervisor)或在宿主操作系统之上(Type 2,宿主Hypervisor),负责创建虚拟机环境、模拟硬件资源,并确保虚拟机内运行的操作系统与应用程序无法直接访问物理硬件。

每个虚拟机都是一个完整的计算机系统的模拟,包括虚拟的CPU、内存、硬盘、网络接口等硬件资源。在这个虚拟环境中,可以安装操作系统和必要的应用程序,每个虚拟机都拥有自己独立的操作系统、应用程序、必要的二进制文件和库的完整副本。这种配置使得虚拟机可以像物理机一样执行各种计算任务,但其数据和状态完全独立于宿主机和其他虚拟机。
2.1.4 资源消耗与启动速度由于每个虚拟机都需要模拟完整的硬件环境和运行一个完整的操作系统,因此它们通常会占用较多的计算资源,包括CPU时间、内存和存储空间。虚拟机镜像的大小通常在数十GB,这对物理资源的需求较高。此外,虚拟机的启动速度相对较慢,因为启动过程包括加载和初始化虚拟硬件环境以及启动操作系统,这可能需要几分钟的时间。
2.1.5 应用场景虚拟机技术主要针对那些需要完全独立运行环境的应用场景。例如,在软件开发和测试中,开发者可以在不同的虚拟机中安装不同的操作系统和软件环境,以测试软件在不同环境下的兼容性和性能。在企业IT环境中,虚拟机技术可以用于服务器的虚拟化,提高硬件资源的利用率,简化数据中心的管理。
2.2 隔离性隔离性不仅对于保证虚拟机的安全性和稳定性至关重要,也是实现资源有效管理和优化的基础。它允许在同一台物理服务器上安全地运行多个不同的操作系统和应用程序,极大地提高了硬件资源的利用率。此外,隔离性还为软件开发和测试提供了灵活性,开发者可以在隔离的环境中进行实验,而不必担心影响到生产环境。
2.2.1 Hypervisor的作用如前面所介绍,Hypervisor,主要功能是管理和分配物理计算资源(如CPU、内存和存储)给虚拟机,并提供虚拟机之间的隔离。它允许虚拟机在一个宿主系统上共享物理硬件,同时保持彼此分隔,以避免干扰和冲突。
一个典型的虚拟机包括自己的操作系统、一系列的应用程序,以及所需的虚拟硬件资源,如CPU、内存和硬盘等。虚拟机间的隔离性是VMware的一个重要特点,每个虚拟机都运行在自己独立的操作系统上,彼此之间互不影响。
2.2.2 隔离性的实现硬件级别的隔离:Hypervisor通过模拟硬件来为每个虚拟机创建一个完全独立的环境。虚拟机内的操作系统和应用程序认为它们正在访问真实的物理硬件,但实际上它们访问的是Hypervisor提供的虚拟硬件。
网络隔离:虚拟机之间的网络也是隔离的。Hypervisor可以为每个虚拟机配置独立的虚拟网络接口,甚至可以创建虚拟局域网(VLAN)来进一步增强隔离性和安全性。
存储隔离:虚拟机的存储也是独立的。虽然多个虚拟机可能共享同一物理存储设备,但Hypervisor会确保它们的存储空间不会相互干扰。每个虚拟机都有自己的虚拟硬盘,这就像是在物理硬盘上划分了独立的分区。
虽然虚拟机技术为软件开发、测试和部署提供了极大的灵活性和隔离性,但它也存在一些明显的不足之处,主要包括 资源消耗大、启动和运行速度慢,以及管理复杂度高等方面。
2.3.1 资源消耗大每个虚拟机都需要模拟一个完整的硬件环境,并在其上运行一个完整的操作系统实例,以及所需的应用程序和服务。这意味着,即使是最简单的虚拟机也需要为其分配足够的CPU资源、内存和存储空间。在物理主机上运行多个虚拟机时,这些资源的需求会迅速累加,导致硬件资源的利用率迅速饱和。
相比之下,容器技术如 Docker 仅需在宿主操作系统上额外运行应用程序和其依赖,而不需要为每个容器分配和模拟完整的操作系统资源,从而大幅降低了资源消耗。
2.3.2 启动和运行速度慢由于虚拟机需要加载和运行整个操作系统,其启动时间相对较长,特别是当虚拟机镜像较大或物理资源有限时,这一问题更为明显。此外,虚拟机在运行时也可能因为资源分配和调度的开销而表现出较慢的响应速度。
相比之下,Docker 容器由于共享宿主机的操作系统内核,可以在几秒钟内启动,且运行效率更高。
2.3.3 管理复杂度高管理虚拟机涉及到对虚拟硬件环境、操作系统实例以及上面运行的应用程序和服务的管理。当虚拟机数量增多时,这些管理任务会变得尤为复杂。每个虚拟机可能需要 单独的安全补丁、操作系统更新、配置更改和监控。
此外,虚拟机之间可能存在依赖关系,这些依赖关系的管理也增加了系统管理员的负担。
而使用 Docker 等容器技术,可以通过 容器编排工具(如Kubernetes)来简化这些管理任务,提高了运维效率。
3 Docker => 系统层面的虚拟化技术 3.1 Docker的抽象层级Docker容器化技术则采用了一种不同的方法。它在操作系统级别提供虚拟化,通过在宿主机的操作系统内核上直接运行容器实现。这种方式使得Docker容器更加轻量级,并且启动速度更快。
与传统的硬件级别虚拟化相比,操作系统级别的虚拟化具有以下特点和优势:
- 资源占用小:容器不需要运行完整的操作系统,因此它们消耗的资源远少于传统虚拟机。
- 快速启动和部署:由于不需要启动完整的操作系统,容器可以在几秒钟内启动和部署。
Docker容器虽然共享宿主机的内核,但在操作系统层面实现了良好的隔离,这将在后面继续介绍。
3.3 容器化应用Docker 本身将容器解释为“软件的标准单元”,**容器 **是应用程序层的抽象,它将代码和依赖项打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器作为用户空间中的独立进程运行。容器比虚拟机占用更少的空间(容器镜像的大小通常为数十MB),可以处理更多的应用程序,并且需要更少的虚拟机和操作系统。

在实际应用中,Docker技术在简化和加速开发流程方面发挥了重要作用。对于系统管理员而言,配置一个能够持续提供一致体验的工作环境,在面对多个不同的操作系统、不同版本的操作系统及各种库和编程语言时,一直是一个巨大的挑战。Docker通过减少活动部件的数量,有效解决了这一问题。现在,管理员只需要关注Docker引擎和运行时的一致性,而不是繁杂的操作系统和程序版本。
在生产环境中,Docker同样展现出了其优势。例如,考虑一个需要从Python 2.7升级到Python 3.5的Web应用程序。传统方法可能涉及复杂的操作系统升级或第三方依赖项的安装,而使用Docker,我们只需构建一个包含新应用程序代码和依赖项的新容器。如果新版本有问题,简单地回滚到旧容器即可。这种方式显著降低了故障恢复时间,同时也减少了由于系统和应用程序的变更导致的不确定性。
4. 结论本文深入探讨了 Docker 与传统虚拟机技术的区别,通过对比分析它们在抽象层级、隔离性、资源消耗、启动速度以及应用场景等方面的不同,揭示了 Docker 在现代软件开发和运维中的独特价值和优势。
虚拟机技术,作为一种硬件级别的虚拟化手段,通过模拟整个硬件系统来提供完全独立的运行环境,适用于需要高度隔离和完整操作系统支持的场景。然而,这种技术的资源消耗大、启动和运行速度慢、管理复杂度高等特点,使其在某些应用场景下显得不那么高效。
相比之下,Docker 作为一种系统层面的虚拟化技术,通过在宿主机的操作系统内核上直接运行容器,实现了轻量级的虚拟化。这种方法不仅资源占用小、启动速度快,而且简化了应用的部署和管理过程,为软件的持续开发和快速迭代提供了强大的支持。Docker 的隔离性虽然不及传统虚拟机,但对于大多数开发和生产环境已经足够。
总的来说,Docker与虚拟机技术各有优势和适用场景。在选择适合的技术时,开发者和系统管理员应根据具体需求、资源限制和安全要求来做出决策。随着容器技术的不断成熟和发展,Docker及其生态系统将继续在云计算、微服务架构、持续集成/持续部署(CI/CD)等领域发挥重要作用,推动软件开发和运维的现代化进程。
相关文章:
Docker技术概论(1):Docker与虚拟化技术比较
Docker技术概论(1) Docker与虚拟化技术比较 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…...
alibabacloud学习笔记07(小滴课堂)
讲解Sentinel自定义异常降级-新旧版本差异 讲解新版Sentinel自定义异常数据开发实战 如果我们都使用原生的报错,我们就无法得到具体的报错信息。 所以我们要自定义异常返回的数据提示: 实现BlockExceptionHandler并且重写handle方法: 使用F…...
Ansible-Playbook
目录 1、概念介绍 roles 角色 playbook 核心元素 ansible-playbook 命令 playbook 简单案例 2、Ansible 变量 自定义变量 facts 变量 Palybook 部署 LAMP ansible 端安装 LAMP playbook 系统环境脚本 构建 httpd 任务 构建 mariadb 任务 构建 php 任务 编写整个任务…...
UE5常见问题处理笔记
一、C工程中的文件出现很多头文件找不到,比如:#include CoreMinimal.h文件提示找不到。 解决方法:在UE编辑器中选择菜单Tools -> Refresh Visual Studio Project。 二、莫名其妙的编译错误。 解决方法,找到工程根目录下的Bi…...
docker中hyperf项目配置虚拟域名
在学习hyperf框架时遇到一些问题,这里是直接用了docker环境 下载镜像运行容器 docker run --name hyperf -v /data/project:/data/project -p 9501:9501 -itd -w /data/project --privileged -u root --entrypoint /bin/sh 镜像ID配置docker-compose.yml version…...
PID闭环控制算法的学习与简单使用
平台:matlab2021b,Vivado2018 应用场景和理解 一个早餐店,假如一天都有生意,生意有的时间很火爆,有时候又一般,老板又是个实在人,只知道在后厨蒸包子。由于包子蒸熟需要一定的时间,老…...
【无刷电机学习】光耦HCNR200基本原理及应用(资料摘抄)
【仅作自学记录,不出于任何商业目的。如有侵权,请联系删除,谢谢!】 本文摘抄翻译自: https://docs.broadcom.com/wcs-public/products/application-notes/application-note/331/6/av02-1333en-an_5394-16jul10.pdfhtt…...
【LeetCode】1768_交替合并字符串_C
题目描述 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 https://leetcode.cn/problems/merge-strings-al…...
C#解析JSON
https://blog.csdn.net/weixin_43046974/article/details/131449900 C#解析JSON 1. JSON定义2. JSON一般构成及解析方法3. 解析举例子 1. JSON对象解析,只包含一层对象{}2. 嵌套JSON对象解析,包含多层对象{}3. JSON数组解析1(数组循环遍历&…...
AI图像识别算法助力安全生产*提升风险监测效率---豌豆云
2024年开年来安全生产事故频发,工厂爆炸、工程坍陷等重大安全生产事故的发生再次为我们敲响了警钟。 安全生产是企业发展的生命线,而传统的安全监测手段存在盲区和延迟,难以及时发现和应对潜在风险。 AI图像识别算法通过利用先进的计算机视…...
CSS技巧:实现两个div在同一行显示的方法
css如何让两个div在同一行显示 - web开发 - 亿速云 在Web开发中,经常遇到需要将多个元素水平排列在同一行的情况。其中一个常见的需求是将两个div元素放置在同一行上,使它们并排显示。在本文中,我们将介绍几种实现这一效果的CSS方法。 1. 使…...
【Unity】Node.js安装与配置环境
引言 我们在使用unity开发的时候,有时候会使用一些辅助工具。 Node.js就是开发中,经常会遇到的一款软件。 1.下载Node.js 下载地址:https://nodejs.org/en 2.安装Node.js ①点击直接点击Next下一步 ②把协议勾上,继续点击…...
Vue3:使用 Composition API 不需要 Pinia
在 Vue.js 开发的动态环境中,在单个组件中处理复杂的业务逻辑可能会导致笨重的文件和维护噩梦。虽然 Pinia 提供集中式状态管理,但仅依赖它来处理复杂的业务逻辑可能会导致代码混乱。本文探讨了使用 Composition API 的替代方法,说明开发人员…...
ExoPlayer 播放视频黑屏的解决方法
最近项目中在使用 ExoPlayer 来进行视频的播放,开发过程中遇到了部分视频打开后黑屏的问题,报错日志如下。 E Audio codec error android.media.MediaCodec$CodecException: Error 0xe E Playback error androidx.media3.exoplayer.ExoPlaybackExcept…...
C语言初阶—数组
数组是一组相同类型元素的集合。 在C99标准之前,数组的大小必须是常量或常量表达式。 在C99标准之后,数组的大小可以是变量,可以支持变长数组,但变长数组不能初始化。 不完全初始化,剩余的元素默认初始化为0 。 数组访…...
飞桨(PaddlePaddle)数据预处理教程
文章目录 飞桨(PaddlePaddle)数据预处理教程1. 安装飞桨2. 了解飞桨的数据预处理方法3. 应用单个数据预处理方法4. 组合多个数据预处理方法5. 在数据集中应用数据预处理5.1 在框架内置数据集中应用5.2 在自定义数据集中应用 6. 总结 飞桨(Pad…...
MYSQL C++链接接口编程
使用MYSQL 提供的C接口来访问数据库,官网比较零碎,又不想全部精读一下,百度CSDN都是乱七八糟的,大部分不可用 官网教程地址 https://dev.mysql.com/doc/connector-cpp/1.1/en/connector-cpp-examples-connecting.html 网上之所以乱七八糟,主要是MYSQL提供了3个接口两个包,使用…...
并发编程中常见的设计模式,c++多线程如何设计
C多线程设计(任务的“多对一”、“一对多”、“多对多”情况 该如何设计线程?) C书籍中并未找到对多线程设计,有很完整详细的总结!!C并发编程书籍中也只是一些理论或则零散的多线程实例。无奈,…...
解决android studio build Output中文乱码
1.效果如下所示: 代码运行报错的时候,Build Output报的错误日志中中文部分出现乱码,导致看不到到底报的什么错。 2.解决办法如下: 点击Android studio开发工具栏的Help-Edit Custom VM Options....,Android studio会…...
[云原生] K8s之pod进阶
一、pod的状态说明 (1)Pod 一直处于Pending状态 Pending状态意味着Pod的YAML文件已经提交给Kubernetes,API对象已经被创建并保存在Etcd当中。但是,这个Pod里有些容器因为某种原因而不能被顺利创建。比如,调度不成功(…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
