引言

在解释docker是什么之前,我们首先应该先了解的是容器化的概念。

什么是容器?就是一个沙箱,在这个沙箱中涵盖了特定应用运行的一切依赖的内容。但他不是一个操作系统,且和底层的操作系统是隔离的。

什么是容器化?容器化就是将软件和应用所需要的所有依赖打包到一个独立的容器中,使得软件能够在不同的计算环境中,高效的、按照预期运行的技术。

先有容器化的概念还是先有的docker?先有的容器化概念,容器化最早提出是在1979年,贝尔实验室发明了chroot,用于将一个进程的文件系统隔离起来,通常认为这是容器技术的开端。

和虚拟化技术有什么联系?有关联也有区别,参考下文“虚化技术”。

Docker 优势

一项技术的优势,通常是在说他解决了传统技术的哪一项痛点,这也是技术持续迭代的一个动力。

传统部署痛点

传统的部署方式通常是在虚拟机上直接部署,如果你有部署过虚拟机服务,你会经历过如下痛点:

1. 环境不一致

主要是设备、系统、工具等方面的差异,举个例子:一般我们在服务器上都是使用Linux的相关版本,所以如果开发使用的是Linux系统,一些脚本等配置都可以无缝迁移,但如果使用windows,我们可能会经历在本地能跑,但是部署到服务器却因为缺少一些信息,无法启动或调用失败的问题。

2. 部署复杂

传统的虚拟机手工部署,在首次部署时,需要安装很多工具包,如果某个步骤出错,就可能会需要我们从头开始排查,耗费比较多的人力成本。后续的部署过程中,以war包为例,如果war包有问题,我们又需要赶紧重新部署旧的服务,否则服务挂了对用户来说太痛了,这个时期的部署一般都选择夜间用户谷期进行。

当然,后来也演化除了一键部署等运维手段,但是依旧有跨环境部署的问题,因为生产环境限制永远要比我们开发测试的环境更高。

3. 资源占用率很高

传统虚拟化技术是模拟完整的操作系统实现相关的隔离,需要提前进行资源的“预分配”,所以这里的资源浪费是比较严重的,一台服务器,可能部署3台虚拟机就到顶了。

4. 扩容效率低

虚拟机部署方式下,我们如果遭遇到突发的大流量,比如某位名人空降微博热搜,这种情况下,大概率是会宕机的(不是DDoS,胜似DDoS),等虚拟机的再扩容启动(虚拟机启动相对耗时较长),这波流量可能就过去了,吃不到。

Docker 的解决方法

对于以上的痛点,Docker 采取了“镜像+容器”的方案来解决,实现了“一次构建,随处运行”。

1. 镜像的本质就是:应用运行时所需要的完整环境快照(包含程序、库、资源、配置文件等),他不包含动态的数据,一旦构建完成,就不会再变了。

由于环境的固化,我们得以实现版本和配置差异的打平,解决了环境不一致的问题。同时由于镜像分层存储的架构设计,使得不同镜像可以复用底层相同的层,从而避免“资源冗余”。

2. 容器的本质则是:一个具有Namespace的进程,它具有自己的文件系统、网络和进程空间。

容器是一个轻量、隔离的执行环境,专门用于运行我们的镜像而不需要考虑能否运行其他应用,同时由于共享操作系统内核,所以他没有内核的开销,不需要安装完整的操作系统,再加上它本身也具有被创建、启动、暂停、停止、删除的能力,所以为什么不能说他是一个轻量化的虚拟机呢?

这些特点使得容器资源占用变低,启动速度更快,从而也使得扩缩容的效率变高。

这里提供一下容器化和虚拟化技术的对比:

维度

容器化(Containerization)

虚拟化(Virtualization)

隔离级别

进程级(共享内核)

系统级(每个VM有独立内核)

资源抽象

抽象应用层(运行时环境、依赖)

抽象硬件层(CPU、内存、存储、网络)

启动速度

秒级(无需加载内核)

分钟级(需启动完整操作系统)

资源效率

高(轻量级)

低(VM管理程序占用额外资源)

密度

单主机可运行数百个容器

单主机通常运行数十个VM

隔离强度

中等(依赖内核安全机制,存在容器逃逸风险)

高(完全独立的操作系统环境)

适用场景

微服务、DevOps、弹性伸缩、CI/CD

传统应用迁移、关键业务系统、多租户隔离

代表技术

Docker,Kubernetes,containerd

VMware vSphere,Hyper-V,KVM,Xen

Docker 引擎

image

上文说到容器的本质是一个进程,那么也就是说可以通过操作系统来直接 kill 掉对应的 docker 实例,也可以通过操作系统来启停容器。

理论上来说是这样,但是我们在创建一个 docker 容器的同时,需要需要一个工具帮我们去处理创建该进程所需要准备的东西,以及在创建完成后,可以帮助我们快速的去维护这些容器实例,所以,这样一个工具,就是 Docker 引擎,他能做到的自然是不止我们现在说的这些内容。

从使用层面来说,Docker 引擎是 Docker 的核心组件,但是也不必过于害怕,这也就是一个普通的应用工具,和其他Linux命令一样,只是他的能力聚焦于管理 Docker 核心资源:

镜像(Image)、容器(Container)、网络(Network)、存储卷(Volume)

Docker 引擎的工作主要是负责管理和运行容器,包含以下几个部分:

  • Docker 守护进程:Docker 引擎的后台服务,负责持续运行并处理容器相关的请求,守护进程管理着整个容器的生命周期。
  • Docker REST API:提供 HTTP 的 API 接口,通过 HTTP 请求和 Docker 引擎进行交互。
  • Docker 命令行工具:cli 工具,可以在命令行直接输入 Docker 命令与 Docker 引擎进行交互。
  • 容器与镜像管理:镜像的创建和存储、容器的生命周期管理、容器网络管理。

但整体看下来,不难发现,Docker 引擎所处理的主要就是我们前文所说的两件事情:资源管理和容器的生命周期管理

在这里的“资源”所指代的范围是比较大的,网络也被认为是一种资源。

在目前的网络上搜索 Docker ,大多数的文章基本是在进行 Docker 的命令行的使用及解释,了解一下就行了,实际使用的时候翻阅也没什么问题:

docker pull
docker run image
docker stop
docker ps
...

Docker 的轻量级

那么 Docker 的轻量级因何而来,为什么他就比虚拟机要轻量?

要理解这个问题,其实也就是一两句话的事情:传统的虚拟机是在一个硬件层之上运行的一个完整的操作系统,而 Docker 则是运行在应用层之上的。不妨想一下,启动电脑快还是启动应用快?

传统虚拟机是通过虚拟化技术将底层的硬件虚拟化为硬件资源池,提供给上层的每个 VM (Virtual Machine,虚拟机)使用,让每个 VM 都认为自己是独立运行在物理机上的。

其后,每个 VM 又是运行的完整的操作系统,仅仅是操作系统+基础服务就需要占用较多的资源,而且这些资源是被 VM 独占的,不可被其他虚拟机复用。

虚拟机启动时,会锁定配置好的资源分配,如VM需要2c4g的基础资源,则会预先锁定,不让其他 VM 使用该资源

这种虚拟化架构实际就是寄居虚拟化,主要分三层:宿主操作系统(Host OS) -> 虚拟机监控程序(Hypervisor) -> 虚拟机(Guest OS),下面是对应的架构图,一个典型的应用就是我们熟知的 VMWare Workstation:

image

这就是传统虚拟机重的由来。

Docker 的轻量级也并不是因为他解决了这些问题,而是因为他另辟蹊径,不再去模拟一个完整的操作系统,而是基于 Linux 内核的 Namespace、Cgroups以及UnionFS技术,实现从系统级别的隔离转换到了进程级别的隔离,从架构层面抹除了硬件模拟和虚拟机操作系统的开销。

  • Namespace 提供资源隔离机制:将 PID、Network、Mount、User 等资源进行命名空间层级的划分,不同的 Namespace 的进程无法互相访问到。
  • Cgroups 进行配额限制:避免某一个进程组无限制的消耗资源,同时可以让空闲资源被释放。
  • UnionFS 实现镜像分层复用:不同的镜像可复用底层镜像,减少存储的冗余。

这样一来,Docker 虚拟化的架构就变成了:

image

没有了 Hypervisor 和 Guest OS,同时由于 Docker 是基于 Linux 内核技术的,所以宿主操作系统也只能是 Linux。

Docker 与云原生

云原生本质是一种构建和运行应用程序的方法,是以 k8s 为代表的一套技术体系和方法论[3]。这套技术体系是由 “容器化技术、编排调度、服务治理、可观测性” 等技术组成,而其中的容器化技术是云原生的 “基础载体”。而 Docker 则是容器化技术的 “开创者与早期绝对主导者”,也是云原生的核心应用,他通过解决传统部署的痛点问题,使得以容器为基础去构建分布式应用成为可能,从而推动了云原生的普及落地,可以说,如果没有 Docker,那云原生可能发展的不会如此迅速,还需要等待另一个“Docker”技术来推动其发展。

此外,Docker 定义的容器镜像标准,也成为了云原生应用的一个交付载体标准。目前的云原生应用的 CI/CD 标准流程是:代码提交→自动构建 Docker 镜像→镜像推送到仓库→编排工具拉取镜像部署,可以看到,在这个过程中,镜像就是代码到运行时的中间载体,也是我们交付的一个产物标准。

目前 k8s (1.20 以后的版本)已经弃用了对 Docker 的直接支持,转为原生支持 CRI 标准的容器运行时,但是这并不代表着 Docker 已经过时,只是 k8s 从以 Docker 主导转变为了基于 Docker 标准,多工具的生态协同

image

总结

Docker 不仅是一项技术创新,更重塑了软件产业的协作模式。Docker 将 Linux 内核的 Namespace、Cgroups、UnionFS 等技术封装成简单易用的工具链条,通过“镜像-容器 ”架构解决了传统部署的行业痛点问题,标准化了应用交付格式,为 k8s 等编排平台提供了基础载体,重塑了软件开发流程,实现“一次构建,到处运行”的理想态,推动了云原生的迅速发展。

未来,随着云原生技术持续演进,Docker 可能也不再是容器领域的唯一焦点,但其倡导的 "标准化、轻量化、可移植" 理念已深刻影响整个行业。无论是作为开发者日常工具,还是云原生基础设施的重要组成部分,Docker 仍会在上云浪潮中扮演关键角色。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题——hot 100(3)

题目1:矩阵置零题目:问题分析:使用两个布尔数组来分别记录哪行哪列出现了0,当出现0的行和列,对应的布尔数组值置为true。再次遍历数组,当出现行数组和列数组中的值为true,则对应的原数组的值置为…

Ajax-day2(图书管理)-渲染列表

本篇笔记素材来自“黑马程序员” 渲染列表图书管理一、获取数据二、渲染数据完整代码图书管理 Bootstrap 框架渲染列表(查)新增图书(增)删除图书(删)编辑图书(改) 自己的图书数据&a…

MOS管的电路

MOS管的三极都会存在以下三个电容,分别是:Cgs,Cgd,Cds 输入电容CissCgsCgd 输出电容CossCgdCds 反向传输电容CrssCgd,也叫米勒电容 然而,这三个等效电容是构成串并联组合关系,他们并不是独立的,而是相互…

STM32_05_时钟树

时钟 d用来输入数据,CLK就是我们的时钟,CPU1s中72000000HZ个时钟周期STM32的时钟树锁相环HSE时钟源HSI时钟源LSE时钟源LSI时钟源SystemInit函数SetSysClock函数SetSysClockTo72函数SystemInit()后时钟频率大小总结RCC标准库函数定义变量a&…

C语言---判断语句

文章目录1. if 语句2. if...else 语句3. if...else if...else 语句4. switch 语句5. 三元运算符 ( ? : )总结与对比如何选择C语言中的判断语句用于根据给定的条件来决定执行哪一段代码。其核心是条件为真(必须)则执行一段代码,条件为假&…

[硬件电路-212]:电流的本质确实是电子的移动

1. 微观机制:电子的定向漂移与热运动定向漂移(Drift Motion):在导体(如金属)中,自由电子(价电子)受电场驱动,从负端向正端定向移动,形成宏观电流。…

双RFSOC47DR-16通道5GSPS ADC采集模块

16通道5GSPS ADC采集板卡组成如图1所示。该板卡的输入接口为SMA单端输入,ADC采集和处理采用Xilinx公司的XCZU47DR-2FFVE1156I芯片。板卡需配备4路QSFP28光口输出,并需要集成网口、DDR4、SD卡、USB调试口。两块RF-Soc需确保连接通信功能。板卡的16通道需实…

pytest -- 中文文档

前言 零基础1小时快速入门pytest自动化测试教程,全套项目框架实战pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行 非test文件 pytest里面有些文件是非test文件 pyt…

硬件开发2-ARM裸机开发3-IMX6ULL - 引入中断

一、铺垫引入中断 → 按键1、概要:实现按键控制发光二极管和蜂鸣器输入类型的外设:按键(key)2、参考手册内容完成配置过程(1)key 按键原理图(2)core 内核中命名 -- UART1 CTS&#x…

Ansible的 Playbook 模式详解

目录一、Playbook模式1.1 Playbook 的优势1.2 Playbook 的组成1.3 安装 httpd 服务案例1.4 Playbook 命令及常用参数1.5 Playbook 的语法 —— 权限相关1. remote_user2. become3. become_method1.6 Playbook 的通知与触发机制1. notify2. handlers3. 使用示例4. 使用场景1.6 P…

猿辅导Java后台开发面试题及参考答案

int 与 Integer 的区别是什么?若创建数量庞大的数字时使用 Integer,会对重复数字创建新对象吗?int 是 Java 中的基本数据类型,直接存储数值,占用 4 个字节,默认值为 0,不需要通过 new 关键字创建…

代码随想录学习摘抄day9(回溯1-11)

一个朴实无华的目录定义:回溯法也可以叫做回溯搜索法,它是一种搜索的方式。应用场景:回溯法解决的问题都可以抽象为树形结构代码模板题型第77题. 组合思路:每次从集合中选取元素,可选择的范围随着选择的进行而收缩&…

Altium Designer(AD24)打开工程文件的几种方法

🏡《专栏目录》 目录 1,概述 2,源文件 2,菜单栏 4,工具栏 5,注意事项 1,概述 本文介绍几种打开工程文件的方法。 2,源文件 找到工程的源文件存储路径,找到.PrjPcb的源工程文件,双击打开。 2,菜单栏 第1步:执行File→Open, 第2步:找到工程文件的存储路径,并选中…

Linux嵌入式自学笔记(基于野火EBF6ULL):2.点灯与ubuntu安装

一、点灯登录root:账号:root ; 密码:root点灯命令:echo 0 > /sys/class/leds/red/brightness #关闭red灯 echo 0 > /sys/class/leds/blue/brightness #关闭blue灯 echo 0 > /sys/class/leds/green/brightness …

【Java实战㊷】Java实战:MyBatis-Plus 开启MySQL数据库高效操作之旅

目录 一、MyBatis-Plus 环境集成 1.1 项目依赖引入 1.2 数据库配置 1.3 代码生成器使用 二、核心 CRUD 操作实现 2.1 基础查询 2.2 数据新增与修改 2.3 复杂查询场景 三、性能优化与高级特性 3.1 缓存配置 3.2 乐观锁实现 3.3 字段自动填充 四、实战案例:用户管理模块开发 4.1…

开学季干货——知识梳理与经验分享

技术文章大纲:开学季干货——知识梳理与经验分享目标受众分析明确文章面向的学生群体(如大学生、高中生) 分析不同群体的核心需求(课程准备、时间管理、工具使用) 结合技术场景(如数字笔记、在线协作&#…

Linux《线程(上)》

通过之前的学习我们已经了解了操作系统当中的基本的概念包括进程、基础IO、磁盘文件存储等,但是到目前为止我们还未了解到线程相关的概念,这就使得当前我们对操作系统的认知还不是完整的,现在我们是还是无法理解一个进程当中是如何同时的执行…

为什么知识复用时缺乏场景化指导影响实用性

知识复用时因缺乏场景化指导而严重影响实用性,其根本原因在于知识的价值本质上根植于其应用情境。脱离了场景的“纯知识”往往是抽象、片面且难以行动的。这导致了认知鸿沟的产生、隐性知识的流失、决策风险的增加、以及学习迁移效率的低下。当使用者面对一份缺乏“…

拥抱直觉与创造力:走进VibeCoding的新世界

引言 在传统观念里,编程是一项高度理性、逻辑严密的活动,开发者需要像建筑师一样,用代码一行行地精确构建数字世界。然而,随着人工智能技术的飞速发展,一种全新的编程理念和体验正在兴起——它就是 VibeCoding&#xf…

HTTP的Web服务测试在Python中的实现

在Web开发领域,对HTTP Web服务进行测试是确保服务稳定性和可靠性的关键步骤。Python作为一种功能强大的编程语言,提供了多种工具和库来简化这一过程。本文将介绍如何在Python中实现HTTP的Web服务测试。首先,Python的requests库是测试HTTP Web…