SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目

前述:

 本篇教程将略过很多docker下载环境配置的基础步骤,如果您对docker不太熟悉请参考我的上一个教程:SpringBoot新手快速入门系列教程九:基于docker容器,部署一个简单的项目

使用 Docker Compose 支持部署 Docker 项目有许多优势,

对比:使用 Docker 和 Docker Compose

功能DockerDocker Compose
单一容器管理良好,使用 Dockerfile 和 docker run良好,但通常用于多容器管理
多容器管理较繁琐,需要手动管理各个容器优秀,使用 docker-compose.yml 文件
服务依赖管理手动设置依赖关系和启动顺序自动管理依赖关系和启动顺序
配置和环境管理使用环境变量和配置文件使用环境变量和配置文件,统一管理
扩展和缩放手动扩展,使用 docker run简单扩展,使用 docker-compose up --scale

另外对于分布式的 Spring Boot 应用,建议使用 Docker Compose 来管理多个服务。虽然仅使用 Docker 也可以实现,但 Docker Compose 提供了更多的便利性和简化操作,特别是当涉及到多个相互依赖的服务时。以下是原因及如何使用 Docker Compose 来构建分布式 Spring Boot 应用的详细步骤:

使用 Docker Compose 的优势

  1. 简化多容器管理:通过一个简单的 docker-compose.yml 文件定义所有服务,使用一个命令即可启动或停止整个应用。
  2. 服务依赖管理:可以定义服务之间的依赖关系,确保按顺序启动。
  3. 统一网络管理:所有服务自动加入同一个网络,方便服务之间的通信。
  4. 环境变量和配置管理:可以在 docker-compose.yml 文件中统一管理环境变量和配置。
  5. 易于扩展和缩放:可以简单地通过调整 docker-compose.yml 文件扩展服务实例数量。

步骤一:新建基于Docker Compose的项目

选择依赖

步骤二:代码示例

1. 创建实体类

src/main/java/com/yuye/www/hellodockeradv/entity 目录下创建 User.java 文件:

package com.yuye.www.hellodockeradv.entity;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

2,创建Repository接口

src/main/java/com/yuye/www/hellodockeradv/repository 目录下创建 UserRepository.java 文件:

package com.yuye.www.hellodockeradv.repository;import com.yuye.www.hellodockeradv.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;import java.util.Optional;public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByName(String name);boolean existsByName(String name);
}

3,创建Controller

src/main/java/com/yuye/www/hellodockeradv/controller 目录下创建 UserController.java 文件:

package com.yuye.www.hellodockeradv.controller;import com.yuye.www.hellodockeradv.entity.User;
import com.yuye.www.hellodockeradv.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Optional;@RestController
public class UserController {@Autowiredprivate UserRepository userRepository;@GetMapping("/register")public String registerUser(@RequestParam String name) {// Check if a user with the same name already existsif (userRepository.existsByName(name)) {return "User already exists";}// If user doesn't exist, create a new user and save to the databaseUser user = new User();user.setName(name);userRepository.save(user);return "User registered successfully";}@GetMapping("/login")public String loginUser(@RequestParam String name) {Optional<User> user = userRepository.findByName(name);if (user.isPresent()) {return "User found: " + name;} else {return "User not found";}}
}

4. 配置 application.properties 文件

src/main/resources/application.properties 文件中添加MySQL数据库连接配置

spring.application.name=HelloDockerAdv
spring.datasource.url=jdbc:mysql://localhost:3306/userdata?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Qwerty123
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialectserver.port=8081

5. 创建 Dockerfile

在项目根目录下创建一个 Dockerfile 文件:

# 使用官方的OpenJDK镜像作为基础镜像
FROM openjdk:17-jdk-slim# 添加一个环境变量来指示Spring Boot使用哪个端口
ENV SERVER_PORT=8080# 将jar包添加到容器中
COPY build/libs/HelloDockerAdv-0.0.1-SNAPSHOT.jar app.jar# 暴露应用程序的端口
EXPOSE 8080# 运行jar包
ENTRYPOINT ["java", "-jar", "/app.jar"]

6. 创建 docker-compose.yml 文件

在项目根目录下创建一个 docker-compose.yml 文件:

version: '3.8'
services:app:image: hellodockeradvbuild:context: .dockerfile: Dockerfileports:- "8080:8080"depends_on:- mysqlenvironment:SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/demoSPRING_DATASOURCE_USERNAME: rootSPRING_DATASOURCE_PASSWORD: yourpasswordmysql:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: yourpasswordMYSQL_DATABASE: demoports:- "3306:3306"volumes:- mysql-data:/var/lib/mysqlvolumes:mysql-data:

7. 构建和运行Docker容器

确定你的mysql数据库有一个

userdata

和一个user的表

然后启动mysql后

在项目根目录下运行以下命令:

# 构建Spring Boot应用程序
./gradlew build# 启动Docker Compose,构建并运行所有服务
docker-compose up --build

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

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

相关文章

白骑士的C++教学进阶篇 2.3 模板

系列目录 上一篇&#xff1a;白骑士的C教学进阶篇 2.2 面向对象编程&#xff08;OOP&#xff09; 模板是C中一个强大的特性&#xff0c;允许编写通用的代码&#xff0c;提高代码的重用性和灵活性。模板分为函数模板和类模板&#xff0c;还包括模板特化。本篇博客将详细介绍这些…

SQL优化之深分页

SQL优化之深分页 我们都知道&#xff0c;大型项目中的SQL语句&#xff0c;应该尽量避免深分页。 那么问题就来了&#xff1a; 深分页的性能差在哪&#xff1f;什么方案能避免深分页呢&#xff1f; 什么是深分页 深分页&#xff0c;即SQL查询过程中&#xff0c;使用的页数过…

双连通性(算法篇)

算法之双连通性 双连通性 概念&#xff1a; 双连通性就是当删除图中的一个顶点&#xff0c;使图分割成两个图&#xff0c;则这个图就具有双连通性&#xff0c;而能导致图分割成多张图的顶点称为割点背向边&#xff1a;当一个顶点被访问时&#xff0c;选取该顶点其中一个未访…

3.Softmax回归

回归和分类 回归估计一个连续值 分类预测一个离散类别 Softmax回归实际是一个分类问题 从回归到多类分类 对类别进行一位有效编码 y [ y 1 , y 2 , ⋯ , y n ] T y[y_1,y_2,\cdots,y_n]^T y[y1​,y2​,⋯,yn​]T,如果是第i类&#xff0c;则值为1&#xff0c;否则为0 使用…

用户对生活的需求,是三翼鸟创新的起点

这两天又长知识了&#xff0c;学到了一个网络新梗&#xff1a;City不City。 它源自于一种新的打卡方式&#xff0c;用于表达对某个城市的态度或感受。比如你跟朋友在城市游荡时&#xff0c;就可以随口问句City不City啊&#xff1f;通常被释义为“洋不洋气”“ 时髦不时髦”。 …

cpp的cbp

.cbp 文件是 Code::Blocks 的项目文件。Code::Blocks 是一个开源的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于 C、C 以及 Fortran 编程。.cbp 文件包含有关项目的所有配置信息&#xff0c;包括文件路径、编译选项、链接器设置等。 以下是 .cbp 文件的…

部署YUM仓库及NFS共享功能

目录 一、YUM仓库服务 1、YUM仓库概述 2、准备安装源 2.1、软件仓库的提供方式 2.2、 RPM软件包的来源 3、YUM主配置文件 4、软件卸载 5、YUM源的提供方式 5.1、配置本地YUM源仓库 5.2、配置ftp源 5.2.1、服务端配置 5.2.2、客户端配置 二、NFS共享存储 1、NFS基…

Git 删除包含敏感数据的历史记录及敏感文件

环境 Windows 10 Git 2.41.0 首先备份你需要删除的文件&#xff08;如果还需要的话&#xff09;&#xff0c;因为命令会将本地也删除将项目中修改的内容撤回或直接提交到仓库中&#xff08;有修改内容无法提交&#xff09; 会提示Cannot rewrite branches: You have unstaged …

免费流程图工具 Draw.io Integration安装使用

Draw.io Integration 是 VS Code 上的一个插件&#xff0c;允许用户在 VS Code 中直接创建、编辑和查看 Draw.io 图表&#xff0c;如流程图、UML 图等。以下是 Draw.io Integration 插件在 VS Code 中的安装步骤&#xff1a; 安装步骤 确保 VS Code 已安装&#xff1a; 如果你…

YOLOv10训练自己的数据集(交通标志检测)

YOLOv10训练自己的数据集&#xff08;交通标志检测&#xff09; 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用YOLOv10训练自己的数据集进行交通标志检测准备数据进行训练进行预测进行验证 参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff…

每日一道算法题 204. 计数质数

题目 204. 计数质数 - 力扣&#xff08;LeetCode&#xff09; Python class Solution:def countPrimes(self, n: int) -> int:"""质数又称为素数&#xff0c;是一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数…

【C++题解】1156 - 排除异形基因

问题&#xff1a;1156 - 排除异形基因 类型&#xff1a;数组基础 题目描述&#xff1a; 神舟号飞船在完成宇宙探险任务回到地球后&#xff0c;宇航员张三感觉身体不太舒服&#xff0c;去了医院检查&#xff0c;医生诊断结果&#xff1a;张三体内基因已被改变&#xff0c;原有…

Vscode连接存在私钥的远程服务器

编辑配置文件 # Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost 172.17.x.xxxHostName 172.17.x.xxxUser xxxIdentityFile C:\Users\xxx\.ssh\xxx.pem会出现报错&#xff1a; Permissions 0644 for xxxx are too open. It is required that …

XML Schema 指示器

XML Schema 指示器 1. 引言 XML Schema 是一种用于定义 XML 文档结构和内容的语言。它提供了一种强大的方式来描述 XML 文档中允许的元素、属性和数据类型。XML Schema 指示器是在 XML Schema 定义中使用的一些特殊元素和属性,它们用于指示 XML 处理器如何解析和验证 XML 文…

vue-router路由路径

在配置 vue-router 路由时&#xff0c;path: ‘search’ 和 path: ‘/search’ 有不同的行为&#xff1a; 1.path: ‘search’: 这是一个相对路径。相对路径意味着这个路径是相对于父路径的。如果父路径是 /emergency&#xff0c;那么这个路由的完整路径是 /emergency/search…

QT 报错C2872: “byte“: 不明确的符号

这个错误提示是因为 byte 这个符号不明确&#xff0c;这种情况是由于代码中同时包含了多个同名符号的定义&#xff0c;编译器无法区分&#xff0c;从而导致错误。在这个问题中&#xff0c;可能是由于使用了 Winsock2.h 头文件中定义的 byte 宏与其他地方定义的 byte 符号重名&a…

Android Bitmap

在Android开发中&#xff0c;位图&#xff08;Bitmap&#xff09;是一个非常重要的图形处理对象&#xff0c;它用于在内存中存储图像数据。以下是关于Android中位图使用的一些关键点和方法&#xff1a; 一、获取位图 从资源文件中获取&#xff1a; 使用BitmapFactory类&#…

头歌资源库(24)插入加号

一、 问题描述 二、算法思想 可以使用动态规划来解决这个问题。 首先将数字串拆分为多个数字&#xff0c;用一个数组nums来存储每个数字。例如&#xff0c;数字串79846会被拆分为数组[7, 9, 8, 4, 6]。 然后定义一个二维数组dp&#xff0c;其中dp[i][j]表示在前i个数字中插入…

Java异常体系、UncaughtExceptionHandler、Spring MVC统一异常处理、Spring Boot统一异常处理

概述 所有异常都是继承自java.lang.Throwable类&#xff0c;Throwable有两个直接子类&#xff0c;Error和Exception。 Error用来表示程序底层或硬件有关的错误&#xff0c;这种错误和程序本身无关&#xff0c;如常见的NoClassDefFoundError。这种异常和程序本身无关&#xff0…

Java网络模型全扫盲

概述 讲述ava层面NIO基础知识&#xff0c;用作基础回顾所用 1. NIO概述 ​ 在Java中&#xff0c;NIO&#xff08;Non-blocking I/O 或 New I/O&#xff09;是Java SE 1.4及后续版本中引入的一套新的输入/输出操作API。 ​ 它与传统的IO模型相比&#xff0c;提供了更高的效率和…