基于Docker Compose部署Java微服务项目
一. 创建根项目
根项目(父项目)主要用于依赖管理
一些需要注意的点:
- 打包方式需要为 pom
- <modules>里需要注册子模块
- 不要引入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
这个模块主要是配置一些所有人都需要引入的包或一些公共内容(比如全局异常类、控制层返回结果的泛型类等等),所以微服务模块都注册这个模块,实现对公共包的引入
一些需要注意的点:
- 除了根项目外,其他的打包方式都为jar
- 在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}
三. 创建微服务模块
需要注意的点:
- 在yml里Nacos的配置地址需要写成docker里的nacos容器名而非公网ip
- 要指定主类<mainClass>,不然打包之后, 执行 java -jar 会报找不到主类
- <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
需要注意的点:
- 由于这里只是简单的配置了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
部署成功