Docker理念

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.mzph.cn/bicheng/56063.shtml

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

相关文章

Go语言学习代码记录

一、demo01 package main import "fmt"//func函数外的变量叫全局变量 var g7 100 var g8 9.7 //设计者认为上面的全局变量的写法泰麻烦了,可以一次性声明 var(g10 500g11 "jackchen" )func main(){ //func定义的函数中的变量叫局部变量//1…

AI预测体彩排3采取888=3策略+和值012路或胆码测试10月11日升级新模型预测第101弹

经过100多期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,已到达90%的命中率,这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了,大…

AI核身-金融场景凭证篡改检测Baseline实践

金融领域交互式自证业务中涵盖信用成长、用户开户、商家入驻、职业认证、商户解限等多种应用场景,通常都需要用户提交一定的材料(即凭证)用于证明资产收入信息、身份信息、所有权信息、交易信息、资质信息等,而凭证的真实性一直是…

wordpress Contact Form 7插件提交留言时发生错误可能的原因

WordPress Contact Form 7 插件提交留言时发生错误可能有以下几种原因,并提供相应的解决方案: 1. 表单字段验证失败 原因: 用户输入的数据未通过表单字段的验证规则。 解决方案: – 检查表单字段的验证规则是否设置正确。 –…

leetcode 292.Nim游戏

思路:数学 这有一点博弈论的味道,但是我们依然可以用数学的角度去思考。 我们的入手点在这里: 我们是先手的前提下,一共有4个石头,但是每个人只能一次拿其中的1-3个。在一共有4个石头的情况下,我们无论拿…

selenium自动化测试之Junit

1. 常用的注解 将junit的索引添加到pom文件&#xff1a; <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…

Fortran 学习笔记001

1.输入输出及声明 1.1 Fortran程序的主要结构 程序通常以program描述来开头&#xff0c;后接定义的程序名&#xff08;可以省略&#xff0c;但建议使用并取有意义的名称&#xff0c;便于阅读&#xff09;&#xff0c;最后以end描述结尾&#xff0c;可以有三种方式&#xff1a…

基于Java实现(APP)智能停车场管理系统

移动应用开发系统设计说明书&#xff08;智能停车场管理系统&#xff09; 服务集成流程详细设计 实现功能 序号功能点1新增用户2注册用户3修改场地信息4列出场地信息5新增认证车辆6列出认证车辆7删除认证车辆8车辆进入信息录入9停车记录列表展示10出停车场信息录入 参数说明…

Pear Admin Flask Master开启步骤

由于我学的是数控技术&#xff0c;对编程是从小白自学的&#xff0c;在运行pearflask时一直没搞懂初始化数据库这一步是在哪里执行的&#xff0c;网上查了很多资料都没写&#xff0c;找了一天半的资料后终于查到了。 使用系统&#xff1a;Windows 10 Python版本&#xff1a;Py…

架构师之路-学渣到学霸历程-09

文件打包压缩命令 继续敲命令联系手感得了&#xff0c;坚持敲命令&#xff0c;使用命令行&#xff0c;让我更cool&#xff1b; 这些基础的命令要掌握&#xff0c;其实主要的就是要练手感了&#xff1b;敲吧&#xff0c;努力&#xff1b;~&#xff01; 1.gzip命令&#xff1a;…

YOLOv8实战PCB电路板缺陷检测【数据集+YOLOv8模型+源码+PyQt5界面】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对PCB电路板缺陷数据集进行训练和优化&#xff0c;该数据集包含丰富的PCB电路板缺…

【司南大模型评测工具 API评测商业大模型】

1、司南大模型评测工具&#xff08;如果是pip安装&#xff0c;也要git clone 代码文件夹&#xff09; conda create --name opencompass python3.10 pytorch torchvision pytorch-cuda -c nvidia -c pytorch -y conda activate opencompass git clone https://github.com/open…

Hessian 序列化

Hessian 序列化 Hessian 序列化是一种轻量级的二进制 RPC 序列化方式。 一、定义与特点 定义&#xff1a; Hessian 是一种用于在不同编程语言之间进行高效对象序列化和远程方法调用的二进制协议。它主要用于在分布式系统中进行数据传输和远程过程调用&#xff08;RPC&#xff…

Oracle数据库的乐观锁和悲观锁

Oracle数据库的悲观锁和乐观锁是两种数据锁定机制。 悲观锁&#xff08;Pessimistic Locking&#xff09;在数据开始读取的时候就把数据锁定住&#xff0c;其它想插入的数据要等待直到锁的释放。这种锁定数据的方式带来的是性能的降低&#xff0c;因为在多用户并发访问的时候&…

Go语言实现长连接并发框架 - 任务管理器

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们上篇博客实现了路由分组的功能&#xff0c;接下来这篇博客我们将要实现任务管理模块 接口 trait/task_mgr.go type TaskMgr interface {RouterGroupStart()StartWorker(tas…

【计网】从零开始学习http协议 ---深入理解cookie和session

我的天空里没有太阳&#xff0c; 总是黑夜&#xff0c; 但并不暗&#xff0c; 因为有东西代替了太阳。 --- 东野圭吾 --- 从零开始学习http协议 1 理解cookie1.1 什么是cookie1.2 验证cookie1.3 cookie的属性 2 理解session2.1 什么是session2.2 验证session 1 理解cooki…

刷题 链表

面试经典150题 - 链表 141. 环形链表 class Solution { public:bool hasCycle(ListNode *head) {ListNode* slow head, *fast head;while (fast ! nullptr && fast->next ! nullptr) {slow slow->next;fast fast->next->next;if (slow fast) {return…

【Linux复习】指令

文章目录 1.>2. cat3.系统命令bash和shell和kernel权限只被认证一次粘滞位引入前提知识场景解释为什么普通用户&#xff08;无w权限&#xff09;可以删除文件&#xff1f;为什么普通用户通过sudo设置文件权限为000后仍能删除文件&#xff1f; 结论 粘滞位是干什么的&#xf…

苍穹外卖P19--异常处理

以上传数据库数据重复为例&#xff0c;进行异常处理。 接口文档报错&#xff1a; 重新启动&#xff1a;

使用 Wireshark 抓取类似的 HTTP 请求包

要使用 Wireshark 抓取类似的 HTTP 请求包&#xff0c;可以按照以下步骤进行操作&#xff1a; 安装并启动 Wireshark 如果你还没有安装 Wireshark&#xff0c;可以从Wireshark 官方网站下载并安装它。 安装完成后&#xff0c;启动 Wireshark。选择网络接口 在 Wireshark 主界面…