当前位置: 首页 > news >正文

基于Docker Compose部署Java微服务项目

一. 创建根项目

根项目(父项目)主要用于依赖管理

一些需要注意的点:

  1. 打包方式需要为 pom
  2. <modules>里需要注册子模块
  3. 不要引入maven的打包插件,否则打包时会出问题
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.cqw.simpleproject</groupId><artifactId>simpleproject</artifactId><version>0.0.1-SNAPSHOT</version><name>simpleproject</name><description>simpleproject</description><!--  打包方式为pom  --><packaging>pom</packaging><!--  版本变量  --><properties><java.version>17</java.version><spring-cloud.version>2021.0.1</spring-cloud.version><spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><lombok.version>1.18.20</lombok.version><spring-boot.version>2.6.3</spring-boot.version><maven-plugin.version>3.1.1</maven-plugin.version><mavem-compiler-version>3.8.1</mavem-compiler-version></properties><!--  注册子模块  --><modules><module>common</module><module>realproject</module></modules><!-- 父依赖控制大版本 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><type>pom</type><scope>import</scope><version>${spring-boot.version}</version></dependency><!--      spring cloud      --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--	spring cloud alibaba		--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!--	lombok		--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></dependencyManagement><!--管理插件版本依赖--><build><pluginManagement><plugins><!--        构建Spring Boot程序        --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${maven-plugin.version}</version></plugin><!--        控制jdk编译的版本        --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${mavem-compiler-version}</version><configuration><source>17</source><target>17</target></configuration></plugin></plugins></pluginManagement></build>
</project>

二. 创建公共模块common

这个模块主要是配置一些所有人都需要引入的包或一些公共内容(比如全局异常类、控制层返回结果的泛型类等等),所以微服务模块都注册这个模块,实现对公共包的引入

一些需要注意的点:

  1. 除了根项目外,其他的打包方式都为jar
  2. 在yml里Nacos的配置地址需要写成docker里的nacos容器名而非公网ip

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--  指定根项目为父  --><parent><groupId>org.cqw.simpleproject</groupId><artifactId>simpleproject</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>org.cqw.simpleproject</groupId><artifactId>common</artifactId><version>0.0.1-SNAPSHOT</version><name>common</name><description>common</description><!--  除了根项目外,剩下的项目打包方式都为jar  --><packaging>jar</packaging><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--    服务发现    --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--    配置中心    --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

yml

spring:application:name: commoncloud:nacos:discovery:server-addr: nacos #尤其注意!这里填写的是在docker里的服务名而非公网idport: 8848config:server-addr: nacos #尤其注意!这里填写的是在docker里的服务名而非公网idfile-extension: yml #在nacos上配置的是ymlconfig:import:#配置导入的文件的全称,不配置启动会报错- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}

三. 创建微服务模块

需要注意的点:

  1. 在yml里Nacos的配置地址需要写成docker里的nacos容器名而非公网ip
  2. 要指定主类<mainClass>,不然打包之后, 执行 java -jar 会报找不到主类
  3. <spring-boot-maven-plugin>的配置尤其注意,如果没有repackage,打包的jar则不包含所有的依赖包,在其他服务器是无法直接执行的

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.cqw.simpleproject</groupId><artifactId>simpleproject</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>org.cqw.simpleproject</groupId><artifactId>realproject</artifactId><version>0.0.1-SNAPSHOT</version><name>realproject</name><description>realproject</description><packaging>jar</packaging><dependencies><!--   直接引入公共模块即可     --><dependency><groupId>org.cqw.simpleproject</groupId><artifactId>common</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies><!--   引入maven插件     --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!--    指定主类,不然打包之后,java -jar会报找不到主类 --><configuration><mainClass>org.cqw.simpleproject.realproject.RealprojectApplication</mainClass><!--      不跳过插件              --><skip>false</skip></configuration><!--        将项目打包成一个可执行的jar,包含了所有依赖包在里面        --><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

yml

spring:application:name: realprojectcloud:nacos:discovery:server-addr: nacos #尤其注意!这里填写的是在docker里的容器名而非公网ipport: 8848config:server-addr: nacos #尤其注意!这里填写的是在docker里的容器名而非公网ipfile-extension: yml #在nacos上配置的是ymlconfig:import:#配置导入的文件的全称,不配置启动会报错- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}

一个简单的Controller用于验证

package org.cqw.simpleproject.realproject.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author yamu* @version 1.0* @description* @date 2025/6/5 11:47*/@RestController
@RequestMapping()
public class TestController {@RequestMapping("/hello")public String hello() {return "Hello World";}
}

四. 打包,发送到虚拟机或服务器上

执行maven插件的打包
在这里插入图片描述

上述完成后,目录结构如下:
在这里插入图片描述

接着把/realproject/target/realproject-0.0.1-SNAPSHOT.jar发送到服务器或虚拟机上

五. 编写docker-compose.yaml

需要注意的点:

  1. 由于这里只是简单的配置了docker-compose .yaml,没法等nacos启动完毕了之后再启动该微服务,所以加了restart: always,如果微服务报nacos连接失败的错误,可以排查一下这一点,也可以先启动了nacos再启动该微服务
version: "2"
services:realproject:image: openjdk:17-jdkcontainer_name: realprojectports:- "8061:8061"volumes:- /mydata/simpleproject:/appenvironment:- TZ="Asia/Shanghai"command: java -jar /app/realproject-0.0.1-SNAPSHOT.jar #/app是容器里的目录,对应上面的volumes的挂载restart: alwaysdepends_on:- nacosnacos:image: nacos/nacos-server:v2.5.1container_name: nacosenvironment:- PREFER_HOST_MODE=hostname- MODE=standalone# 省略了一些内容- NACOS_AUTH_IDENTITY_KEY=- NACOS_AUTH_IDENTITY_VALUE=- NACOS_AUTH_TOKEN=- JVM_XMS=512m- JVM_XMX=512m- JVM_XMN=256mvolumes:- /mydata/nacos/log:/var/log/nacos- /mydata/standalone-logs/:/mydata/nacos/logsports:- "8848:8848"- "9848:9848"

在docker-compose.yaml目录下,执行

docker compose up

部署成功

在这里插入图片描述

在这里插入图片描述

http://www.xdnf.cn/news/887473.html

相关文章:

  • 项目根目录添加<meta>标签,记录当前部署版本、分支、时间
  • 分布式光纤传感(DAS)技术应用解析:从原理到落地场景
  • Python语法进阶篇 --- 类和对象
  • git连接本地仓库以及gitee
  • TypeScript进阶知识点
  • 14.AI搭建preparationのBERT预训练模型进行文本分类
  • 企业入驻成都芯谷金融中心·文化科技产业园优势深度解析
  • 浅谈 Linux 防火墙:从原理到实践
  • JSON Web Token (JWT) 详解:由来、原理与应用实践
  • FPGA 的硬件结构
  • Cursor 集成 Figma MCP 实现阅读理解原型图生成方案
  • 【Fifty Project - D33】
  • PlayWright | 初识微软出品的 WEB 应用自动化测试框架
  • 记一次 Windows XP 系统安装配置 Minio
  • vue对axios的封装和使用
  • 在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标
  • 动态表单 LiveCycle 与 AcroForms 对比
  • VAE变分自编码器详解
  • 用 NGINX 搭建高效 IMAP 代理`ngx_mail_imap_module`
  • v-if与v-for联合使用
  • IDEA 开发PHP配置调试插件XDebug
  • 【C++11新特性】
  • 移动应用开发期末复习
  • 能不能用string接收数据库的datetime类型字段
  • ServBay 1.13.0 更新,新增第三方反向代理/内网穿透
  • 【C语言练习】082. 使用C语言实现简单的加密算法
  • 钉钉 - 机器人消息推送(签名版)
  • 【C++高阶二】STL的map和set
  • 软件测试基础知识总结
  • 基于51单片机的温控电机系统