Docker与VM虚拟机的区别以及Docker的特点

news2024/11/23 20:57:14

01、本质上的区别

VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;

Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。

那么问题来了,没有操作系统,怎么运行程序?

可以在Docker中创建一个ubuntu的镜像文件,这样就能将ubuntu系统集成到Docker中,运行的应用就都是ubuntu的应用。

02、使用上的区别

Size

  • 虚拟机中ubuntu所占内存:

  • Docker容器中ubuntu镜像文件所占内存:

01、Startup

Docker在宿主机器的操作系统上创建Docker引擎,直接在宿主主机的操作系统上调用硬件资源,而不是虚拟化操作系统和硬件资源,所以操作速度快。

这个其实安装一个ubuntu的虚拟机和拉取一个Docker的ubuntu镜像文件,运行一下就知道了,区别很明显,虚拟机开一下大概得2分多钟,而Docker只需要2秒钟。

02、Integration

首先,Docker可以让你非常容易和方便地以“容器化”的方式去部署应用。它就像集装箱一样,打包了所有依赖,再在其他服务器上部署很容易,不至于换服务器后发现各种配置文件散落一地,这样就解决了编译时依赖和运行时依赖的问题。

其次,Docker的隔离性使得应用在运行时就像处于沙箱中,每个应用都认为自己是在系统中唯一运行的程序,就像刚才例子中,A依赖于python 2.7,同时A还依赖于B,但B却依赖于Python 3,这样我们可以在系统中部署一个基于Python 2.7的容器和一个基于Python 3的容器,这样就可以很方便地在系统中部署多种不同环境来解决依赖复杂度的问题。这里有些朋友可能会说,虚拟机也可以解决这样的问题。诚然,虚拟化确实可以做到这一点,但是这需要硬件支持虚拟化及开启BIOS中虚拟化相关的功能,同时还需要在系统中安装两套操作系统,虚拟机的出现是解决了操作系统和物理机的强耦合问题。但Docker就轻量化很多,只需内核支持,无需硬件和BIOS的强制要求,可以轻松迅速地在系统上部署多套不同容器环境,容器的出现解决了应用和操作系统的强耦合问题。

正因为Docker是以应用为中心,镜像中打包了应用及应用所需的环境,一次构建,处处运行。这种特性完美解决了传统模式下应用迁移后面临的环境不一致问题。同时,Docker压根不管内部应用怎么启动,你自己爱咋来咋来,我们用docker start或run作为统一标准。这样应用启动就标准化了,不需要再根据不同应用而记忆一大串不同启动命令。

基于Docker的特征,现在常见的利用Docker进行持续集成的流程如下:
开发者提交代码
触发镜像构建
构建镜像上传至私有仓库
镜像下载至执行机器
镜像运行

其基本拓扑结构如图1所示

熟悉Docker的朋友都知道,Docker启动非常快,可以说是秒启。在上述的五步中,1和5的耗时较短,整个持续集成主要耗时集中在中间的3个步骤,也就是docker build、docker push、docekr pull这样还是无法达到顺滑的极致要求,下来我们来分析下build、push、pull的耗时和解决方法:

03、docker build

网络优化

dockerhub的官方镜像在国外,由于众所周知的原因,在国内进行构建时网络会是很大的瓶颈,甚至某些公司的环境是无Internet连接的。

在这种情况下,建议使用国内的镜像源,或者自己搭建私有仓库,保存项目需要的基础镜像,把构建过程中的网络传输都控制在国内或者内网,这样就不用再考虑网络方面的问题。

使用 .dockerignore文件

dockerignore文件的设计是为了在docker build的过程中排除不需要用到的文件以及目录,目的是为了docker build这个过程可以尽可能地快速高效以及构建出来的image没有多余的“垃圾”。

最小化镜像层数(layers)

把镜像层数减到最少,能加快容器的启动速度,但是这里也要权衡另一个问题:dockerfile的可读性。你可以把一个dockerfile写得很复杂以达到构建出最小层数的镜像,但同时你的dockerfile可读性也降低了。所以我们要在镜像层数和dockerfile可读性之间做出妥协。

04、docker push

docker registry升级到v2后加入了很多安全相关检查,在v2中的镜像的存储格式变成了gzip ,镜像在压缩过程中占用的时间也比较多。我们简单分解一下docker push的流程。

buffer to disk,将该层文件系统压缩成本地的一个临时文件;
上传文件至registry;
本地计算压缩包digest,删除临时文件,digest传给registry;
registry计算上传压缩包digest并进行校验;
registry将压缩包传输至后端存储文件系统;
重复1-5直至所有层传输完毕;
计算镜像的manifest并上传至registry重复 3-5。
这样的设计导致push会很慢,如果采用官方的dockerhub,需要考虑docker build一节中提及的网络方面影响,dockerhub公有镜像库还需考虑安全方面的因素。

同时docker和registry设置了过多的安全防范措施(如双向证书认证等),主要是为了防止在公有云的环境下镜像的伪造和越权获取。但是在一个可信的环境内,如果build和push过程都是自己掌控,很多措施都是多余的。

05、docker pull

docker pull 镜像的速度对服务启动速度至关重要,好在registry v2后可以并行pull了,速度有了很大改善。但是依然有一些小的问题影响了启动的速度:

下载镜像和解压镜像是串行的;

串行解压,由于v2都是gzip要解压,尽管并行下载了还是串行解压,内网的话解压时间比网络传输都要长;

和registry通信, registry在pull的过程中并不提供下载内容只是提供下载url和鉴权,这一部分加长了网络传输,而且一些metadata还是要去后端存储获取,延时还是有一些的。

通过刚才的分析,大家可以看到,其实docker build、push、pull其实主要耗时是在网络传输(主要)及安全防范措施(轻微)上,整个传输过程甚至大大超过了其他所有步骤的时间;这样可以借助我们的AppHouse方便的搭建本地企业级镜像仓库,将网络传输转移至内网,同时完全掌控了 build、push和pull的过程,这样提高效率的同时也解决了安全问题,可谓一举两得。
经过Docker、AppHouse的帮助,我们距极致追求的如丝般顺滑的持续集成目标只有一步之遥,Docker解决了依赖和环境问题,AppHouse解决了镜像安全快速传输的问题,接下来就是容器的部署和管理问题。

Docker实现了底层技术的创新,它的出现将开发者从与系统的纠缠中释放了出来,但是阻碍企业使用Docker的问题是容器的大规模部署、管理问题和缺少企业级容器工具及系统。

镜像创建完成后,需要把它发布到测试和生产环境。因为Docker占用资源小,在单个服务器上部署成百上千个容器也不足为奇。这个阶段中如何更合理地使用Docker也是一个难点,开发团队需要考虑如何打造一个可伸缩扩展的分发环境。

AppSoar提供人性化的Web管理界面,丰富的Compose文件格式和功能完备的API接口,通过Compose实现以十分简单的文件描述复杂的应用结构,让部署变得更简单。并且,AppSoar还提供丰富的企业应用商店,让一键创建服务成为可能。这样可以快速搭建应用场景,开发者只需要关注开发本身即可。

打通最后一个环节后,整个持续集成平台架构演进到如图2所示。

03、Docker特点

上手快

用户只需要几分钟,就可以把自己的程序“Docker 化”。Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改” 的境界。

随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即可 启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。

职责的逻辑分类

使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正 常的,上线后出了问题就归结为肯定是运维的问题)”

快速高效的开发生命周期

Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker 就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件 件的取。)

鼓励使用面向服务的架构

Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序 都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1217989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress丸子小程序问题常见解决方案

WordPress丸子小程序问题常见解决方案 下载uniapp,导入项目。修改下图域名为自己的WP博客地址。(如下图) 发行微信小程序,如果显示不是项目所有者,请重新获取。 重新发行微信小程序,请打开微信开发者工具端…

【leaflet】学习笔记1-4

▒ 目录 ▒ 🛫 导读开发环境 1️⃣ 改造greengis的leafletinsCodeinline-module服务器live-server 2️⃣ d1. 初见:Map、TileLayer说明/流程关键代码 3️⃣ d2. 多地图切换:Control.Layers说明/流程关键代码 4️⃣ d3. 标记:Marke…

【Proteus仿真】【51单片机】锂电池管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用LCD1602显示模块、DS18B20温度传感器、PCF8691 ADC模块、按键、LED蜂鸣器模块等。 主要功能: 系统运行后,LCD1602显示温度…

Git-概念与架构

GIT-概念与架构 一、背景和起源二、版本控制系统1.版本控制分类1.1 集中式版本控制1.2 分布式版本控制 2.Git和SVN对比2.1 SVN2.2 GIT 三、GIT框架1.工作区(working directory)2.暂存区(staging area)3.本地仓库(local…

算法笔记-第五章-大整数运算

算法笔记-第五章-大整数运算 大整数运算大整数比较大整数加法大整数减法大整数乘法大整数乘法2大整数除法 大整数运算 一:使用数组存储整数的时候,整数的高位存储在数组的高位,整数的低位存储 在数组的低位 二:把整数按照字符串读…

除了chatGPT网站外,国内有些可以使用的AI网站 文心一言 讯飞星火 豆包 通义千问 人工智能网站 AI网站

2023年随着人工智能技术的不断发展,AI网站如ChatGPT等越来越受到人们的关注。这些网站具有多种作用,可以帮助人们更方便地获取信息、解决问题,甚至进行创作。 首先,AI网站可以提供智能问答服务。与传统的搜索引擎相比&#xff0c…

DAC实验(DAC 输出三角波实验)(DAC 输出正弦波实验)

DAC 输出三角波实验 本实验我们来学习使用如何让 DAC 输出三角波,DAC 初始化部分还是用 DAC 输出实验 的,所以做本实验的前提是先学习 DAC 输出实验。 使用 DAC 输出三角波,通过 KEY0/KEY1 两个按键,控制 DAC1 的通道 1 输出两种…

Educational Codeforces Round 20 A-E

文章目录 A. Maximal Binary MatrixB. Distances to ZeroC. Maximal GCDD. Magazine AdE. Roma and Poker A. Maximal Binary Matrix 思路:一道很有意思的构造,我们可以发现,按照下述,从外到内进行一层一层的构造一定是最优的。 …

计算机网络———ipv6简解

文章目录 1.前言:2. ipv6简单分析:2.1.地址长度对比2.2. ipv6包头分析2.3. ipv6地址的压缩表示:2.3. NDP:2.4. ipv6地址动态分配: 1.前言: 因特网地址分配组织)宣布将其最2011年2月3日,IANA (In…

LeetCode(25)验证回文串【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 验证回文串 1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…

Django 配置 Email Admin 详细指南

概要 Django 是一个高级的 Python Web 框架,它鼓励快速开发和清洁、实用的设计。当你正在开发一个 Django 项目时,监控网站的运行情况是非常必要的。Django 提供了一个功能强大的 admin 界面,但同时也可以通过配置 email admin 来获取网站的…

how to find gcc openbug

https://gcc.gnu.org/bugzilla/query.cgi?formatadvanced

决策树,sql考题,30个经典sql题目

大数据: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学&#x…

C++初阶 | [三] 类和对象(中)

摘要:类的6个默认成员函数,日期类 如果一个类中什么成员都没有,简称为空类。然而,空类并不是什么成员都没有,任何类在什么都不写时,编译器会自动生成6个默认成员函数。默认成员函数:用户没有显式…

【云原生-Kurbernetes篇】K8s的存储卷/数据卷+PV与PVC

这是一个目录标题 一、Kurbernetes中的存储卷1.1 为什么需要存储卷?1.2 存储卷概述1.2.1 简介1.2.2 volume字段 1.3 常用的存储卷类型1.3.1 emptyDir(临时存储卷)1.3.2 hostPath(节点存储卷)1.3.3 nfs1.3.4 cephfs 二、…

为React Ant-Design Table增加字段设置 | 京东云技术团队

最近做的几个项目经常遇到这样的需求,要在表格上增加一个自定义表格字段设置的功能。就是用户可以自己控制那些列需要展示。 在几个项目里都实现了一遍,每个项目的需求又都有点儿不一样,迭代了很多版,所以抽时间把这个功能封装了…

用script去做前端html表格分页/排序

前言: 掘弃掉与后端交互做分页和互导,有利有弊吧; 在小数据的时候,如果不停来回朝服务端发送请求,会造成堵塞.于是,放弃了之前的前后端ajax方式去请求分页表格,使用script去弄一个,降低服务器的压力; 整体思路图: 代码构造: {% extends "order_header_same.html" …

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】 课本里章节里所有蓝色字体的思维导图

什么是美国服务器,有哪些优势,适用于什么场景?

​  在互联网发展的过程中,服务器扮演着至关重要的角色。而美国作为全球信息技术的中心,其服务器在全球范围内受到广泛关注。  美国服务器是指在美国本土机房搭建并运行的服务器。其拥有带宽大、优质硬件、售后运维好、位置优越、数据安全性高以及免备…

C/C++输出整数部分 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C输出整数部分 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C输出整数部分 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个双精度浮点数f, 输出其整…