微服务【Docker容器解决项目部署问题&Docker和虚拟机的区别&系统结构】第5章

简介: 本篇主要是:Docker解决项目的部署问题,比如:依赖兼容问题,跨系统环境问题。以及介绍了Docker和虚拟机之间的区别对比

1,什么是Docker

1.1:项目部署的问题

大型项目组件较多,运行环境也较为复杂,就像一个项目前端需要用到node.js组件,后端需要用到数据库,缓存技术redis,异步技术MQ等等!!同时也会在部署的时候碰到一些问题:

1:依赖关系复杂,容易出现兼容性问题(就像下图中的这些node,Redis这些技术应用等等!将来都会部署到服务器中,而大多数服务器都会采用LInux操作系统,而这些技术应用在安装到Linux操作系统之前需要做一些准备工作。每个应用都有自己需要的依赖和函数库,而每个应用的依赖和函数库又有可能存在一定的差异性,例如版本问题,一个项目涉及很多的应用都有自己的版本难免会发生冲突,这样就会非常容易出现兼容性问题。)

2:开发,测试,生产环境有差异(这个就是说:部署的兼容性解决了你部署的成功了运行环境搞定了,但是开发环境,生产环境,预发布环境还需要等着你去搞定,更麻烦的是这些操作环境它们的操作系统还有可能不同,你在一个Windows系统中把开发环境配置好了,换到另外一个操作系统中还能正常运行吗?所以存在环境差异的问题)

image.gif编辑

1.2:Docker如何解决依赖的兼容问题的?

    • 将应用的Libs(函数库),Deps(依赖)配置与应用一起打包。(假如数据库应用需要部署,Docker技术直接把该应用所需要的函数库和依赖的一些配置和应用一起打包然后放入一个该应用的独立容器,每个应用都这样打包放入,到时候部署时候不就避免了依赖冲突等等嘛!)
    • 将每个应用放到一个隔离容器去运行,避免互相干扰(可能有人存在这样的问题,把这些打包好的包扔到一个服务器上面难道不会有干扰吗?不会,因为Docker会用隔离的容器进行运行,已经一种沙箱技术什么意思呢!就是这些容器都不见,这样不就避免了干扰了嘛!)

    image.gif编辑

    但是仅限于同一个操作系统中

    1.3:Docker解决跨系统环境差异

    1.3.1:以Ubuntu为例操作系统结构(结构如下):

    image.gif编辑

    结构包括:

      • 计算机硬件:例如CPU、内存、磁盘等
      • 系统内核:所有Linux发行版的内核都是Linux,例如CentOS、Ubuntu、Fedora等。内核可以与计算机硬件交互,对外提供内核指令,用于操作计算机硬件。
      • 系统应用:操作系统本身提供的应用、函数库。这些函数库是对内核指令的封装,使用更加方便。  

      其实所有的以Linux内核的操作系统都可以分为两层,一层是Linux内核,一层就是系统应用,区别就是上层的系统应用不同。

      举个例子:Ubuntu和CentOSpringBoot都是基于Linux内核,无非是系统应用不同,提供的函数库有差异:image.gif编辑

      此时,如果将一个Ubuntu版本的MySQL应用安装到CentOS系统中去,MySQL在调用Ubuntu函数库时,会发现在CentOS系统中找不到函数库或者函数库找不到,就会报错了:  

      image.gif编辑

      Docker如何解决不同系统环境的问题?

        • 既然每个应用都依赖系统函数库,Docker说了那我直接把系统函数库一起打包,这样就不愁找不到函数库了
        • Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行

        如图: image.gif编辑

        1.3.2:内核是干什么用的?

        内核负责与计算机硬件进行交互,比方说调用个cpu,调用内存什么,查看个软件进程等等这些都是内核需要做的事情,而内核会把这些事情变成一个个的指令,调用指令进行操作计算机硬件,但是这些指令大多数比较简陋,如果基于这些指令开发应用太麻烦了。所以我们就有了系统,

        1.3.3:系统应用它又干了什么呢?

        它会将内核的指令进行封装形成函数,许许多多的函数形成了函数库,像咱们程序员可以基于函数库进行开发,程序调用我们的函数库,函数库调用内核的指令,指令调用计算机硬件从而实现应用的执行,这就是Linux系统的结构以及应用的组成原理

        1.4:小结

        Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

          • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
          • Docker应用运行在容器中,使用沙箱机制,相互隔离

          Docker如何解决开发、测试、生产环境有差异的问题?

            • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

            Docker是一个快速交付应用、运行应用的技术,具备下列优势:

              • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
              • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
              • 启动、移除都可以通过一行命令完成,方便快捷

              2,Docker和虚拟机的区别

              Docker可以让一个应用在任何操作系统中非常方便的运行。而以前我们接触的虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。

              2.1:两者有什么差异呢?

              虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。

              Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:

              image.gif编辑

              对比来看:

              image.gif编辑

              2.2:小结:

              Docker和虚拟机的差异:

                • docker是一个系统进程;虚拟机是在操作系统中的操作系统
                • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
                相关文章
                |
                12月前
                |
                应用服务中间件 Linux nginx
                在虚拟机Docker环境下部署Nginx的步骤。
                以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
                544 5
                |
                人工智能 搜索推荐 前端开发
                从代码到心灵对话:我的CodeBuddy升级体验之旅(个性化推荐微服务系统)
                本文分享了使用CodeBuddy最新版本的深度体验,重点探讨了Craft智能体、MCP协议和DeepSeek V3三大功能。Craft实现从对话到代码的无缝转化,大幅提升开发效率;MCP协议打通全流程开发,促进团队协作;DeepSeek V3则将代码补全提升至新境界,显著减少Bug并优化跨语言开发。这些功能共同塑造了AI与程序员共生的未来模式,让编程更高效、自然。
                1302 15
                |
                存储 Java 编译器
                深入理解Java虚拟机--类文件结构
                本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
                433 0
                |
                JSON Java 数据格式
                微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
                本文介绍了在Spring Boot项目中如何通过创建`GlobalExceptionHandler`类来全局处理系统异常。通过使用`@ControllerAdvice`注解,可以拦截项目中的各种异常,并结合`@ExceptionHandler`注解针对特定异常(如参数缺失、空指针等)进行定制化处理。文中详细展示了处理参数缺失异常和空指针异常的示例代码,并说明了通过拦截`Exception`父类实现统一异常处理的方法。虽然拦截`Exception`可一劳永逸,但为便于问题排查,建议优先处理常见异常,最后再兜底处理未知异常,确保返回给调用方的信息友好且明确。
                1665 0
                微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
                |
                监控 Cloud Native Java
                基于阿里云容器服务(ACK)的微服务架构设计与实践
                本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
                |
                监控 Kubernetes Cloud Native
                基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
                本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
                |
                关系型数据库 MySQL Docker
                《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
                《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
                1166 24
                |
                运维 Java 虚拟化
                《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
                《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
                702 12
                |
                Kubernetes Linux 虚拟化
                入门级容器技术解析:Docker和K8s的区别与关系
                本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
                4918 11