三步走:用 Docker-Compose 轻松部署你的 Spring Boot 应用
一、Docker-Compose是什么
Docker-Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 YAML 文件配置应用的服务、网络和卷,实现一键启动、停止和管理容器化应用的依赖关系。
核心功能
- 多容器编排:通过单一配置文件管理多个容器及其依赖关系。
- 服务定义:使用
docker-compose.yml文件定义服务、镜像、端口映射、环境变量等。 - 一键操作:通过命令行工具执行容器组的启动、停止、重建等操作。
典型应用场景
- 开发环境快速搭建,例如同时启动数据库、后端和前端服务。
- 测试环境中模拟生产环境的依赖服务。
- 微服务架构中管理服务间的连接与配置。
基础命令示例
# 启动所有服务(后台运行)
docker-compose up -d
# 停止并移除容器
docker-compose down
# 查看服务状态
docker-compose ps
优势与局限
- 优势:简化多容器管理,配置文件可版本化,与 Docker 生态无缝集成。
- 局限:适用于本地开发和测试,生产环境建议使用 Kubernetes 等更强大的编排工具。
版本兼容性
Docker-Compose 与 Docker 引擎版本需匹配。建议使用 version: '3' 及以上配置语法以支持最新功能。
二、从零构建spring boot应用
1、服务器目录结构规划
/deploy/
├── docker-compose.yml # 主编排文件(用于编排业务相关服务)
├── docker-compose-data.yml # 主编排文件(用于编排mysql、redis、nacos相关服务)
├── .env # 环境变量配置文件
├── services/ # 各微服务构建上下文
│ ├── auth/
│ │ ├── auth-service.jar # Spring Boot 编译后的 JAR 包
│ │ └── Dockerfile # 构建镜像用
│ ├── gateway/
│ │ ├── gateway-service.jar
│ │ └── Dockerfile
│ ├── server/
│ │ ├── server-service.jar
│ │ └── Dockerfile
│ └── client/
│ └── dist/ # 前端静态资源(Vue/React 打包后)
├── mysql-data/ # MySQL 数据持久化目录
├── redis-data/ # redis 数据持久化目录
├── nacos-data/ # redis 数据持久化目录
│── logs/ # 容器日志挂载目录(可选)
创建目录:
mkdir -p /deploy/services/{auth,gateway,server,client} /deploy/{mysql-data,redis-data,logs,nacos-data}
2、每个服务的 Dockerfile
通用模板(适用于所有 Spring Boot 服务) 所有服务都使用 openjdk:8-jre-slim 镜像,轻量且兼容 JDK 8。

权限服务:/deploy/services/auth/Dockerfile
# 使用 OpenJDK 8 JRE 轻量镜像
FROM openjdk:8-jre-slim
# 设置工作目录
WORKDIR /app
# 复制 JAR 文件(注意:文件名需与实际一致)
COPY auth-service.jar app.jar
# 暴露服务端口(auth 服务通常用 8081)
EXPOSE 8081
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
网关服务:/deploy/services/gateway/Dockerfile
FROM openjdk:8-jre-slim
WORKDIR /app
COPY gateway-service.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
业务服务:/deploy/services/server/Dockerfile
FROM openjdk:8-jre-slim
WORKDIR /app
COPY server-service.jar app.jar
EXPOSE 8082
ENTRYPOINT ["java", "-jar", "app.jar"]
⚠️ 注意: 确保 COPY 的 JAR 文件名与你实际上传的一致 如果你的 JAR 文件包含版本号(如 auth-service-1.0.jar),请相应修改
3、编排文件
由于整个应用在整个项目的生命周期中,部分服务会经常的更新和构建,比如业务相关服务,部分服务会一直处于不更新的状态,比如数据库,中间件等,为了避免频繁构建的时候,带来其他不必要的麻烦,将两种类型的服务放在两个文件中进行构建;
3.1、docker-compose.yml(构建业务相关的服务)
# Docker Compose 版本声明
version: '3.8'
# 定义服务集合
services:
# Nacos 服务
nacos:
image: nacos/nacos-server:v2.4.1
container_name: nacos-server
ports:
- "8848:8848"
environment:
MODE: standalone
SPRING_PROFILES_ACTIVE: standalone
NACOS_LOG_LEVEL: info
volumes:
- nacos-data:/home/nacos/data
- nacos-logs:/home/nacos/logs
restart: unless-stopped
# API 网关服务
gateway:
build: ./services/gateway
image: gateway-service:1.0
container_name: gateway-service
ports:
- "16000:16000"
depends_on:
- nacos
restart: unless-stopped
# 认证服务
auth:
build: ./services/auth
image: auth-service:1.0
container_name: auth-service
ports:
- "15000:15000"
depends_on:
- nacos
restart: unless-stopped
# 业务服务1
server:
build: ./services/server
image: server-service:1.0
container_name: server-service
ports:
- "17001:17001"
environment:
- AUTH_SERVICE_URL=http://auth:15000
depends_on:
- nacos
restart: unless-stopped
# 业务服务2
client:
build: ./services/client
image: client-service:1.0
container_name: client-service
ports:
- "17002:17002"
environment:
- AUTH_SERVICE_URL=http://auth:15000
depends_on:
- nacos
restart: unless-stopped
# 定义数据卷
volumes:
nacos-data:
nacos-logs:
3.2、docker-compose-data.yml(不长更新的相关服务,名字随便起)
# Docker Compose 版本声明
version: '3.8'
# 定义服务集合
services:
# Redis 服务
redis:
image: redis:7.2
container_name: redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
restart: unless-stopped
# MySQL 数据库服务
mysql:
image: mysql:5.7
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: mydatabase
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
restart: unless-stopped
# 定义数据卷
volumes:
mysql-data:
redis-data:
4、创建 .env 环境变量文件
MYSQL_ROOT_PASSWORD=123456
MYSQL_USER=root
MYSQL_PASSWORD=123456
✅ 优点: 避免密码硬编码 docker-compose 自动加载 .env 文件
5、部署操作流程(Linux 服务器上执行)
步骤 1:上传文件
- 将以下文件上传到 /deploy 目录:
- 所有 JAR 文件(auth-service.jar 等上传到对应的路径)
- 每个服务的 Dockerfile
- docker-compose.yml
- .env
- (可选)前端 dist 文件夹
建议采用工具来上传文件,个人推荐 MobaXterm
步骤 2:进入部署目录
cd /deploy
步骤 3:首次构建并启动所有服务
# 先构建数据库,中间件服务,避免后面的应用在启动的时候有依赖,起不起来
docker-compose up -d --build
# 构建业务相关(如果不是标准的 docker-compose.yml,则需要指定对应的编排文件)
docker-compose -f docker-compose-data.yml up -d --build
--build:首次必须使用,构建所有服务镜像
-f 指定的编排文件
步骤 4:查看服务状态
docker-compose ps
输出应类似:
Name Command State Ports
-----------------------------------------------------------------------
auth-service java -jar app.jar Up 0.0.0.0:8081->8081/tcp
gateway-service java -jar app.jar Up 0.0.0.0:8080->8080/tcp
mysql-db docker-entrypoint.sh Up 0.0.0.0:3306->3306/tcp
...
步骤 5:查看日志
# 查看某个服务日志
docker-compose logs auth
docker-compose logs gateway
# 实时查看
docker-compose logs -f server
6、更新某个服务(如更新 auth-service)
# 1. 替换新 JAR
cp /path/to/new/auth-service.jar ./services/auth/auth-service.jar
# 2. 重新构建并启动 auth 服务
docker-compose up -d --build auth
7、服务间调用说明(JDK 8 环境下)
- 网关入口:http://your-server:16000/
- 权限入口:http://your-server:15000/
- 业务入口:http://your-server:17000/
- 数据库连接:jdbc:mysql://mysql:3306/xxx Docker Compose 会自动创建默认网络,服务名即主机名。
8、验证部署成功
| 验证项 | 命令 |
|---|---|
| 所有服务运行中 | docker-compose ps |
| 网关健康检查 | curl http://localhost:8080/actuator/health |
| 认证服务健康 | curl http://localhost:8081/actuator/health |
| 数据库持久化 | docker volume inspect mysql-data |
| 查看 MySQL 数据 | docker exec -it mysql mysql -root -p |
🛡️ 生产建议(JDK 8 环境)
| 建议 | 说明 |
|---|---|
| ✅ 使用 jre-slim 而非 jdk | 更小镜像,适合生产 |
| ✅ 添加 JVM 参数 | 如 -Xms512m -Xmx1g 到 ENTRYPOINT |
| ✅ 定期备份 mysql-data | 防止数据丢失 |
| ✅ 使用 Nginx + HTTPS | 对外暴露 443,反向代理到 8080 |
| ✅ 日志挂载 | - ./logs:/app/logs |
注意:如果docker-compose版本过高,则构建服务的命令为:中间没有 ‘-’ 符号
# 先构建数据库,中间件服务,避免后面的应用在启动的时候有依赖,起不起来
docker compose up -d --build
# 构建业务相关(如果不是标准的 docker-compose.yml,则需要指定对应的编排文件)
docker compose -f docker-compose-data.yml up -d --build
--build:首次必须使用,构建所有服务镜像
-f 指定的编排文件
更多推荐


所有评论(0)