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

 如何使用 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:18container_name: spring-boot-appworking_dir: /appvolumes:- ./target/spring-0.0.1-SNAPSHOT.jar:/app/spring-0.0.1-SNAPSHOT.jarports:- "8080:8080"environment:- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydatabase- SPRING_DATASOURCE_USERNAME=root- SPRING_DATASOURCE_PASSWORD=exampledepends_on:- dbcommand: ["java", "-jar", "spring-0.0.1-SNAPSHOT.jar"]db:image: mysql:8.0container_name: dbenvironment:MYSQL_ROOT_PASSWORD: exampleMYSQL_DATABASE: mydatabaseports:- "3306:3306"volumes:- db_data:/var/lib/mysqlvolumes: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.mzph.cn/diannao/65624.shtml

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

相关文章

机器人基础-自由度及其简单计算

机器人基础-自由度及其简单计算 1.自由度&#xff08;DOF&#xff09;2.自由度的计算3.自由度计算例题例1.例2.例3. 对于一个机器人的手腕&#xff0c;一般要求实现对空间坐标轴X、Y、Z的旋转运动&#xff0c;分别是翻/回转&#xff08;Roll&#xff09;、俯仰&#xff08;Pitc…

c# WaitSleepJoin状态的线程如何自动恢复

在 C# 中&#xff0c;线程的 ThreadState.WaitSleepJoin 状态表示线程当前处于等待、睡眠或加入&#xff08;比如等待锁、等待事件、或者调用 Thread.Sleep 等&#xff09;。要让一个处于 WaitSleepJoin 状态的线程恢复运行&#xff0c;必须唤醒它或让它不再被阻塞。这通常通过…

初学stm32---高级定时器输出n个pwm波

目录 高级定时器简介&#xff1a;(F1) 高级定时器框图 重复计数器特性 高级定时器输出指定个数PWM实验原理 高级定时器输出指定个数PWM实验配置步骤 相关HAL库函数介绍 关键结构体介绍 高级定时器简介&#xff1a;(F1) 1.高级定时器 &#xff1a;TIM1/TIM8 2.主要特性&…

【每日学点鸿蒙知识】Shape描述、全局loading组件、checkbox样式、H5监听键盘收起、弹窗不关闭

1、HarmonyOS 有没有xml描述的Shape&#xff1f; 有没有xml描述的Shape&#xff1f; 官方文档有对用的Shape的参考文档&#xff0c;参考链接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-drawing-components-shape-V5 绘制组件的父…

完整的 FFmpeg 命令使用教程

FFmpeg 是一个开源的跨平台音视频处理工具&#xff0c;它能够处理几乎所有的视频、音频格式&#xff0c;并提供了强大的功能如格式转换、视频剪辑、合并、提取音频等。FFmpeg 通过命令行界面&#xff08;CLI&#xff09;操作&#xff0c;尽管有一些图形界面的前端工具&#xff…

Mono里运行C#脚本5—mono_file_map_open

前面介绍了mono_jit_init初始化,这个函数非常长,要理解起来还是比较困难。因此改变另外一种方式,先从底层的函数开始,再慢慢来探索mono的底层实现,以及它的实现原理,运行的细节。 Mono要运行exe文件,这里是运行test-embed.exe文件,那么就得认识这个文件,解释这个文件的…

【MySQL】踩坑笔记——保存带有换行符等特殊字符的数据,需要进行转义保存

问题描述 从DBeaver中导出了部分业务数据的 insert sql&#xff0c;明明在开发、测试环境都可以一把执行通过&#xff0c;却在预发环境执行前的语法检查失败了&#xff0c;提示有SQL语法错误。 这条SQL长这样&#xff0c;default_sql是要在odps上执行的sql语句&#xff0c;提…

matlab中的cell

在MATLAB中&#xff0c;cell 是一种非常重要的数据类型&#xff0c;它能够存储不同类型和大小的数据&#xff0c;这使得它非常灵活&#xff0c;适用于处理复杂的数据结构。 1. 基本介绍 cell 类型的变量可以存储不同类型的数据&#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…

Excel中一次查询返回多列

使用Excel或wps的时候&#xff0c;有时候需要一次查询返回多列内容&#xff0c;这种情况可以选择多次vlookup或者多次xlookup&#xff0c;但是这种做法费时费力不说&#xff0c;效率还有些低下&#xff0c;特别是要查询的列数过多时。我放了3种查询方法&#xff0c;效果图&…

网络基础入门到深入(2):网络协议-TCP/IP协议栈

目录 一.TCP/IP协议栈的四层结构 二.每一层的作用与协议 1.作用层 作用&#xff1a; 常见协议: 示例: 2.传输层 作用: 核心功能: 3.网络层 作用: 核心功能: 常见协议: 示例: 4.数据链路层(物理层) 作用: 核心功能: 常见技术: 示例: 三.TCP/IP协议栈的分层…

C语言 练习

1.按顺序打印三个数 //按大小顺序打印三个数字 void Swap(int* px, int* py) {int tmp *px;*px *py;*py tmp; } int main() {int a 0;int b 0;int c 0;scanf("%d %d %d", &a, &b, &c);if (a < b){Swap(&a,&b);}if (a < c){Swap(&am…

爱思唯尔word模板

爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接

flask后端开发(3):html模板渲染

目录 渲染模板html模板获取路由参数 gitcode地址&#xff1a; https://gitcode.com/qq_43920838/flask_project.git 渲染模板 这样就能够通过html文件来渲染前端&#xff0c;而不是通过return了 html模板获取路由参数

Spring发布-订阅模式:解耦与异步通信的高效实现

文章目录 前言一、发布订阅模式的基本概念二、发布订阅模式的实现1、定义事件2、发布事件3、订阅事件3.1、ApplicationListener接口3.2、EventListener注解3.3、事件源Object source的作用 三、开发应用场景1、社交网络平台2、电商系统3、金融交易系统 总结 前言 Spring框架通过…

配置hive支持中文注释

hive元数据metastore默认的字符集是latin1&#xff0c;所以中文注释会乱码。但是不能将metastore库的字符集更改为utf-8&#xff0c;只能对特定表、特定列修改为utf-8。配置hive支持中文注释&#xff0c;主要在两个方面&#xff1a; 1、在Hive元数据存储的Mysql数据库中&#…

python实战案例笔记:统计出数据中路劲下没有文件的文件夹

数据样例&#xff1a;&#x1f447;有如下excel数据 需求&#xff1a;有如下excel&#xff0c;a.xls&#xff0c;统计出路劲下没有文件的路劲 详细实现代码&#xff1a; import os from openpyxl import Workbook from datetime import datetimedef get_empty_dirs(paths):# …

docker使用国内镜像

可用地址 https://docker.m.daocloud.io https://docker.rainbond.cc https://docker.1ms.run方法1:配置(需要重启docker) sudo vim /etc/docker/daemon.json # 在registry-mirrors中添加地址(没有的就直接创建了) #比如 {"registry-mirrors": ["https://dock…

机械臂的各种标定

文章目录 1. 工具坐标系标定2. 工具手标定3. 手眼标定联系 在工程中&#xff0c;同时使用工具坐标系标定、工具手标定和手眼标定的概念、目的和作用如下&#xff1a; 1. 工具坐标系标定 概念&#xff1a; 工具坐标系标定是指确定工具相对于机器人坐标系的位置和姿态关系的过程…

Oracle Managed Files(OMF)

Oracle Managed Files 是指&#xff1a; 在创建表空间文件等文件时&#xff0c;可以不必指定文件路径&#xff0c;由Oracle自动在某个目录下创建&#xff0c;文件名也是Oracle自动命名。 那这个OMF怎么使能呢&#xff1f; 其实是靠设置一些参数&#xff0c;指定要存储的目录…