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,一经查实,立即删除!

相关文章

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

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

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

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

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&…

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

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

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

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

【计网】从零开始学习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;

单例模式和读者写者问题

文章目录 10. 线程安全的单例模式10.1 什么是设计模式10.2 什么是单例模式10.3 单例模式的特点10.4 饿汉方式和懒汉方式10.5 单例模式的线程池 11. STL和智能指针的线程安全 问题11.1 STL中的容器是否是线程安全的?11.2 智能指针是否是线程安全的? 12. 其他常见的各种锁13. 读…

009——二叉树

目录 二叉树的五种基本形态&#xff1a; 1.二叉树可以是空树 2.只有一个根节点的树 3.斜树&#xff1a;只有左子树或右子树的树 4.左右孩子都有的树 二叉树的性质&#xff1a; 1.假设根节点是第一层&#xff0c;在二叉树的第i层上最多有2^(n-1)个结点 2.深度为k的二叉树…

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址&#xff1a;GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了&#xff0c;可以参考其他…

基于SSM的旅游网站【附源码】

基于SSM的旅游网站&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 用户管理 5.1.2 …

【进阶】面向对象之权限修饰符代码块

文章目录 权限修饰符权限修饰符的使用规则 代码块分类局部代码块(了解就行)构造代码块(了解就行)静态代码块(重点) 权限修饰符 权限修饰符的使用规则 成员变量私有方法公开 特例&#xff1a; 如果方法中的代码是抽取其他方法中共性代码&#xff0c;这个方法一般也私有. 代码…

如何“半路出家”转行算法工程师的?

01 关于择业考虑 算法岗是什么&#xff1f; 算法岗&#xff0c;从根本内容上来说&#xff0c;是算法&#xff0c;算力&#xff0c;数据&#xff0c;应用场景的交集。从工作要求的角度来讲&#xff0c;是你的能力能够匹配大厂需要的工作要求。从个人角度来说&#xff0c;是你…

hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…

初级网络工程师之从入门到入狱(五)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、链路聚合1.1、手动进行链路聚合1.1.1、 拓扑图&#xff1a;1.1.2、 LSW11.1.3、 LSW2 1.2、…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…

SpringMVC源码-处理器适配器HandlerAdapter

因为定义controller的方式有三种&#xff0c;每种不同的方式调用的方法不同&#xff0c;尤其是注解修饰的 方法名是自定义的 因此需要通过适配器模式来调用方法执行 initStrategies进行适配器的初始化 处理器适配器一共有如下四种: org.springframework.web.servlet.Handl…

数据结构与算法——Java实现 32.堆

人的想法和感受是会随着时间的认知改变而改变&#xff0c; 原来你笃定不会变的事&#xff0c;也会在最后一刻变得释然 —— 24.10.10 堆 堆是基于二叉树实现的数据结构 大顶堆每个分支的上一个节点的权值要大于它的孩子节点 小顶堆每个分支的上一个节点的权值要小于它的孩子…