Docker 是什么? Docker 基本观念介绍与容器和虚拟机的比较

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea


Docker 是什么?

Docker 是一种开源软件平台,它的构想理念是「Build and Ship any Application Anywhere」,意即让开发者在虚拟环境中,开发、部署和管理任的何应用程序。 Docker 的轻量化特性,提供应用程序独立的测试环境。 让用户只需专注于应用程序的开发,为他们省下建置环境的时间与精力。

docker logo

为什么要使用 Docker

(一)在主机上快速部署

由于 Docker 容器具有跨平台便携性,并且共享操作系统中的资源,它相较虚拟机更为轻量。 在相同资源下,能执行容器数大约是虚拟机的5到10倍,能够提高开发者的工作效率并节省资金。

此外,使用EDB提供的PostgreSQL Docker image,您可以快速地在开发、测试和生产环境中部署PostgreSQL数据库,而不需要担心环境配置和兼容性问题。 EDB 的 PostgreSQL Docker image 也针对 Docker 环境进行了优化,可以提供更高的性能和可靠性。

(二)版本控管和对象重复使用

Docker 让用户能够储存不同的版本的历史纪录,用户能够依照自己的喜好回滚(Roll Back)至最合适的版本。 开发人员只需将环境设定好,就能使用先前保存好的容器,达到重复使用的目的。

此外,使用 HashiCorp Vault 可以安全地管理 Docker image 中的 secrets 和配置信息。 Vault 可以将这些敏感信息加密存储,并提供安全的访问控制,确保只有授权的用户和应用程序才能访问这些信息,避免 secrets 泄露的风险,同时也能方便地重复使用这些安全的映像文件(Image)。

(三)更有效率的 CI/CD 流程

Docker 帮助开发人员在任何环境下测试代码,协助他们在应用程序开发初期就能找出错误。 利用 Docker 易与其他工具整合的优势,开发人员能将 GitHub 和 Jenkins 整合至 Docker 中。 只需将代码交付至 Github,再由 Jenkins 进行自动化布署,就能够快速地建立映像文件(Image)。 开发者还能将映像文件上传至 Docker Hub 来解决不同版本间环境不兼容的问题。 Docker 能够简化开发部署流程、减少环境建置的时间,以及让开发人员同时执行多个测试。

此外,在CI/CD流程中,可以使用ELK Stack来收集和分析Docker容器的日志和事件,例如建置日志、测试结果、部署状态等。 这些信息可以帮助开发人员快速识别和解决问题,并追踪应用程序的交付过程。 ELK Stack 的 dashboards 和可视化功能可以提供 CI/CD 流程的清晰概览,帮助团队更好地监控和管理整个流程。

Docker 结合 CI/CD 流程进行自动测试与部署

开发人员让 Docker 融入 CI 流程的一种方式是,开发者在建立完应用程序后,通过 CI 服务器建立 Docker 映像文件(Image),再将应用装入映像文件,最后再上传到 Docker Hub。 开发者能够在另一台主机上,不论是在QA、DEV或正式环境,从Docker Hub上接入映像文件并运行容器,在CI服务器中,开发者甚至能在创建映像文件的过程中,完成编辑和测试。

虚拟化技术是什么?

在认识 Docker 前,我们必须先了解何谓虚拟化? 简而言之,虚拟化技术想解决的核心问题是,不同电脑的操作系统与硬件资源配置不兼容。 举例来说,今天我开发了一款应用程序,经测试后,它能够在我的地端环境中正常运行,但如果我想将它安装至其他环境或部署至云端。 我就必须建置相同的环境,和配置相同硬件资源,例如:服务器、CPU、数据库、扩充程序等等。

然而,这种「例行公事」往往需要耗费大量时间,而且没人能保证你的程序在新环境中能够正常运作。 因为不同环境使用的操作系统不尽相同,即便同样使用 Linux,不同版本间也存在着些微的差异。 而虚拟技术的问世就是为了解决这种「明明在我的环境中能运作,但搬到其他地方就坏掉」的问题。

目前常见的虚拟技术有两种,一种是以处理操作系统为单位的虚拟化技术,我们将它称之为虚拟机(Virtual Machine),著名的代表有 VMware; 另一种是以 APP 为单位的虚拟化技术,我们将它称为容器化(Containerize),著名的代表有 Docker Container。 下文将为各位分别介绍这两种技术

虚拟机(VM)

VM 是一种体积庞大且耗能高的软件套件。 VM 会模拟底层的主机资源(CPU、RAM、Storage),将资源分配给上层的应用程序使用。 在 VM 的架构中有一层名为 Hypervisor 的平台。 这种平台被用于管理硬件资源的使用和分配。 简单来说,Hypervisor 让用户能够在操作系统上(Host OS)增加另一个操作系统(Guest OS),并且让这两种操作系统相互协作。 每个 VM 包含操作系统、应用程序、必要的二进制文件和系统库的完整副本-容量大约为 10 GB,因此 VM 启动的时间会较为缓慢。

container-vm-whatcontainer

容器化(Containerize)

容器化是一种在概念上相似于虚拟机,但在原理上略有不同的技术,其主要目的在于提供开发者用于测试应用程序的沙盒环境。 开发者将想测试的应用程序与 Dependency(相依性资源)封装于容器进行测试。 容器化与 VM 的相异之处在于,由于容器不会模拟系统底层的基础架构,因此需耗费的资源也相对较低。 开发者能够在容器内配置不同的资源,因为每个容器都独立运行且彼此之间不会互相影响。

译注: Dependency(相依性资源): Dependency (相依性资源)在这边泛指 system libraries(系统函式库)、External Third-Party Code Package(第三方代码套件)。

docker-containerized-appliction-blue-border_2 (Demo)

容器(Container)VS 虛擬機(VM)

雖然容器和虛擬機具有類似的功能及優勢,但其實它們被用於處理不同面向的問題,VM 的主要功能是作業系統的虛擬化,容器主要的功能是虛擬化操作系統,因此容器相較於 VM 更容易攜帶,也更高效。

以下表格為容器與虛擬機的對比

功能Virtual MachineDocker Container
虛擬化的目標作業系統應用系統
啟動時間久(幾分鐘)短(幾秒)
容量GBMB
耗費資源較多較少
複製相同環境
服務內容大型專案服務多使用於微服務中

组成 Docker 的重要元素

在了解虚拟技术的基本观念后,我们将在这段剖析构成Docker的重要元素,让大家对Docker元素间的工作流程有更全面的了解。

Dockerfile

开发人员在使用 Docker 时发现,大多现成的 Docker 映像文件无法满足他们的需求,因此需要一种能够生成映像档的工具。 Dockerfile 是一种简易的文件文件,里面包含了建立新映像文件所需的指令。

Dockerfile 语法主要由 Command(命令)和 Argument (参数选择)两大元素组成。 以下是一个简易的 Docker file 示意图:

命令式语法+选择参数(Command + Argument)

dockerfile

以这张图来说 From 是命令式,而 nginx 是选择参数

Image (映像文件)

Docker 映像文件是创建容器的模板,我们能将它想象为一种虚拟机快照(snapshot),映像文件包含了开发者需要部署的应用程序、操作系统和编译环境。 开发者能透过映像文件建置不同的容器,在容器中,每个应用程序都是独立运行的,彼此互不影响。

image

Container (容器)

容器是映像文件建立出来的实例(Instance),我们能将它比喻为一个轻量级的沙盒,Docker 利用容器运行和隔离应用程序,能够在容器中将应用程序启动、开始、停止、删除。 由于映像文件是唯读(Read Only)的模板,因此容器在运行后映像文件的上层会增加一个能够修改的读写层(Read and Write),而映像档本身则不变。

docker-inside-container

Repository(仓库)

Repository 是储存映像档的地方,用户可以将自己完成的映像文件上传至仓库上储存,仓库上也有许多现成的映像文件供用户存取,仓储的种类被分为公开与私人两种,目前官方最大的公开仓库是 Docker Hub。 在上面储存了超过 15,000 个映像文件供用户下载。

docker-flow

Docker 的运作流程

步骤一、撰写 Dockerfile,步骤二、将 Dockerfile 建立为 Image,步骤三、将 Image 运行为容器。 透过这三个简单的步骤,就能创建自己的 Docker 容器啰!

创建运行 Docekr

 

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

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

相关文章

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构:List、Set和Queue。本文将详细阐述这些数据类型的各自实现,并按照线程安全性进行分类,分别介绍非线程安全与线程安全的实现方…

人工智能知识分享第二天-机器学习之KNN算法

KNN算法 KNN算法简介 KNN算法思想 K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别 KNN算法思想:如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别&#xff…

b站ip属地评论和主页不一样怎么回事

在浏览B站时,细心的用户可能会发现一个有趣的现象:某些用户的评论IP属地与主页显示的IP属地并不一致。这种差异引发了用户的好奇和猜测,究竟是什么原因导致了这种情况的发生呢?本文将对此进行深入解析,帮助大家揭开这一…

Robyn+Vue3+wangEditor打造个人笔记

Github:https://github.com/gwt805/MYNotes Gitee: https://gitee.com/gwt805/MYNotes GitCode: https://gitcode.com/gwt805/MYNotes/overview

BGP路由反射器,解决路由黑洞问题

路由反射器解决路由黑洞问题 路由反射器解决路由黑洞问题 路由黑洞的产生路由黑洞的解决办法路由反射器解决黑洞问题基本配置配置反射器前查看路由配置路由反射器配置反射器后查看路由路由黑洞的产生 根据BGP建立邻居的规则,只要TCP可达便可建立邻居系。如下图所示: AR2、AR…

JavaFX FXML模式下的布局

常见布局方式概述 在 JavaFX FXML 模式下,有多种布局方式可供选择。这些布局方式可以帮助您有效地组织和排列 UI 组件,以创建出美观且功能良好的用户界面。常用布局容器及布局方式 BorderPane 布局 特点:BorderPane 将空间划分为五个区域&…

二叉树的深搜_求根节点到叶节点数字之和_验证二叉搜索树_二叉树的所有路径

2331. 计算布尔二叉树的值 二叉树遍历可以用递归来解决,该问题的简单子问题是 知道左右孩子的值,再根据| &返回true/false。左子树右子树的值交给dfs解决。 终止条件就是到达叶子节点,即没有左右孩子,因为是完全二叉树 所以只需要判断一个…

Jupyter占用内存高问题排查解决

前言 前段时间我们上线了实例内存预警功能,方便大家更好地管理服务器内存资源。那么,也有同学会问,如果收到系统通知,我该怎么做呢?系统提示交换内存占用过高,但是又不知道是哪些程序占用的,怎么…

python下载,安装,环境配置

下载地址:Python Windows版本下载| Python中文网 官网 选择路径 安装完成 检测安装是否成功 使用 winr 启动运行对话框,输入 cmd 进入命令行。 输入pip list 输入 where python 查看 python.exe 的路径 环境配置 winr 打开运行对话框,输入 …

抓取手机HCI日志

荣耀手机 1、打开开发者模式 2、开启HCI、ADB调试 3、开启AP LOG 拨号界面输入*##2846579##* 4、蓝牙配对 5、抓取log adb pull /data/log/bt ./

IDEA 搭建 SpringBoot 项目之配置 Maven

目录 1?配置 Maven 1.1?打开 settings.xml 文件1.2?配置本地仓库路径1.3?配置中央仓库路径1.4?配置 JDK 版本1.5?重新下载项目依赖 2?配置 idea 2.1?在启动页打开设置2.2?配置 Java Compiler2.3?配置 File Encodings2.4?配置 Maven2.5?配置 Auto Import2.6?配置 C…

算法比赛汇总

数据科学竞赛平台网站整理 | ✨DEEPAI数据分析

深入研究物理光学传播和 ZBF 文件

物理光学传播特征 Zemax 中的物理光学传播 (POP) 是一种用于模拟和分析光在光学系统中传播时的行为的工具。与假设理想化几何射线的射线追踪不同,POP 考虑了光的波动性质,包括衍射和干涉。这使得它对于设计和分析显微镜、激光器等高精度光学系统以及其他…

【Java数据结构】栈和队列

栈(Stack) 栈的概念 栈是一种特殊的线性表,只允许在一端进行插入和删除。栈遵循后进先出,分别在栈顶删除、栈底插入。 栈的常用方法 栈的一些方法,例如:出栈、入栈、取栈顶元素、是否为空、栈中元素个数等…

StarRocks元数据无法合并

一、先说结论 如果您的StarRocks版本在3.1.4及以下,并且使用了metadata_journal_skip_bad_journal_ids来跳过某个异常的journal,结果之后就出现了FE的元数据无法进行Checkpoint的现象,那么选择升级版本到3.1.4以上,就可以解决。 …

使用qrcode.vue生成当前网页的二维码(H5)

使用npm&#xff1a; npm install qrcode.vue 使用yarn&#xff1a; yarn add qrcode.vue package.json&#xff1a; 实现&#xff1a; <template><div class"code"><qrcode-vue :value"currentUrl" :size"size" render-as&…

【STM32】RTT-Studio中HAL库开发教程十:EC800M-4G模块使用

文章目录 一、简介二、模块测试三、OneNet物联网配置四、完整代码五、测试验证 一、简介 EC800M4G是一款4G模块&#xff0c;本次实验主要是进行互联网的测试&#xff0c;模块测试&#xff0c;以及如何配置ONENET设备的相关参数&#xff0c;以及使用STM32F4来测试模块的数据上报…

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…

【知识】cuda检测GPU是否支持P2P通信及一些注意事项

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 代码流程 先检查所有GPU之间是否支持P2P通信&#xff1b;然后尝试启用GPU之间的P2P通信&#xff1b;再次检查所有GPU之间是否支持P2P通信。 test.cu&…

Mysql大数据量表分页查询性能优化

一、模拟场景 1、产品表t_product,数据量500万+ 2、未做任何优化前,cout查询时间大约4秒;LIMIT offset, count 时,offset 值较大时查询时间越久。 count查询 SELECT COUNT(*) AS total FROM t_product WHERE deleted = 0 AND tenant_id = 1 分页查询 SELECT * FROM t_…