SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目
前述:
本篇教程将略过很多docker下载环境配置的基础步骤,如果您对docker不太熟悉请参考我的上一个教程:SpringBoot新手快速入门系列教程九:基于docker容器,部署一个简单的项目
使用 Docker Compose 支持部署 Docker 项目有许多优势,
对比:使用 Docker 和 Docker Compose
| 功能 | Docker | Docker 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 的优势
- 简化多容器管理:通过一个简单的
docker-compose.yml文件定义所有服务,使用一个命令即可启动或停止整个应用。 - 服务依赖管理:可以定义服务之间的依赖关系,确保按顺序启动。
- 统一网络管理:所有服务自动加入同一个网络,方便服务之间的通信。
- 环境变量和配置管理:可以在
docker-compose.yml文件中统一管理环境变量和配置。 - 易于扩展和缩放:可以简单地通过调整
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
相关文章:
SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目
前述: 本篇教程将略过很多docker下载环境配置的基础步骤,如果您对docker不太熟悉请参考我的上一个教程:SpringBoot新手快速入门系列教程九:基于docker容器,部署一个简单的项目 使用 Docker Compose 支持部署 Docker 项…...
websocket中的STOMP 协议:sockjs-client 和 stompjs
文章目录 一、简介二、安装三、创建 webSocket.ts四、页面中使用一、简介 使用 WebSockets 进行实时通信时,一种常见的实现方式是使用 STOMP 协议。STOMP(Simple Text Oriented Messaging Protocol)是一种轻量级的协议,通常用于客户端和消息代理之间的通信,如 WebSockets…...
阿里云API安全2.0全新发布
阿里云安全发布API防护产品已将近三年,为客户提供API资产全生命周期监控管理,发现和管理业务中存在的全量API接口资产,并提升API接口在数据流转过程中的安全性,现已全面覆盖OWASP提出的API TOP 10安全风险。 近期,阿里…...
学习网络的第一步:全面解析OSI与TCP/IP模型
我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的好朋友小米。今天我们来聊一聊网络基础知识中的重量级选手——OSI模型和TCP/IP模型!网络的世界就像一个巨大的迷宫,而这两个…...
鸿蒙语言基础类库:【@ohos.util (util工具函数)】
util工具函数 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 该模块…...
CVPR`24 | 又快又好!渲染速度比ENeRF快30倍!4K4D:实时4K分辨率4D视图合成
文章链接:https://arxiv.org/pdf/2310.11448 git链接: https://zju3dv.github.io/4k4d/ 本文旨在实现动态3D场景在4K分辨率下的高保真和实时视图合成。最近,一些动态视图合成方法在渲染质量方面表现出色。然而,在渲染高分辨率图像…...
中关村软件园发布“数据合规与出境评估服务平台”
在2024中关村论坛年会期间,中关村软件园发布“数据合规与出境评估服务平台”。该平台是中关村软件园结合北京市“两区”建设,立足软件园国家数字服务出口基地和数字贸易港建设,围绕园区内外部企业用户的业务合作、科研创新、跨国运营等场景需…...
记一次若依框架和Springboot常见报错的实战漏洞挖掘
目录 前言 本次测实战利用图 1.判段系统框架 2.登录页面功能点测试 2.1 弱口令 2.2 webpack泄露信息判断 2.3 未授权接口信息发现 3.进一步测试发现新的若依测试点 3.1 默认弱口令 3.2 历史漏洞 4.访问8080端口发现spring经典爆粗 4.1 druid弱口令 4.2 SwaggerU…...
Idea合并Git分支信息
#git 的笔记 ##本篇文章是通过Idea 实现git 命令操作的代码的上传与合并。 1.合并分支 点击 Git 选择Merge 这里选择合并远程的分支...
【学习css2】grid布局-页面footer部分保持在网页底部
中间内容高度不够屏幕高度撑不开的页面时候,页面footer部分都能保持在网页页脚(最底部)的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…...
Django 表单
Django 表单 Django 表单是 Web 开发中不可或缺的一部分,它允许用户与网站进行交互,如提交数据、上传文件等。在 Django 框架中,表单功能非常强大,支持各种自定义和验证,使得开发者能够轻松地处理用户输入。本文将详细介绍 Django 表单的使用方法,包括创建表单、表单字段…...
【Linux网络】网络基础
本篇博客整理了 Linux 网络编程的前置知识,例如网络的发展、协议和协议栈分层、网络通信原理、网络地址等,为后续进入 Linux 网络编程作铺垫。 目录 一、网络发展 二、网络协议 1)协议的作用 2)协议栈 3)协议分层…...
Open3D 可视化点云配准中匹配点之间的连线
目录 一、概述 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后的点云 一、概述 在点云配准的过程中,可视化匹配点之间的连线(匹配线)有助于更直观地理解配准结果和误差分布。以下是可视化匹配点之间连线的好处和作用: 1. 直观理…...
Linux编程第三篇:Linux简介,开源软件简介(Linux是否安全?参考TESEC指标)
业精于勤荒于嬉,行成于思毁于随。 今天这篇算是Linux的正式学习,废话不多说,我们开始吧 第三篇 一、UNIX与Linux发展史1.1、UNIX发展历史和发行版本1.2、UNIX主要发行版本1.3、Linux发展历史1.4、Linux内核版本1.5、Linux主要发行版本 二、开…...
【JavaSE复习】数据结构、集合
JavaSE 复习 1.数据结构1.1 查找1.1.1 基本查找1.1.2 二分查找1.1.3 插值查找1.1.4 斐波那契查找1.1.5 分块查找1.1.6 分块查找的扩展(无规律数据) 1.2 排序1.2.1 冒泡排序1.2.2 选择排序1.2.3 插入排序1.2.4 快速排序 2. 集合2.1 基础集合2.1.1 集合和数…...
Java版Flink使用指南——自定义无界流生成器
大纲 新建工程自定义无界流 使用打包、提交、运行工程代码 在《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中,我们让外部组件RabbitMQ充当了无界流的数据源,使得Flink进行了流式处理。在《Java版Flink使用指南——将消息写入到RabbitMQ…...
Vue3框架搭建4:配置说明-eslint配置
配置说明: .eslintrc.cjs: /* eslint-env node */ //node环境,并引入一个模块解析补丁 require(rushstack/eslint-patch/modern-module-resolution)module.exports { //继承其他配置root: true, //跟配置文件,ESLint不会在父目…...
JavaFx+MySql学生管理系统
前言: 上个月学习了javafx和mysql数据库,于是写了一个学生管理系统,因为上个月在复习并且有一些事情,比较忙,所以没有更新博客了,这个项目页面虽然看着有点简陋了,但是大致内容还是比较简单的,于是现在跟大家分享一下我的学生管理系统,希望对这方面有兴趣的同学提供一些帮助 &a…...
Java--抽象类
1.抽象--abstract 2.不能对抽象类进行实例化,也就是不能new这个抽象类 3.抽象类的应用,就是在class前加入abstract这个单词,同理抽象方法也是在void前加入abstract 4.在抽象类中可以写普通方法,但抽象方法只能写在抽象类中 5.…...
26.Labview波形图、XY图、强度图使用精讲
我们如何使用Labview显示曲线或者制作出下面这种我们想要的曲线并随着我们输入值的变化而变化呢? 本文详细讲解一下每种波形图的使用方式,帮助大家深入了解波形图的使用技巧。 文章中所有程序均可在百度网盘下载,下载方式:复制下…...
AI时代如何精准识人?大客户销售话术与沟通,AI赋能销售成交铁军的专业销售技巧成交赢单培训老师
读懂这个人,比说服他更重要 AI时代销售影响力 在大客户销售与高效沟通中,我们最大的误区不是话术不够好,而是压根就没读懂对方是谁。AI时代给了我们一把新的钥匙——用三个维度拆解每一个人,让影响力真正落地。 目录 销售沟通的本…...
nvm-desktop技术深度解析:跨平台Node.js版本管理架构设计
nvm-desktop技术深度解析:跨平台Node.js版本管理架构设计 【免费下载链接】nvm-desktop Node Version Manager Desktop - A desktop application to manage multiple active node.js versions. 项目地址: https://gitcode.com/gh_mirrors/nv/nvm-desktop nvm…...
大模型训练师的炼丹之道 (3)-更高级训练,如何把大规模知识“刻”入模型
前言 在《炼丹之道》前两篇中,我们完成了从基础认知到身份重塑的入门仪式——当模型脱口而出“我是威震天”时,你已触摸到微调的魔法边缘。但那终究只是角色扮演的雏形,真正的炼丹术,在于将冰冷、精确的商业事实熔铸为模型的“肌…...
量子Krylov子空间算法与经典阴影技术解析
1. 量子Krylov子空间算法原理与实现量子Krylov子空间算法是当前NISQ(含噪声中等规模量子)时代最具前景的量子-经典混合算法之一。其核心思想是通过构造一组Krylov基矢{|ψₖ⟩} {|ψ₀⟩, H|ψ₀⟩, H|ψ₀⟩,..., H^(d-1)|ψ₀⟩},将高维希…...
记一次 .NET 某集群管理软件 内存暴涨分析
一:背景 1. 讲故事 前些天有位朋友微信找到我,说它的程序出现了内存暴涨,自己也没分析出啥,让我看下到底怎么回事,然后让这位朋友抓一个dump,拿它占一卦就行了。 二:内存暴涨分析 1. 为什么会暴…...
Supervisely完整指南:5步打造AI视觉标注神器
Supervisely完整指南:5步打造AI视觉标注神器 【免费下载链接】supervisely Supervisely SDK for Python - convenient way to automate, customize and extend Supervisely Platform for your computer vision task 项目地址: https://gitcode.com/gh_mirrors/su…...
NotebookLM移动端体验全拆解(iOS/Android双端对比报告·仅限内测用户知晓的性能阈值)
更多请点击: https://kaifayun.com 第一章:NotebookLM移动端体验全景概览 NotebookLM 作为 Google 推出的基于用户自有文档构建的 AI 助手,其移动端(iOS/Android)已正式开放下载。该应用并非简单将网页版界面缩放适配…...
ISTA 3B-2013 全解析|零担货物 (LTL) 综合模拟运输测试标准(CSDN 完整版)前言
前言 ISTA 3B-2013 是 ISTA 3 系列高级综合模拟测试,专门针对零担货物运输(LTL) 的包装件。 零担运输的特点是多货混装、多次中转、人工 / 叉车交叉搬运、环境复杂,因此 3B 是工业、设备、家电、汽配、大型包装最贴近真实物流的测…...
在Nodejs后端服务中集成稳定可靠的大模型能力
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Nodejs后端服务中集成稳定可靠的大模型能力 应用场景类,针对需要构建智能对话或内容生成功能的后端工程师࿰…...
【火箭】基于matlab模拟运载火箭俯仰控制系统中基于IMU的故障检测并结合执行器动力学【含Matlab源码 15550期】含报告
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
