Docker 镜像解密:分层存储与镜像构建原理

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁
🦄 博客首页——猫头虎的博客🎐
🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

文章目录

  • Docker 镜像解密:分层存储与镜像构建原理
      • 摘要
      • 引言
    • 二、Docker 镜像概述
        • 2.1 Docker 镜像的基本定义
        • 2.2 Docker 镜像的作用
        • 2.3 Docker 镜像的轻量性
        • 2.4 Docker 镜像的可移植性
      • 三、分层存储原理
        • 3.1 分层存储的概念
        • 3.2 分层存储的用途
        • 3.3 分层存储节省存储空间的原理
      • 四、镜像构建流程
        • 4.1 Dockerfile 的作用
        • 4.2 编写基本的 Dockerfile
        • 4.3 利用缓存层提高构建效率
      • 五、镜像构建实例
      • 六、最佳实践和优化建议
        • 6.1 减少镜像层
        • 6.2 使用合适的基础镜像
        • 6.3 使用 .dockerignore 文件
        • 6.4 清理无用的依赖和缓存
        • 6.5 使用多阶段构建
        • 6.6 使用 Alpine 镜像
      • 七、结论
    • 八、参考文献
  • Docker专栏文章目录预告
      • 第一部分:Docker 基础知识与原理
  • 原创声明

在这里插入图片描述

Docker 镜像解密:分层存储与镜像构建原理

摘要

本文介绍了 Docker 镜像的分层存储与构建原理。首先,我们对 Docker 镜像的重要性和广泛应用进行了简要介绍,并提出了本文要解密的主题:分层存储与镜像构建原理。随后,我们深入探讨了分层存储的概念和用途,以及它如何节省存储空间。接着,我们详细描述了 Docker 镜像的构建过程,包括 Dockerfile 的作用、如何编写一个基本的 Dockerfile,以及如何利用缓存层提高构建效率。为了更好地理解镜像构建的实际操作过程,我们通过一个简单的 Web 服务器容器镜像实例逐步演示了每个构建步骤和相应的镜像层。最后,我们提供了一些最佳实践和优化建议,帮助读者在构建自己的镜像时遵循最佳方法,以提高容器化应用的性能和安全性。通过深入理解 Docker 镜像的分层存储与构建原理,读者将能够更有效地应用 Docker 技术,优化容器化应用的开发与部署流程。

引言

Docker 镜像作为容器化应用的基础组件,发挥着重要的作用。它不仅实现了应用和其依赖的打包,还提供了一个可移植、可复制的解决方案。然而,对于 Docker 镜像的构建和管理,很多人仍存在疑惑。本文旨在帮助读者深入理解 Docker 镜像的分层存储与构建原理,从而更好地掌握 Docker 技术,优化容器化应用的开发与部署。

我们将从引言开始,简要介绍 Docker 镜像的重要性和广泛应用,并引出本文要解密的主题:分层存储与镜像构建原理。随后,我们将详细解释分层存储的概念和用途,阐述它是如何实现镜像的高效共享和版本管理的。为了更好地理解镜像的构建过程,我们将介绍 Dockerfile 的作用和基本编写方法,并探讨如何利用缓存层提高构建效率。为了帮助读者更好地掌握镜像构建的实际操作,我们将通过一个简单的 Web 服务器容器镜像实例逐步演示每个构建步骤和相应的镜像层。最后,我们将提供一些最佳实践和优化建议,帮助读者在构建自己的镜像时遵循最佳方法,以提高容器化应用的性能和安全性。

在深入理解 Docker 镜像的分层存储与构建原理后,读者将能够更好地应用 Docker 技术,有效管理和部署容器化应用。本文旨在为读者提供有价值的知识和实用的指导,希望读者通过阅读本文,对 Docker 镜像技术有更全面的认识,并能够应用于实际场景中。

二、Docker 镜像概述

Docker 镜像作为容器技术的重要组成部分,在现代应用开发和部署中得到了广泛的应用。本节将详细解释 Docker 镜像的基本定义和作用,强调其轻量性、可移植性以及版本管理的重要性。

2.1 Docker 镜像的基本定义

Docker 镜像是一种用于打包应用及其依赖的独立文件系统,其中包含了运行应用所需的所有组件:代码、运行时、库文件、环境变量等。镜像是基于一层一层的文件系统构建而成的,这些层叠加在一起,形成一个完整的文件系统,用于在容器中运行应用。

2.2 Docker 镜像的作用

Docker 镜像的主要作用是实现应用的快速部署和可移植性。通过使用镜像,开发人员可以将应用及其环境打包成一个独立的单元,不受底层环境的影响,从而实现在不同平台上的一致运行。这使得开发、测试和生产环境之间的转换更加简单和可靠。

另外,Docker 镜像还支持版本管理,每个镜像都可以有多个不同的版本。这为应用的持续集成和持续部署提供了便利,使得开发团队可以追踪和管理应用的演进过程,确保不同环境中使用的都是同一个版本的镜像,避免了由于版本差异导致的问题。

2.3 Docker 镜像的轻量性

Docker 镜像采用分层存储的设计,每个镜像层都只包含了与上一层的差异部分。这种设计使得镜像在存储和传输时非常高效。当多个镜像共享相同的基础层时,它们只需要在本地存储中保存一份基础层的副本,从而节省了大量的存储空间。

由于镜像的轻量性,容器的启动时间也非常快速。镜像的分层结构使得容器的创建过程变得高效,因为只需加载少量的增量层即可,大大减少了启动时间。

2.4 Docker 镜像的可移植性

Docker 镜像的可移植性是指镜像可以在任意支持 Docker 的平台上运行,而不需要额外的配置和调整。镜像本身包含了应用的所有依赖和配置信息,不依赖于底层系统,因此可以在不同的环境中无缝地迁移和部署。

这种可移植性使得开发人员可以在本地开发和测试镜像,然后将其部署到生产环境,确保应用在不同环境中的行为一致,减少了由于环境差异引起的问题。

综上所述,Docker 镜像是一种强大的容器技术,它提供了轻量级、可移植且可复制的软件打包方案,为应用的部署、测试和管理带来了便利。合理利用 Docker 镜像,将有助于提高应用的开发效率和部署稳定性。

三、分层存储原理

Docker 镜像是由一系列分层存储(Layered Storage)构成的,这种特殊的设计使得 Docker 镜像在管理和传输时具备高效性和灵活性。本节将详细介绍分层存储的概念和用途,并阐述它是如何节省存储空间的。

3.1 分层存储的概念

分层存储是 Docker 镜像的核心组成原理之一。每个 Docker 镜像由多个层叠加而成,每一层代表一个文件系统的快照。这些层共同构成了一个完整的镜像文件系统。

每个镜像层都是只读的,当容器运行时,会在镜像层之上再添加一个可写层,用于容器的写操作。这样,多个容器可以共享同一个只读的镜像层,同时拥有各自的可写层,实现资源的高度共享和隔离。

分层存储的设计使得 Docker 镜像具有可复用性,相同的镜像层可以被多个镜像共享,节省了存储空间,同时降低了镜像的传输时间,提高了镜像的传输效率。

3.2 分层存储的用途

分层存储在 Docker 中发挥着重要的作用。它带来了以下几个主要优势:

  1. 镜像的复用:由于分层存储,当多个镜像共享相同的基础层时,它们只需要在本地存储中保存一份基础层的副本,避免了重复存储相同内容的问题。这样的设计显著降低了镜像的存储需求。

  2. 镜像的传输效率:镜像的分层存储结构允许只传输更改的层,而不是整个镜像,因此在传输时只需要传输更新的部分,减少了传输的数据量,提高了传输效率。

  3. 镜像的版本管理:每个镜像层都是只读的,当需要更新或修改镜像时,只需新增一层来覆盖原有的层,这样就可以实现版本管理,方便用户管理和回滚镜像的不同版本。

3.3 分层存储节省存储空间的原理

分层存储节省存储空间的原理在于镜像的分层结构。当多个镜像共享相同的基础层时,它们只需要在本地存储中保存一份基础层的副本,因为这些镜像所依赖的基础层是只读的,不会发生变化。

例如,假设有两个镜像A和B,它们都使用了相同的基础镜像C作为底层。在存储中,镜像A和B分别保存自己的特定层以及指向镜像C的指针。实际上,镜像C的内容在存储中只保存一份,但由于镜像A和B都依赖于这份内容,它们共享了同一个基础层,从而节省了存储空间。

综上所述,分层存储是 Docker 镜像的核心设计之一,它通过共享、复用和增量更新的方式,实现了高效的存储和传输。在实际应用中,充分理解和利用分层存储原理,能够有效地优化镜像管理和部署流程,提高容器化应用的开发效率和运行性能。

四、镜像构建流程

Docker 镜像的构建过程是通过 Dockerfile 来定义的,Dockerfile 是一个文本文件,包含了一系列指令,用于描述镜像的构建步骤和配置。本节将详细描述 Docker 镜像的构建流程,包括 Dockerfile 的作用、如何编写一个基本的 Dockerfile,以及每个构建步骤如何生成一个新的镜像层,并且如何利用之前的缓存层以提高构建效率。

4.1 Dockerfile 的作用

Dockerfile 是用于自动化构建 Docker 镜像的重要工具。它提供了一种简单且可重复的方式来定义镜像的组件和配置。通过 Dockerfile,开发人员可以将应用的运行环境和依赖等打包到一个镜像中,实现镜像的版本控制和快速部署。

Dockerfile 是一个纯文本文件,其中包含了一系列指令(Instructions),每个指令都对应着镜像构建的一个步骤。这些指令可以用于指定基础镜像、添加文件、设置环境变量、运行命令等操作,以最终形成一个完整的、可运行的镜像。

4.2 编写基本的 Dockerfile

编写一个基本的 Dockerfile 通常包括以下几个步骤:

  1. 选择基础镜像(FROM):在 Dockerfile 的第一行,使用 FROM 指令选择一个基础镜像作为构建的起点。基础镜像通常是一个已经存在的、可信赖的镜像,你可以基于这个镜像进行扩展和定制。

  2. 添加文件和目录(ADD、COPY):使用 ADDCOPY 指令将应用的代码、依赖文件等添加到镜像中。这些文件将被复制到镜像的指定目录下,从而构建出应用所需的文件结构。

  3. 设置工作目录(WORKDIR):使用 WORKDIR 指令设置容器中的工作目录。后续的命令将在这个目录下执行,使得后续操作更加简洁和清晰。

  4. 运行命令(RUN):使用 RUN 指令在容器中运行命令,比如安装软件包、配置环境等。每个 RUN 指令都会生成一个新的镜像层,因此可以使用多个 RUN 指令来避免不必要的镜像层增加。

  5. 设置环境变量(ENV):使用 ENV 指令设置容器中的环境变量,这些变量可以在容器运行时被应用程序使用。

  6. 暴露端口(EXPOSE):使用 EXPOSE 指令声明容器运行时监听的端口,但并不实际将端口暴露给外部网络。要实现端口映射,需要在容器运行时使用 -p 参数进行配置。

  7. 容器启动时运行的命令(CMD、ENTRYPOINT):使用 CMDENTRYPOINT 指令设置容器启动时要运行的默认命令或应用。这些指令通常是在 Dockerfile 的末尾,并且只能出现一次。

4.3 利用缓存层提高构建效率

在 Docker 镜像的构建过程中,每个指令都会生成一个新的镜像层。但是,Docker 引擎在构建镜像时会利用缓存层的机制,将之前构建过的镜像层缓存起来,以便在下次构建时重复使用。

这种缓存机制可以大幅提高构建效率,尤其在多次构建过程中,只有部分指令发生了变化,其他指令没有改变的情况下,Docker 将重复使用之前的缓存层,从而避免了重复构建相同的层,节省了构建时间和网络传输。

但是要注意,如果某个指令之后的指令发生了变化,将会导致后续的指令全部重新构建。因此,在编写 Dockerfile 时,可以根据指令的依赖关系和改变频率来优化镜像构建,尽量保持常变化的指令在后面,以利用缓存层提高构建效率。

综上所述,Docker 镜像的构建流程通过 Dockerfile 来定义,合理编写 Dockerfile 可以实现镜像的定制和优化,利用缓存层机制可以大幅提高构建效率。熟悉这一过程对于高效管理和部署容器化应用至关重要。

五、镜像构建实例

在本节中,我们将通过一个简单的 Web 服务器容器镜像实例来演示镜像的构建过程。我们将使用 Nginx 作为 Web 服务器,并将一个静态网页添加到镜像中,以便在容器中展示。以下是具体的步骤:

  1. 选择基础镜像

    在构建镜像时,我们需要选择一个基础镜像作为起点。由于我们要构建一个 Nginx 服务器,因此我们选择一个官方提供的 Nginx 基础镜像。

    FROM nginx:latest
    
  2. 添加静态网页文件

    在容器中展示一个静态网页,我们需要将网页文件复制到镜像中的合适目录。在本例中,我们假设静态网页文件 index.html 存放在当前目录下的 webpage 文件夹中。

    COPY webpage /usr/share/nginx/html
    
  3. 暴露端口

    默认情况下,Nginx 使用 80 端口作为 Web 服务器的监听端口。我们需要通过 EXPOSE 指令将容器的 80 端口暴露给主机。

    EXPOSE 80
    
  4. 设置容器启动时运行的命令

    最后,我们需要设置容器启动时运行的命令。在本例中,我们使用 Nginx 的默认启动命令来启动 Web 服务器。

    CMD ["nginx", "-g", "daemon off;"]
    

完成以上步骤后,我们的 Dockerfile 就编写完成了。接下来,我们将在终端中切换到 Dockerfile 所在的目录,并执行以下命令来构建镜像:

docker build -t mywebserver .

其中,-t 参数用于给镜像取一个标签,这里我们取名为 mywebserver。最后的 . 表示使用当前目录下的 Dockerfile 进行构建。

Docker 将按照 Dockerfile 中的指令逐步构建镜像,每个指令都会生成一个新的镜像层。一旦构建完成,我们就可以通过以下命令来运行容器并访问 Nginx 服务器:

docker run -d -p 8080:80 mywebserver

此命令将会在容器中运行 Nginx 服务器,并将容器的 80 端口映射到主机的 8080 端口。现在,我们可以通过浏览器访问 http://localhost:8080 来查看展示的静态网页。

通过这个实例,我们演示了一个简单的 Web 服务器容器镜像的构建过程,帮助读者更好地理解镜像构建的实际操作步骤。在实际应用中,可以根据需求定制更复杂的镜像,以满足不同场景下的需求。

六、最佳实践和优化建议

构建优化的 Docker 镜像是提高容器化应用性能和安全性的重要一环。本节将提供一些最佳实践和优化建议,帮助读者在构建自己的镜像时遵循最佳方法,提高镜像的质量和效率。

6.1 减少镜像层

镜像的层数越少,镜像的构建、传输和部署速度就越快。因此,我们应该尽量减少镜像的层数。可以通过合并多个 RUN 指令,将多个命令放在同一个 RUN 指令中,从而减少镜像层数。同时,应该在一个 RUN 指令中执行多个命令时使用 && 来串联命令,避免多个 RUN 指令生成不必要的中间层。

# 不推荐
RUN apt-get update
RUN apt-get install -y package1# 推荐
RUN apt-get update && apt-get install -y package1

6.2 使用合适的基础镜像

选择合适的基础镜像是构建高效镜像的关键。官方提供的基础镜像通常经过优化,并且有大量的社区支持。对于特定的应用,可以选择专门针对该应用的基础镜像,例如 Node.js、Python 等语言的官方镜像。避免使用过于庞大的基础镜像,选择轻量级的基础镜像将有助于减小镜像的体积。

6.3 使用 .dockerignore 文件

在构建镜像时,Docker 会将 Dockerfile 所在目录下的所有文件都包含在镜像中。但是有些文件并不需要包含在镜像中,例如开发环境下的调试文件、测试文件等。可以通过创建 .dockerignore 文件来排除这些不必要的文件,减小镜像的体积。

6.4 清理无用的依赖和缓存

在构建过程中,可能会安装一些依赖或生成一些中间文件,这些文件在构建完成后并不需要存在于镜像中。可以在构建完成后使用 apt-get clean(对于基于 Debian 的镜像)或类似命令来清理缓存和无用的依赖文件,从而减小镜像的体积。

6.5 使用多阶段构建

对于复杂的应用,可以使用多阶段构建来实现更轻量级的镜像。多阶段构建将应用的构建环境和运行环境分隔开,构建应用的过程在一个镜像中进行,然后将构建好的应用拷贝到另一个轻量级的镜像中运行。

# 构建阶段
FROM builder as build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build# 运行阶段
FROM nginx:latest
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

6.6 使用 Alpine 镜像

Alpine 镜像是一种非常轻量级的 Linux 发行版,通常以较小的体积提供完整的基础系统功能。使用 Alpine 镜像可以大幅减小镜像的体积,并提高容器的启动速度。Alpine 镜像在 Docker Hub 上有大量的官方和社区维护的版本,可以满足绝大多数应用的需求。

综上所述,通过合理减少镜像层数、选择合适的基础镜像、使用 .dockerignore 文件、清理无用的依赖和缓存、使用多阶段构建以及使用 Alpine 镜像等优化方法,可以有效提高 Docker 镜像构建的效率和性能。在实际应用中,根据应用的需求和场景选择相应的优化方法,将有助于构建更高效、安全的容器化应用。

七、结论

本文对 Docker 镜像的分层存储与构建原理进行了详细的介绍与解析。我们了解了 Docker 镜像的重要性和广泛应用,并重点探讨了分层存储与镜像构建的核心概念和优势。

通过分层存储,Docker 镜像将应用和其依赖打包成多个层,实现了镜像的高效共享、复用和版本管理。镜像的构建过程通过 Dockerfile 来定义,其中包含了一系列指令,每个指令对应一个构建步骤,形成一个新的镜像层。

为了优化镜像构建,我们提供了一些最佳实践和优化建议。这包括减少镜像层数、选择合适的基础镜像、使用 .dockerignore 文件排除不必要文件、清理无用的依赖和缓存、使用多阶段构建以及使用 Alpine 镜像等方法。

深入理解 Docker 镜像的分层存储与构建原理,对于有效使用 Docker 技术以及优化容器化应用的开发、部署和管理过程具有重要意义。读者可以进一步探索 Docker 的更多特性和用法,深入了解容器技术的前沿发展和实际应用。

希望本文能够帮助读者对 Docker 镜像技术有更深入的了解,并为应用 Docker 构建高效、安全的容器化应用提供指引和启示。感谢您的阅读!如有任何问题或疑问,请随时向我们咨询或查阅更多相关资源。

八、参考文献

  1. Docker官方文档:Docker官方网站上有关于镜像构建和分层存储的文档,这是学习Docker镜像相关知识的重要资源。你可以访问https://docs.docker.com/了解更多信息。
  2. Docker官方博客:Docker团队定期发布有关技术深入的博客文章,这些文章可能包含关于Docker镜像原理的深入解释和示例。你可以在https://www.docker.com/blog/查找相关文章。
  3. Docker源码:如果你对Docker的底层实现感兴趣,可以查看Docker的开源代码库。在GitHub上可以找到Docker的代码仓库:https://github.com/docker/docker-ce。

Docker专栏文章目录预告

第一部分:Docker 基础知识与原理

  1. Docker 基础知识解析:容器与虚拟化的区别与优势
    2. Docker 架构解析:理解 Docker 引擎和容器运行时
    3. Docker 镜像解密:分层存储与镜像构建原理
  2. Docker 容器生命周期:创建、启动、暂停与停止
  3. Docker 网络模型:理解容器网络通信和连接
  4. Docker 存储驱动解析:选择最适合你的存储方案

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]

  • 今日已学习

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

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

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

相关文章

2353. 设计食物评分系统;1895. 最大的幻方;842. 将数组拆分成斐波那契序列

2353. 设计食物评分系统 核心思想:首先明确我们有哪些功能,首先是修改某种食物分数的功能,然后第二点是能够每次弹出分数高字典序小的食物名字。由这两个我们想到了a 食物[分数],b 烹饪方式[分数,食物名字] 然后有一点经验的感…

Netty各组件基本用法、入站和出站详情、群聊系统的实现、粘包和拆包

Netty Bootstrap和ServerBootstrapFuture和ChannelFutureChannelSelectorNioEventLoop和NioEventLoopGroupByteBuf示例代码 Channel相关组件入站详情出站详情对象编解码ProtoBuf和ProtoStuffnetty实现群聊系统粘包和拆包TCP协议特点举个例子 Bootstrap和ServerBootstrap Boots…

css定义超级链接a标签里面的title的样式

效果: 代码: 总结:此css 使用于任何元素,不仅仅是a标签!

Redis如何实现排行榜?

今天给大家简单聊聊 Redis Sorted Set 数据类型底层的实现原理和游戏排行榜实战。特别简单,一点也不深入,也就 7 张图,粉丝可放心食用,哈哈哈哈哈~~~~。 1. 是什么 Sorted Sets 与 Sets 类似,是一种集合类型&#xff…

F5 LTM 知识点和实验 7-使用SNATs处理流量

第七章:使用SNATs处理流量 SNATs: 传统的vs都是对目的地址和端口进行改变,而源地址没有改变,如果你需要对源地址和源端口进行更改,则需要使用SNAT能力,好处在于: 1、允许不可路由地址(网络内部)的设备获得可路由地址以进入网络外部。2、确保目标服务器通过BIG-IP系统返…

Qt应用开发(基础篇)——QComboBox

目录 一、前言 二、属性和方法 三、信号 四:QFontComboBox 一、前言 QComboBox继承于QWidget,作为Qt Wdiget常用的控件,在实际开发中,经常用来作为某些特定参数属性的选择,比如语言、国家、字体、主题…

【Rust笔记】意译解构 Object Safety for trait

意译解构Object Safety for trait 借助【虚表vtable】对被调用成员函数【运行时内存寻址】的作法允许系统编程语言Rust模仿出OOP高级计算机语言才具备的【专用多态Ad-hoc Polymorphism】特性。 计算机高级语言中的“多态”术语是一个泛指。它通常可被细化为 基于继承关系的“子…

配置IPv6 over IPv4 GRE隧道示例

组网需求 如图1,两个IPv6网络分别通过SwitchA和SwitchC与IPv4公网中的SwitchB连接,客户希望两个IPv6网络中的PC1和PC2实现互通。 其中PC1和PC2上分别指定SwitchA和SwitchC为自己的缺省网关。 图1 配置IPv6 over IPv4 GRE隧道组网图 配置思路 要实现I…

Flyway——修改表名称与序列名称

文章目录 前言脚本修改表名称修改序列 前言 开发中一次偶然的机会,Oracle 12c 更换为 11g ,需要对表名称的长度和序列长度做限制要求。 11g相对12c而言,表名称与序列名称的长度,不能超过30个字符。 在开发中做了更改,…

Tinkercad 建模21个小技巧

21个Tinkercad 建模小技巧 原文 参考文章:在 Tinkercad 中加快设计的 22 个技巧 一起来了解一下21个Tinkercad 3D建模小技巧,让你快人一步。 技巧1 Copy & Paste 文件,整合设计 想把文件A里面的模型拷贝到文件B里面? 很容…

找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决

找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决 安装相应的组件 项目——重定目标解决方案——然后选择版本

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Re…

【软件安装】MATLAB_R2021b for mac 安装

Mac matlab_r2021b 安装 下载链接:百度网盘 下载链接中所有文件备用。 我所使用的电脑配置: Macbook Pro M1 Pro 16512 系统 macOS 13.5 安装步骤 前置准备 无此选项者,自行百度 “mac 任何来源”。 1 下载好「MATLAB R2021b」安装文…

Jetson Nano之ROS入门 -- YOLO目标检测与定位

文章目录 前言一、yolo板端部署推理二、目标深度测距三、目标方位解算与导航点设定1、相机成像原理2、Python实现目标定位 总结 前言 Darknet_ros是一个基于ROS(机器人操作系统)的开源深度学习框架,它使用YOLO算法进行目标检测和识别。YOLO算…

代理模式:控制访问的设计模式

代理模式:控制访问的设计模式 什么是代理模式? 代理模式是一种常见的设计模式,它允许通过代理对象来控制对真实对象的访问。代理模式的主要目的是在不改变原始对象的情况下,提供额外的功能或控制访问。 为什么要使用代理模式&a…

2023年Q2京东环境电器市场数据分析(京东数据产品)

今年Q2,环境电器市场中不少类目表现亮眼,尤其是以净水器、空气净化器、除湿机等为代表的环境健康电器。此外,像冷风扇这类具有强季节性特征的电器也呈现出比较好的增长态势。 接下来,结合具体数据我们一起来分析Q2环境电器市场中…

所有流的知识都有,IO流原理及流的分类

1、Java IO流原理 I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。 Java程序中,对于数据的输入/输出操作以”流(stream)” 的方式进行。java.io包下提供了各种“流”类…

微信小程序监测版本更新

在index.js里面 不放到app.js里面是因为有登录页面,在登录页面显示更新不太友好 onShow() {const updateManager wx.getUpdateManager()// 请求完新版本信息的回调updateManager.onCheckForUpdate(res > {if (res.hasUpdate) {// 新版本下载成功updateManage…

【JavaEE初阶】Servlet (二) Servlet中常用的API

文章目录 HttpServlet核心方法 HttpServletRequest核心方法 HttpServletResponse核心方法 Servlet中常用的API有以下三个: HttpServletHttpServletRequestHttpServletResponse HttpServlet 我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其…

以科技创新引领短交通行业发展,九号公司重磅新品亮相巴塞罗那MWC

2月27日,以“时不我待(VELOCITY) - 明日科技,将至已至”为主题的2023世界移动通信大会(Mobile World Congress,以下简称MWC)在西班牙巴塞罗那举办,全球创新短交通领军企业九号公司参加了大会。现场&#xf…