Docker理念

news2024/11/28 2:53:27

1.为什么会出现Docker

      Docker 的出现并非偶然,而是由一系列技术发展趋势和实际需求所推动的一项技术创新。

      随着软件行业的快速发展,开发团队的规模不断扩大,成员可能分布在不同的地理位置,使用不同的操作系统和开发工具。这就导致了开发环境的多样性,使得在不同环境中保持软件的一致性运行变得极为困难。例如,一个由全球各地的开发人员组成的开源项目,不同的开发人员可能使用 Windows、Mac 或 Linux 等不同的操作系统,安装的软件版本和配置也各不相同。在这种情况下,如何确保每个人都能在相同的环境中开发和测试软件,成为了一个巨大的挑战。

      现代软件通常依赖于大量的第三方库和框架,这些依赖关系可能非常复杂。在传统的开发和部署方式中,管理这些依赖关系往往需要花费大量的时间和精力,而且容易出现版本冲突等问题。

     传统的虚拟化技术,如vmware,虽然可以提供一定程度的隔离和资源管理,但也存在一些局限性。虚拟机通常比较笨重,启动和停止速度较慢,而且需要占用大量的系统资源。轻量化部署的需求激发着人们必须来一场时代的革新。

     Docker 的出现是为了解决软件开发和部署过程中面临的一系列问题,如环境一致性、可移植性、资源利用效率、微服务架构支持和持续集成与持续交付等。它通过容器化技术,为软件开发和运维带来了更高的效率、灵活性和可靠性。

2.Docker理念

2.1 设计目标

Docker是基于Go语言实现的云开源项目

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到一次镜像,处处运行。

2.2 Docker核心理念

Docker 在 Linux容器技术的基础上,将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

  • Build once, Run anywhere: Docker 的核心理念之一是创建一个能够在任何环境中一致运行的容器。这意味着开发者在本地开发和测试的应用,可以无缝地部署到生产环境或其他任何环境中,包括不同的操作系统和云平台。这种可移植性极大地提高了开发效率和部署的灵活性
  • 轻量级和高性能: Docker 容器与其他虚拟化技术相比,具有更高的性能和更低的资源消耗。因为容器直接运行在宿主机上,不需要模拟整个操作系统,这使得 Docker 容器比传统的虚拟机更加轻量级
  • 隔离性和安全性: Docker 容器提供了良好的隔离性,每个容器都运行在自己的隔离环境中,互不影响。这种隔离性不仅有助于提高安全性,也使得不同应用之间的依赖不会产生冲突
  • 易于维护和扩展: Docker 提供了一套标准化的容器管理工具,使得容器的维护和扩展变得更加容易。容器的生命周期管理,包括创建、运行、停止和删除,都可以通过 Docker 提供的命令行工具或 API 进行操作
  • 持续集成和持续部署(CI/CD): Docker 容器可以轻松地集成到 CI/CD 流程中,自动化应用的构建、测试和部署过程,这有助于提高开发和部署的效率。

       

3.Docker容器与虚拟机比较

3.1 传统虚拟机技术

虚拟机(virtual machine)就是带环境安装的一种解决方案。

它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。

虚拟机的缺点:

  • 安装部署复杂,资源占用多
  • 操作步骤冗余,设置繁琐
  • 启动慢,不能实现秒级别启动,不满足现代化的开发需求

3.2 容器虚拟化技术

Linux容器(Linux Containers,缩写为 LXC),Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

3.3 对比

Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。



docker vs vm:

对比项        dockervm
资源利用率共享宿主机的操作系统内核,资源利用率高运行一个完整的操作系统,占用更多的内存和磁盘空间
性能开销运行在宿主机内核上,性能开销小通过模拟硬件来运行完整的操作系统,增加了额外的资源消耗和性能开销
隔离性有一定程度的隔离性,但由于共享同一内核,因此可能存在潜在的安全风险。较强的隔离性,每个虚拟机都有独立的操作系统,安全性更高
可移植性在不同宿主机和云环境之间迁移,实现“一次构建,随处运行”虚拟机也可以迁移,过程复杂,通常需要使用特殊的工具或服务
管理复杂性Docker 提供了一套简单的命令行工具来管理容器的生命周期,操作简单直观虚拟机管理通常涉及更复杂的工具和过程,尤其是在大规模环境中
开发和部署速度容器可以快速创建和销毁,适合持续集成和持续部署(CI/CD)流程虚拟机的创建和部署管理通常需要很长的时间
成本开销容器可以在单个物理服务器上运行更多的应用实例,从而降低硬件成本。每个虚拟机都需要分配一定的资源,运行多个可能会直接死机
兼容性容器通常需要应用兼容 Linux可以运行任何操作系统,包括 Windows、Linux 等,兼容性更好。

4.Docker带来了什么

4.1 一致性的开发环境

       在软件开发过程中,不同的开发人员可能使用不同的操作系统和软件配置,这往往会导致在集成和部署时出现各种兼容性问题。Docker 允许开发人员将应用程序及其依赖项打包到一个容器中,确保了无论在哪个开发人员的机器上,应用程序都能在相同的环境中运行,极大地提高了开发的一致性和可重复性。

      例如,一个由多个开发人员共同参与的 Java 项目,使用 Docker 可以确保每个开发人员都在相同的 Java 运行时环境和依赖库下进行开发,避免了因环境差异而导致的 “在我的机器上运行正常” 的问题

4.2 部署简化与可移植性增强

       传统的软件部署通常需要考虑操作系统版本、库的安装、配置文件的设置等众多因素,过程复杂且容易出错。Docker 则将应用程序和其所有依赖打包成一个独立的容器,使得部署变得极为简单。只需要在目标环境中安装 Docker 引擎,然后拉取容器镜像并运行即可,无需担心底层环境的差异。例如,将一个 Python Django 应用部署到生产服务器上,只需在服务器上安装 Docker,然后拉取包含 Django 应用及其依赖的镜像,运行容器,就可以完成部署,大大降低了部署的难度和出错的可能性。

      Docker 容器可以在任何支持 Docker 的环境中运行,无论是物理服务器、虚拟机还是云平台。这使得应用程序的迁移变得非常容易,无需对应用程序进行任何修改,就可以在不同的环境中部署和运行。假设一个企业需要将应用程序从本地数据中心迁移到公有云平台,使用 Docker 可以轻松实现无缝迁移,大大提高了企业的灵活性和应对变化的能力

4.3 资源高效利用

      与传统的虚拟机相比,Docker 容器更加轻量级。容器与宿主机共享操作系统内核,不需要为每个容器单独运行一个完整的操作系统,因此占用的资源更少。这使得在同一台服务器上可以运行更多的容器,提高了服务器资源的利用率。例如,在一台服务器上,如果使用虚拟机可能只能运行几十个实例,而使用 Docker 容器可以运行几百个甚至更多的应用程序实例,大大降低了硬件成本

     Docker 容器的启动和停止速度非常快,通常只需要几秒钟甚至更短的时间。这使得应用程序的扩展和收缩变得更加容易,可以根据实际的负载需求快速调整资源分配。比如在电商大促期间,可以快速启动更多的容器来应对高流量,活动结束后又可以迅速停止多余的容器,释放资源。

4.4 微服务架构支持

     在微服务架构中,每个微服务都可以独立开发、部署和扩展。Docker 为每个微服务提供了一个独立的运行环境,使得微服务之间的隔离性更好,更容易进行管理和维护。例如,一个大型电商平台可以将其拆分为多个微服务,如商品服务、订单服务、用户服务等,每个微服务都可以用 Docker 容器进行部署,独立进行版本控制和升级,互不影响。

      Docker 与一些容器编排工具(如 Kubernetes)结合使用,可以方便地实现服务发现和负载均衡。容器可以自动注册到服务发现系统中,其他服务可以通过服务发现系统找到并调用这些服务,同时可以根据负载情况自动调整容器的数量,提高系统的可靠性和性能。比如在一个微服务架构的应用中,当某个服务的负载过高时,可以自动启动更多的该服务的容器来分担负载,实现动态的负载均衡。

5.最后

感谢大家,请大家多多支持!

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

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

相关文章

CSD(computational storage devices)架构介绍

CSD(computational storage devices)架构介绍 前言一、CSD与传统SSD的架构对比二、为什么要采用FPGA三、FPGA缺点四、个人总结reference 前言 虽然一直有接触CSD,但一直对其原理和架构知之甚少,半知不解。今天,趁着我还…

element-ui点击文字查看图片预览功能

今天做一个点击文字查看图片的功能&#xff0c;大体页面长这样子&#xff0c;点击查看显示对应的图片 引入el-image-viewer&#xff0c;点击的文字时候设置图片预览组件显示并传入图片的地址 关键代码 <el-link v-if"scope.row.fileList.length > 0" type&…

模型预测控制工具包——ACADO:简介、安装与测试

模型预测控制工具包——ACADO&#xff1a;简介、安装与测试 ACADO 工具包简介ubuntu20.04 安装 ACADO工具包安装依赖安装ACADOtoolkit 测试 ACADO 工具包简介 ACADO Toolkit 是一个用 C 编写的用于自动控制和动态优化的软件环境和算法集合。 它提供了一个通用框架&#xff0c;…

三菱FX3UPLC定位控制程序举例

测试程序的编写 1.输入输出的分配输入输出的分配如下表所示。 2、相关软元件的设定 相关软元件也有所不同。更改定位指令的脉冲输出端时&#xff0c;根因设定为定位指令的脉冲输出端的软元件不同&#xff0c;据更改的内容&#xff0c;需要变更设定的相关软元件。 3.程…

【大模型新书】掌握大语言模型:高级技术、应用、尖端方法和顶尖LLMs

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/93e5a5c008474f72a0335083ef9c4893.png)我已将 这本大模型书籍免费分享 出来&#xff0c;需要的小伙伴可以扫取。 主要特性 探索自然语言处理&#xff08;NLP&#xff09;基础和大语言模型基本原理&#xff0c;包括…

若依前端后打成一个JAR包部署

客户需要将项目前后端作为一个整体打包成jar&#xff0c;不使用nginx方式转发。使用框架是若依前后端分离&#xff0c;后端springboot&#xff0c;前端vue&#xff0c;目的就是把vue打入jar。 一、前端修改 ruoyi-ui/src/router/index.js文件 &#xff0c;将 mode: ‘history’…

一键生成二维码的源码系统 电脑+手机版自适应代码 带完整的安装代码包以及搭建部署教程

系统概述 一键生成二维码的源码系统是一款集二维码生成、管理和应用于一体的综合性平台。它采用先进的技术和算法&#xff0c;能够快速、准确地生成各种类型的二维码&#xff0c;包括文本、链接、图片等。同时&#xff0c;该系统还具备高度的灵活性和可扩展性&#xff0c;能够…

如何使用bpmn-js实现可视化流程管理

介绍 BPMN-JS是一个流行的开源库&#xff0c;用于在Web应用程序中可视化、创建、编辑和分析BPMN&#xff08;Business Process Model and Notation&#xff0c;业务流程建模与表示法&#xff09;2.0 图。BPMN是一种国际标准的图形化语言&#xff0c;用于描述企业中的业务流程&a…

mongodb 连接, 去重,索引

mongodb 去重,索引 MongoDB Community Server 下载: https://www.mongodb.com/try/download/community GUI: The Ultimate Client, IDE and GUI for MongoDB | Studio 3T 连接 设置允许远程(局域网)连接 (windows) 在打开文件 "<你的安装目录>\MongoDB\Server\…

k3s安装指定版本以及离线安装(docker)

首先下载你所需要版本的k3s安装包&#xff0c;目录结构如下所示&#xff0c;我这里是v1.19.15k3s2。 1.首先赋予可执行权限后进行安装。 # k3s 需要赋予可执行权限 sudo chmod x k3s sudo chmod x k3s-install.sh2.然后将k3s的二进制文件复制到/usr/local/bin/ cp k3s /us…

✨机器学习笔记(七)—— 交叉验证、偏差和方差、学习曲线、数据增强、迁移学习、精确率和召回率

机器学习笔记&#xff08;七&#xff09; 1️⃣评估模型&#x1f397;️使用测试集评估模型&#x1f397;️交叉验证集&#xff08;cross validation&#xff09; 2️⃣偏差和方差&#xff08;Bias / Variance&#xff09;3️⃣学习曲线&#xff08;Learning curves&#xff09…

自动化分析背后,一站式数据分析平台!

自动化分析背后&#xff0c;一站式数据分析平台&#xff01; 前言一站式数据分析平台 前言 在如今的企业管理中&#xff0c;数据已经不再是简单的存储和备份&#xff0c;而是成为了决策的核心驱动力。尤其是在面对海量数据的情况下&#xff0c;企业急需一个能够高效处理、分析…

学习笔记之指针进阶(10.11)

a[0]就相当于数组名arr&#xff0c;a[0]1就相当于arr1&#xff0c;arr1是数组中下一个元素的地址&#xff0c;所以a[0]1就是数组中下一个元素的地址&#xff0c;&#xff08;把二维数组中的每一个数组看作一个元素&#xff09; 以上解释是错误的&#xff0c;a[0]不是整个数组的…

Leetcode——数组:移除元素—27.移除元素

知识点 双指针&#xff0c;在设置时&#xff0c;设置两个指针&#xff0c;一个用来寻找目标值&#xff0c;一个用来表示新数组的下标。 当找到不是目标值的元素时&#xff0c;将其添加到新数组中&#xff0c;如果是目标值&#xff0c;直接掠过 寻找目标值的指针会遍历整个数…

从commit校验失效问题探究husky原理

一、背景 之前创建的项目&#xff0c;发现代码 commit 提交的时候没有了任何校验&#xff0c;具体表现&#xff1a; 一是 feat fix 等主题格式校验没有了二是代码 lint 不通过也能提交 尝试解决这个问题&#xff0c;并深入了解husky的实现原理&#xff0c;将相关的一些知识点…

Excalidraw:在线手绘风格白板、图表绘制工具

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Excalidraw 是一个开源的虚拟白板&#xff0c;用于绘制手绘风格的图表、线框图等。它支持多人实时协作&#xff0c;并使用端到端加密&#xff0c;确保…

钢铁行业3大改造方向 智能仪器亦起到重要作用!

钢铁企业新的改造方向主要包括超低排放改造、能效改造和数字化转型。‌这些政策旨在提升钢铁行业的环保水平、能效和智能化水平。其中智能仪器的加入&#xff0c;为钢铁企业数字化智能化自动化改造带来新的活力。 具体来说&#xff0c;到2027年&#xff0c;钢铁行业将实现以下目…

《Linux从小白到高手》综合应用篇:详解Linux系统调优之深入理解Huge Pages和Transparent Huge Pages

本篇深入介绍Linux Huge Pages和Transparent Huge Pages. 我在前一篇博文&#xff08;《Linux从小白到高手》综合应用篇&#xff1a;详解Linux系统调优之内存优化&#xff09;中说过&#xff0c;很多人可能对大页内存&#xff08;Huge Pages&#xff09;和透明大页&#xff08;…

[spring]spring事务和事务传播机制

文章目录 一. 事务Spring中的事务实现编程式事务声明式事务TransactionalTransactional作用 Transactional详解1. rollbackFor2. 事务隔离级别mysql事务隔离级别Spring事务隔离级别 3. 事务传播机制什么是事务传播机制事务传播机制有哪些Spring事务传播机制使用REQUIRED(加入事…

【翻译】自定义 Qt Designer 窗体

原文地址&#xff1a;Customizing Qt Widgets Designer Forms 【翻译】Qt Designer 最新中文手册文档&#xff08;Qt6&#xff09; Qt Designer设计窗体保存为一个UI文件时&#xff0c;一些窗体设定参数&#xff0c;比如栅格、默认布局的边距&#xff08;margin&#xff09;和间…