Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化

news2025/1/5 20:26:40

 如何使用 Maven 将 Spring Boot 应用程序 Docker 化?

Docker是一个开源容器化工具,用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中,为了将Spring Boot 应用程序 docker 化以进行部署,我们将学习如何创建 Spring Boot 应用程序,以及如何为 Spring Boot 应用程序创建docker 镜像,并在docker 容器上运行它。

目录

  • Spring Boot 中的 Docker 是什么?
  • Spring Boot Docker Compose 做什么?
  • Docker化独立的Spring Boot应用程序
  • 如何在 Docker Compose 中部署 Spring Boot 应用程序?
  • 在容器中运行 Spring Boot Docker 映像
  • 如何更改基础镜像
  • 使用 Docker Compose 工具将 Spring Boot 应用程序 Docker 化

Spring Boot 中的 Docker 是什么?

Spring Boot应用程序中的Docker有助于将 Spring Boot 应用程序容器化。它支持应用程序提供一致性、可扩展性和易于部署。使用 Docker 时,开发人员将能够将应用程序与其依赖项和配置一起打包,确保它在不同环境中以相同的方式运行。这种方法有助于简化应用程序部署,提高资源利用率和增强可扩展性,使其成为现代云原生应用程序的理想选择。

使用 Maven 将 Spring Boot 应用程序 Docker 化是让您的应用程序更易于移植和管理的重要步骤。对于那些希望深入探索 Docker 化并掌握从开发到生产的整个过程的人来说,DevOps 工程 - 规划到生产课程提供了全面的指南。

Spring Boot Docker Compose 做什么?

使用docker compose 编写spring boot java 应用程序有助于实现多容器 spring boot 应用程序的无缝部署和管理。以下是它的一些好处:

  • 简化配置:它支持在单个 YAML 文件中定义和管理 Spring Boot 应用程序以及数据库和其他服务。
  • 一致的环境:它确保应用程序在开发、测试和生产环境中以相同的方式运行,从而最大限度地减少系统问题。
  • 可扩展性:它提供可扩展性功能,可以根据需求轻松地扩展或缩小 Spring Boot 服务,从而优化资源使用。
  • 高效的编排:实现相互依赖服务的启动、关闭和管理的自动化,从而简化部署过程。

Docker化独立的Spring Boot应用程序

独立 Spring Boot 应用程序:独立 Spring Boot 应用程序是利用 Spring Boot 框架的 Java 应用程序,无需外部服务器软件即可独立运行。它嵌入应用程序服务器,可以作为独立JAR 文件执行,从而简化部署并减少依赖性。

要将 Spring Boot 应用程序 docker 化,我们首先需要创建一个简单的 Spring Boot 应用程序。然后我们需要将 Maven 插件添加到我们的 XML 文件中,之后我们可以创建一个可执行 jar 文件。下一节将讨论并指导其实现。

如何在 Docker Compose 中部署 Spring Boot 应用程序?

以下是指导将 Spring Boot 应用程序 docker 化的步骤:

步骤 1:使用https://start.spring.io创建骨架应用程序。

第 2 步:现在创建一个具有以下配置的 maven 项目。输入所有详细信息后,单击“生成”按钮下载项目。

步骤3:解压压缩文件。

  • 现在,在您选择的 IDE 中打开它。

Spring Boot 构建包

借助 Spring Boot buildpacks,将 Spring Boot 应用打包到容器镜像中时无需Dockerfile和手动配置。它允许开发人员利用针对其 Spring Boot 项目的自动镜像生成功能,从而让他们能够专注于编写代码。

这些构建包会自动识别应用程序的先决条件,包括运行时参数和依赖项,并将所有内容组合在一起以制作适合生产的容器映像。这提高了开发人员的工作效率,简化了容器化过程,并提高了部署之间的一致性。

步骤 4:下面是使用 buildpacks 创建 docker 镜像的依赖项。现在我们需要在 pom.xml 文件中添加以下 Maven 插件。

<build>
      <plugins>
              <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
              </plugin>
       </plugins>
</build>

第五步:打开项目的基础java文件,向应用程序的基类添加一个新的控制器。

@RequestMapping("/")
public String home() {
    return "Dockerizing Spring Boot Application";
}

步骤 6:现在,添加@RestController注释并导入所需的包。最后,您的 Application.java 文件应如下所示。

Java

package com.docker.spring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Application {

    @RequestMapping("/")
    public String home() {
        return "Dockerizing Spring Boot Application";
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

步骤 7:现在通过运行以下命令启动应用程序,

$ ./mvnw spring-boot:run

  • 以下屏幕截图说明 java sprint boot 应用程序成功运行。

步骤8:导航到http://localhost:8080来测试应用程序。

项目结构

  • 此时项目结构应该是这样的,

Docker化我们的应用程序

步骤 9:生成 .jar 文件

  • 接下来,让我们通过在 IntelliJ 终端中执行命令 ./mvnw clean package 来生成 .jar 文件。此命令将编译项目、运行任何必要的测试,并将应用程序打包到 .jar 文件中。
  • 该过程完成后,导航到项目目录中的目标文件夹。您将在那里找到生成的 spring-0.0.1-SNAPSHOT.jar 文件。
  • 现在使用 maven builder 创建一个新的 jar 文件。
$ ./mvnw clean package
  • 上述命令将构建我们的 docker 镜像。下图表示通过执行上述命令生成 jar 文件。参考第二张图,构建成功并创建了 jar 文件。

  • 以下屏幕截图说明了使用 Maven 构建工具成功构建 Java 应用程序。

步骤 10:创建 Dockerfile

  • 在项目根目录下运行以下命令来构建 Dockerfile。此命令将在当前目录中创建一个空的Dockerfile 。
  • 创建 Dockerfile 后,您可以按照以下步骤继续定义构建Docker 映像所需的指令。

$ touch Dockerfile

步骤 11:添加配置以将 Spring Boot 应用程序 docker 化

  • 现在我们有一个可以运行的 Spring Boot 应用程序,要将应用程序 Docker 化,现在将以下内容粘贴到 Dockerfile 中:
FROM openjdk:18
WORKDIR /app
COPY ./target/spring-0.0.1-SNAPSHOT.jar /app
EXPOSE 8080
CMD ["java", "-jar", "spring-0.0.1-SNAPSHOT.jar"]

上述文件包含以下信息:

  • FROM openjdk:18–此行指定Docker 容器的基础镜像。在本例中,它使用标记为版本 18 的官方 OpenJDK 镜像。此镜像为 Java 应用程序提供运行时环境。
  • WORKDIR /app此行将容器内的工作目录设置为/app。所有后续命令都将相对于此目录执行。
  • COPY ./target/spring-0.0.1-SNAPSHOT.jar /app此命令将 Spring Boot 应用程序 JAR 文件从主机./target目录复制到/app容器内的目录。假设您已构建 Spring Boot 应用程序并且 JAR 文件位于指定位置。
  • EXPOSE 8080 - 此行通知 Docker 容器将在运行时监听端口 8080。但是,它实际上并未发布端口。它只是容器预期使用哪些端口的文档。
  • CMD ["java", "-jar", "spring-0.0.1-SNAPSHOT.jar"] - 此命令指定容器启动时要运行的默认命令。它通过java -jar使用 Spring Boot JAR 文件作为参数执行命令来启动 Spring Boot 应用程序。

步骤 12:现在使用 docker build 命令创建一个 docker 镜像:

$ docker build -t [name:tag] .
  • -t:镜像的名称和标签
  • . :构建过程的背景

构建过程完成后,您将收到新镜像的 ID 和标签。

在容器中运行 Spring Boot Docker 映像

在容器中运行我们的镜像之前,让我们确保在尝试将容器端口映射到本地主机端口时避免任何潜在错误。为此,我们需要在Docker 命令Docker Compose文件中指定正确的端口绑定配置。这可确保容器的端口已公开并可从主机系统访问。

步骤 13:通过运行以下命令创建 Docker 容器:

$ docker run -d -p [host_port]:[container_port] --name [container_name] [image_id/image_tag]

  • -d:运行容器并打印容器ID。
  • -p:映射容器的端口
  • –name:为容器指定名称

步骤 14:通过运行以下命令验证容器是否已成功创建:

$ docker container ps

步骤15:检查项目

  • 确保项目结构符合标准程序并具有 Spring Boot 应用程序所需的所有部分。
  • 此外,确认应用程序的目录结构合理且定义明确,并且所有依赖项都配置正确。

步骤 16:检查申请

  • 打开 Web 浏览器并转到 http://localhost:8080/ 来检查该程序。这将显示计算机上正在运行的本地 Spring Boot 应用程序。

如何更改基础镜像

修改 Dockerfile 中的基础映像是一个简单的过程,但可能会对容器的大小、安全性和功能产生很大影响。请按照以下步骤修改基础映像:

1. 选择一个新的基础镜像 在进行任何更改之前,进行彻底的研究以获得符合应用程序要求的合适的基础镜像非常重要。

  • 操作系统、图片大小、安全功能以及与应用程序堆栈的兼容性都是需要考虑的重要因素。
  • 应优先考虑来自 Docker Hub 或其他可靠来源的官方镜像,以确保可靠性并符合安全最佳实践。
  • 通过仔细权衡这些考虑因素,您可以选择一个既能优化速度又能保证安全性的基础映像,作为您的容器化应用程序的坚实基础。

2. 更新 Dockerfile: 打开文本编辑器并选择您的 Dockerfile。查找文件开头的指令“FROM”,它表示当前基础映像。

  • 用新镜像替换现有镜像,如下面的示例所示。
FROM image:version  #Change the image and version as per your requirement

3. 调整依赖项和配置:由于新旧基础镜像之间的差异,可能需要更新 Dockerfile 中的依赖项、配置或指令。

  • 确保在新的基础映像上安装并配置了所有必需的工具、库和包。

4.验证您的更改:对 Dockerfile 进行更改后,使用“docker build”命令重新创建您的 Docker 映像:

docker build -t [name:tag] .

使用 Docker Compose 工具将 Spring Boot 应用程序 Docker 化

Dockerfiles 和 Docker 命令非常适合构建单个容器。如果我们想在应用程序的共享网络上操作,容器管理就会变慢。

Docker 提供了一个名为 Docker Compose 的工具来解决此问题。此实用程序采用 YAML 中独特的构建文件格式。多个服务的配置可以合并到一个名为 docker-compose.yml 的文件中。

Docker Compose 文件

以下是 Docker Compose 文件示例,它是用于编排多个服务的基本配置。它定义了两个服务“service1”和“service2”,每个服务都具有指定的 Docker 镜像、容器名称、公开端口和环境变量。我们可以根据需要修改版本。

版本:'3.8'
 

version: '3.8'

services:
  spring-boot-app:
    image: openjdk:18
    container_name: spring-boot-app
    working_dir: /app
    volumes:
      - ./target/spring-0.0.1-SNAPSHOT.jar:/app/spring-0.0.1-SNAPSHOT.jar
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydatabase
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=example
    depends_on:
      - db
    command: ["java", "-jar", "spring-0.0.1-SNAPSHOT.jar"]

  db:
    image: mysql:8.0
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydatabase
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:
  • 以下命令用于构建docker-compose文件:
$ docker-compose config
  • 为了构建映像并创建 Docker 容器,我们可以使用以下命令:

$ docker-compose up --build

  • 要停止容器,我们应该将其从 Docker 中删除。为此,我们可以使用以下命令:

$docker-compose down

扩展服务

Docker Compose 中的扩展服务是指能够增加或减少 Docker Compose 文件中定义的服务实例数量。这可以通过调整服务的“scale”属性来指定要为该服务运行的容器数量来实现。

$ docker-compose --file docker-compose.yml up -d --build --scale service=1 --scale product-server=1

此操作将启动单个服务服务器和单个产品服务器。

最后

因此,通过这种方式,我们可以使用 Maven 插件将镜像发布到 Docker 容器。最好不要使用本地环境将 docker 镜像上传到任何注册表,使用CI/CD管道或任何工具始终是最佳实践。

使用 Maven 将 Spring Boot 应用程序 Docker 化 - 常见问题解答

如何将 Maven 项目 Docker化?

在项目根目录中创建一个Dockerfile,将应用程序的 JAR 文件复制到Docker 镜像中,并提供在容器内启动应用程序的命令,以便 Docker 化Maven 项目。

如何使用 Maven 建立 Spring Boot 应用程序?

创建一个新的 Maven 项目,并将必要的依赖项(例如 spring-boot-starter-parent 以及应用程序要求特有的任何其他依赖项)添加到 pom.xml 文件中,以使用 Maven 设置 Spring Boot 应用程序。接下来,按照推荐的目录布局为您的 Spring Boot 应用程序开发类和资源。

如何将 Spring Boot 微服务 Docker 化?

创建一个指定基础镜像的 Dockerfile,复制应用程序 JAR 文件,公开必要的端口,并描述启动应用程序的命令,以便将 Spring Boot微服务docker 化。接下来创建 Docker 镜像,并使用它来启动容器。

如何将我的项目 Docker化?

制作一个 Dockerfile,列出基础镜像、所需的库以及用于构建和执行应用程序的命令,以便将您的项目 Docker 化。

什么是 Dockerize 命令?

使用 Dockerize 命令可以将应用程序打包到Docker 容器中,从而可以轻松地在各种上下文中部署和执行。通常,它需要生成 Dockerfile,使用 docker build 生成镜像,然后使用 docker run 启动容器。

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

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

相关文章

模仿微信小程序wx.showModal自定义弹窗,内容可以修改

实现以下弹框样式功能 1.在components新建一个文件showModel.wpy作为组件&#xff0c;复制下面代码 <style lang"less" scoped> .bg_model {display: flex;justify-content: center;align-items: center;// 弹框背景.bg_hui {width: 100%;height: 100%;posi…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期&#xff0c;JuiceFS 企业版推出了 Cache Group Operator&#xff0c;用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具&#xff0c;它能够自动化应用程序的生命周期管理任务&#xff0c;使部署、扩展和运维更加高效。 在推出 Operator 之前…

零基础微信小程序开发——小程序的宿主环境(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

GPU 进阶笔记(二):华为昇腾 910B GPU

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探&#xff1a;鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…

微服务SpringCloud分布式事务之Seata

视频教程&#xff1a;https://www.bilibili.com/video/BV16P63Y3ESq 效果演示 准备的微服务项目调用的链路如下&#xff1a; 文字描述&#xff1a; gateway模块接收到请求&#xff0c;并发送到order订单模块order订单模块接收到请求&#xff0c;新增一个订单数据后发送一个…

HTML——13.超链接

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>超链接</title></head><body><!--超链接:从一个网页链接到另一个网页--><!--语法&#xff1a;<a href"淘宝网链接的地址"> 淘宝…

STM32 高级 WIFi案例1:测试AT指令

需求描述 测试AT指令是否能够正常控制ESP32的wifi&#xff0c;比如重启、读取设备信息等。 思路&#xff1a; stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置&#xff1a; 第一步&#xff1a;对ESP32芯片烧录可以读取stm32命令的固件&#xff08;fac…

GXUOJ-算法-第四次作业(圆排列、连续邮资、n皇后、符号三角形)

1.圆排列 问题描述 GXUOJ | 圆排列 代码解答 #include<bits/stdc.h>using namespace std;int n; int r[1000]; double x[1000]; double ans 0x3f3f3f3f;double calculate(){memset(x, 0, sizeof x);for(int i 0; i < n; i){for(int j 0; j < i; j)x[i] max(…

[创业之路-225]:《华为闭环战略管理》-4-华为的商业智慧:在价值链中探索取舍之道与企业边界

目录 一、在价值链中探索取舍之道与企业边界 价值链的深刻洞察 取舍之道&#xff1a;有所为&#xff0c;有所不为 垂直整合与横向整合的平衡 企业边界与活动边界的界定 采购与外包的智慧运用 结语 二、企业外部价值流&#xff1a;上游、中游、下游、终端 上游&#xf…

【从零开始入门unity游戏开发之——C#篇33】C#委托(`Delegate`)和事件(`event` )、事件与委托的区别、Invoke()的解释

文章目录 一、委托&#xff08;Delegate&#xff09;1、什么是委托&#xff1f;2、委托的基本语法3、定义自定义委托4、如何使用自定义委托5、多播委托6、C# 中的系统委托7、GetInvocationList 获取多个函数返回值8、总结 二、事件&#xff08;event &#xff09;1、事件是什么…

大模型—Ollama 结构化输出

Ollama 结构化输出 Ollama现在支持结构化输出,使得可以按照由JSON模式定义的特定格式来约束模型的输出。Ollama的Python和JavaScript库已经更新,以支持结构化输出。 结构化输出的用例包括: 从文档中解析数据从图像中提取数据结构化所有语言模型响应比JSON模式更可靠和一致开…

【Python】selenium 获取滑块和背景图在电脑屏幕的相对位置【解决滑块验证码问题】

在使用python模拟爬取的时候&#xff0c;解决滑动验证码是不可缺少的环节。怎么解决滑动验证码的问题呢&#xff0c;我们可以试着使用这样的方法&#xff1a; 我们在解决滑块验证码问题的时候&#xff0c;首先要找到滑块和在网页上的位置&#xff0c;定位好位置以后&#xff0…

微信小程序:定义页面标题,动态设置页面标题,json

1、常规设置页面标题 正常微信小程序中&#xff0c;设置页面标题再json页面中进行设置&#xff0c;例如 {"usingComponents": {},"navigationBarTitleText": "标题","navigationBarBackgroundColor": "#78b7f7","navi…

Visual Studio 中增加的AI功能

前言&#xff1a; 人工智能的发展&#xff0c;在现在&#xff0c;编程技术的IDE里面也融合了AI的基本操做。本例&#xff0c;以微软的Visual Studio中的人工智能的功能介绍例子。 本例的环境&#xff1a; Visual Studio 17.12 1 AI 智能变量检测&#xff1a; 上图展示了一…

后端开发-Maven

环境说明&#xff1a; windows系统&#xff1a;11版本 idea版本&#xff1a;2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型&#xff08;POM&#xff09;&#xff0c;通过一组构建规则和约定来管理项目的构建&#xf…

BAPI_BATCH_CHANGE在更新后不自动更新批次特征

1、问题介绍 在CL03中看到分类特性配置了制造日期字段&#xff0c;并绑定了生产日期字段MCH1~HSDAT MSC2N修改批次的生产日期字段时&#xff0c;自动修改了对应的批次特性 但是通过BAPI&#xff1a;BAPI_BATCH_CHANGE修改生产日期时&#xff0c;并没有更新到批次特性中 2、BAPI…

ARM200~500部署

前提&#xff1a;数据库已经安装好&#xff0c;并且正常运行 1.修改hostname,将里面的AR-A 改为hzx vi /etc/hostname 2.重启网络服务 sudo systemctl restart NetworkManager 3.修改community-admin.service 文件&#xff0c;更改小区名称和IP&#xff0c;并将文件上传到/…

修改secure-file-priv参数-mysql5.7.26限制不允许导入或导出的解决方法

文章目录 前言secure_file_priv参数说明修改secure_file_priv参数的步骤 前言 本人是在sql注入的文件上传拿web shel 时所用到的写入文件权限遇到文件上传不成功的问题&#xff0c;记住修改后&#xff0c;重启mysql才生效&#xff0c;最后可以查看验证一下。 secure_file_priv…

Java编程规约:日期时间

文章目录 I 日期时间编程规约【强制】【推荐】II 知识扩展日期格式I 日期时间编程规约 【强制】 日期格式化时,传入 pattern 中表示年份统一使用小写的 y。说明:日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后引入的概念), 意…

Java [后端] 开发日常记录(1)

目录 1、常用的注解 2、对字符串的处理 3、对JSON串的处理 -- The End -- 详细如下&#xff1a; 1、常用的注解 若返回的字段中有NUll&#xff0c;则不返回 JsonInclude(value JsonInclude.Include.NON_NULL) //在实体类中添加这个注解 JsonInclude(JsonInclude.Include.NON…