Docker容器与虚拟机(VM)大对比

Docker是一个开源应用容器引擎。Docker可以将应用程序与基本架构分开,从而快速交付软件。

传统虚拟机的运行需要占用较高的资源,包括磁盘空间、内存和处理器性能。每个虚拟机都需要完整的操作系统和应用程序副本,这在资源利用和启动时间上存在一定的开销。

容器技术则是在虚拟化领域的进一步演进,它采用了更轻量级的虚拟化方式。容器技术利用操作系统的容器化功能(如Linux容器),通过隔离进程的命名空间、文件系统和资源控制组(cgroups)等功能,实现了应用程序的隔离和运行环境的虚拟化。

Docker作为创建容器的主流工具,近年来迅速发展,它的优势在于可以让开发者将企业需要的各种应用及应用依赖文件封装在Docker镜像文件中,然后在任何物理设备(Linux设备或Window设备等)上安装运行实现虚拟化,让应用程序彻底脱离底层设备,可以在物理机之间灵活迁移部署,使运维工程师摆脱了繁琐的环境部署,极大的提高了工作效率,同时减少了部署过程中的潜在风险。

Docker容器具有以下四大特点:

轻量化:Docker容器是基于操作系统层面的虚拟化技术,相对于传统的虚拟机来说,容器更加轻量级。每个容器共享主机的操作系统内核,只包含应用程序及其运行所需的依赖项,因此容器的启动和停止速度非常快。

隔离性:每个Docker容器都是相互隔离的,具有自己的文件系统、进程空间和网络接口。这意味着容器之间相互独立,互不影响,可以在同一主机上同时运行多个容器,每个容器都像一个独立的虚拟环境。

可移植性:Docker容器可以在不同的操作系统和云平台上运行,具有很强的可移植性。容器内部的应用程序及其依赖项被打包成一个独立的、可移植的单元,可以轻松地在开发、测试和生产环境之间进行部署和迁移。

可扩展性:Docker容器可以很容易地进行水平扩展。通过使用容器编排工具(如Docker Compose、Kubernetes等),可以根据需求自动或手动地启动、停止和管理多个容器实例,以满足不同的负载需求。

Docker容器 VS 虚拟机(VM)

Docker容器和传统VM技术,在技术实现上有所不同。下图显示的是VM与Docker容器的逻辑组成:

虚拟机(VM):
使用Hypervisor提供虚拟机的运行平台,管理每个VM中操作系统的运行。每个VM都要有自己的操作系统、应用程序和必要的依赖文件等。

Docker容器:
使用Docker引擎进行调度和隔离,提高了资源利用率,在相同硬件能力下可以运行更多的容器实例;每个容器拥有自己的隔离化用户空间。

 

虚拟机与Docker容器对比

相较于VM,Docker容器作为一种轻量级的虚拟化方式,在应用方面具有以下显著优势:

  • Docker容器可以在秒级时间内快速启动和停止,相较传统虚拟机显著提升。

  • Docker容器对系统资源要求低,数千个Docker容器可同时运行在同一个主机上。

  • Docker容器通过类似Git的操作来方便用户获取和更新应用镜像。

  • Docker容器通过Dockerfile配置文件实现自动化创建和灵活部署,提高工作效率。

  • Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。

下图可直观了解Docker容器与传统VM方式的区别:

 

Docker的五大组成要素

镜像构建:

Docker容器的基础是Docker镜像,镜像是一个只读的模板,包含了运行应用程序所需的文件系统和依赖项。镜像可以通过编写Dockerfile文件并运行构建命令来创建,Dockerfile中定义了构建镜像的步骤,例如安装软件包、配置环境等。

容器创建:

通过使用Docker命令行工具或Docker API,可以基于特定的镜像创建容器。在创建容器时,可以指定容器的名称、网络设置、端口映射等参数。每个容器都有一个唯一的ID和一个隔离的运行环境。

文件系统隔离:

Docker容器使用了Linux内核的命名空间和控制组(cgroups)等技术,实现了容器之间的文件系统隔离。每个容器都有自己的文件系统视图,但是它们共享主机操作系统的内核。

运行应用程序:

容器内的应用程序和进程可以在独立的运行环境中执行。Docker容器可以运行任何可在操作系统中执行的应用程序,如Web服务器、数据库等。容器内的应用程序可以通过与主机或其他容器之间的网络通信来提供服务。

容器管理:

Docker提供了一组命令行工具和API,用于管理和监控容器。这些工具可以启动、停止、重启、删除容器等操作。同时,Docker还支持容器编排工具,如Docker Compose和Kubernetes,可以用于自动化管理和扩展多个容器。

以下是一些常见的容器化技术:

Docker:Docker是目前最流行的容器化平台之一。它提供了一种标准的容器格式和运行时环境,使开发者可以将应用程序及其依赖项打包成一个独立、可移植的容器。Docker提供了强大的工具和功能,用于构建、部署和管理容器化应用程序。

FinClip小程序容器:FinClip是一个专注于移动端的小程序容器平台。它提供了一套小程序容器化的解决方案,使开发者可以在移动应用中嵌入和运行小程序。FinClip提供了一系列的API和工具,使得开发者可以将小程序以容器化的方式集成到移动应用中,并与移动应用的功能进行交互。

Kubernetes(K8s):Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。Kubernetes提供了容器编排、服务发现、负载均衡、自动伸缩等功能,使开发者能够以一种可靠、弹性的方式运行容器化应用程序。

Apache Mesos:Apache Mesos是一个分布式系统内核,提供了资源管理和任务调度的功能。它支持容器化应用程序的部署和管理,可以与多种容器运行时集成。

Cloud Foundry:Cloud Foundry是一个开源的容器化平台,用于构建、部署和管理应用程序。它提供了一种基于容器的开发和运行环境,支持多种编程语言和应用程序框架。

LXC(Linux Containers):LXC是一种基于Linux内核的轻量级虚拟化技术,用于实现容器化。它提供了一种将进程隔离到独立的命名空间中的方式,实现应用程序的隔离和资源管理。

这些技术都有各自的特点和应用场景,但它们的共同目标是提供一种便捷、可移植和可扩展的容器化环境,以简化应用程序的部署和管理,并提供更高的资源利用率和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js实现PDF 预览和文件下载

在开发过程中要求对 PDF 类型的发票提供 预览 和 下载 功能,PDF 类型文件的来源又包括 H5 移动端 和 PC 端,而针对这两个不同端的处理会有些许不同,下文会有所提及。 针对 PDF 预览 的文章不在少数,但似乎都没有提及可能遇到的问…

Markdown可以在线编辑吗?这个办法很好用

Markdown是一种轻量级标记语言,它使用简单的语法来创建文本,非常易于学习。它最初被设计为一种用于写作的格式,但现在已经成为了一种非常受欢迎的文本编辑工具。 作为一个较为方便的在线文本编辑器,它可以用代码代替文字&#xf…

27事务管理AOP

一、MySQL事务回顾 二、Spring事务管理 Spring框架的第一大核心:IOC控制反转 在DeptServiceImpl下删除部门方法下新加一个删除员工信息的操作,注意:此时的id是部门id。 1、问题分析 2、Transactional-Spring事务管理 一般是在Service实现类的…

Visual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本

前言 本篇在讲什么 在Visual Studio中引入lua的解释器 使用C调用Lua文件 本篇适合什么 适合初学Lua的小白 适合需要C/C和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文…

springboot中将logback切换为log4j2

前言 springboot默认使用logback作为日志记录框架,常见的日志记录框架有log4j、logback、log4j2。这篇文章我们来学习怎样将logbak替换为log4j2。 一、为什么使用log4j2? 我们在项目中经常使用一个叫SLF4J的依赖,它是做什么的呢? …

Activity的预览窗口StartingWindow添加

Activity的预览窗口StartingWindow添加 1、Activity组件启动2、ActivityStarter.java#startActivityInner() > 主要查看Task.java#startActivityLocked3、ActivityRecord.java#addStartingWindow到WindowManagerService.java#addWindow3.1 ActivityRecord.java#addStartingW…

C/C++开发,libiec61850库学习及运用

目录 一、libiec61850库下载编译 1.1 下载 1.2 linux编译: 1.3 win编译 二、案例编译测试 2.1 CMakeLists.txt调整(server_example_goose) 2.2 模型static_model.h/static_model.cpp生成 2.3 案例编译(server_goose) 2.4 客户端编译 2.5 运行测试 一、libiec61850…

【Python开发】FastAPI 03:请求参数—请求体

除了路径参数和查询参数,还有请求体,其用于传递 JSON、XML 或其他格式的数据,以便服务器能够读取并做出相应的处理,可以说请求体的作用更为强大。试想一下,如果存在七八个参数,路径参数和查询是不是就招架不…

Android播放器拖动进度条的小图预览

Android播放器拖动进度条的小图预览 背景效果图关键代码1. 获取指定位置的视频帧2. 预览图的显示和隐藏 完整代码1. xml布局文件activity_video.xml2. Activity文件VideoActivity.java 背景 我们在使用一些播放器时,拖动进度条会有一个预览框,上一篇博客…

Docker容器 和 Kubernetes容器集群管理系统

一、快速了解Docker 1. 什么是Docker的定义 Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以…

javaScript 给图片加水印

背景 在很多地方,我们都可以看到,上传图片的时候,图片都会被加上默认的水印,水印的作用主要体现在以下几个方面: 1.版权保护:在商业用途的照片中添加水印可以帮助保护作者的版权,防止他人未经…

IOS复杂震动AHAP文件编辑指南

简介 目前部分游戏会在播放一些特定的音乐音效时,令设备产生贴合音效的复杂震动,给玩家一个更好的游戏体验。这种复杂震动就是通过苹果的CoreHaptics库实现的。 下面是关于CoreHaptics的官方文档 ​​​​​​​Core Haptics | Apple Developer Docum…

C++ Qt项目实战:构建高效的代码管理器

C Qt项目实战:构建高效的代码管理器 一、项目概述(Introduction)1.1 项目背景(Project Background)1.2 项目目标(Project Goals)1.3 项目应用场景(Project Application Scenarios&am…

《操作系统》期末主观题梳理

操作系统简答题 文章目录 操作系统简答题第一章第二章第三章第四章第五章第六章第七章第八章第九章 第一章 在计算机系统上配置OS(operating system, 操作系统)的目标是什么?作用主要表现在哪几个方面? 在计算机系统上配置OS, 主要目标是实现:方便性、有效性、可…

加速数实融合,数据交易3.0模式上新

数据交易市场将迎来真正的突破? 目前看的确如此。随着去年底“数据二十条”的颁布,业界普遍认为数据基础制度将加速走向落地与完善,数据要素化今年有望迎来全面提速,将极大促进数据交易市场走向规模化。 IDC预测,到2…

css3新增特性

1. 初始化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …

【Cpp】哈希之手撕闭散列/开散列

文章目录 unorderedunordered系列关联式容器unordered_map和unordered_set概述unordered_map的文档介绍unordered_map的接口说明 底层结构 哈希哈希/散列表 概念哈希冲突哈希函数哈希函数设计原则&#xff1a;常见哈希函数 哈希冲突解决闭散列线性探测二次探测 开散列 哈希表的…

mysql学习

DISTINCT 检索不同行 该关键字的作用就是用来去重&#xff0c;可以将你所要展示的数据中完全相同的去重&#xff0c;只展示一个&#xff1b; LIMIT 限制结果 该关键字的作用就是你限制它返回几条数据&#xff0c;比如你想要获得前面5行的据&#xff0c;就可以使用limit 5&…

java 区分缺陷Defects/感染Infections/失败Failure

java 区分缺陷Defects/感染Infections/失败Failure 缺陷Defects 软件故障总是从代码中一个或多个缺陷的执行开始。 缺陷只是一段有缺陷、不正确的代码。 缺陷可能是程序语句的一部分或完整部分&#xff0c;也可能对应于不存在但应该存在的语句。 尽管程序员要对代码中的缺陷负…

利用Servlet编写第一个“hello world“(续)

利用Servlet编写第一个“hello world“ &#x1f50e;通过插件 Smart Tomcat 简化 打包代码 与 部署 操作下载Smart Tomcat配置Smart Tomcat &#x1f50e;Servlet 中的常见错误404(Not Found)&#x1f36d;请求路径出错&#x1f36d;war 包未被正确加载 405(Method Not Allowe…