Docker Compose 部署 Spring Boot 应用完全指南
文档编号:16
创建时间:2026-01-07
📋 前言
Docker Compose 是定义和运行多容器 Docker 应用的最佳工具。本文将详细介绍如何使用 Docker Compose 部署 Spring Boot 应用。
🎯 为什么选择 Docker Compose
优势对比
| 部署方式 | 复杂度 | 可维护性 | 推荐度 |
|---|---|---|---|
| docker run | 高(命令冗长) | 低 | ⭐⭐ |
| Docker Compose | 低(配置文件) | 高 | ⭐⭐⭐⭐⭐ |
| Kubernetes | 很高 | 很高 | ⭐⭐⭐⭐ |
Docker Compose 的核心价值
- ✅ 配置即代码:所有配置在 YAML 文件中
- ✅ 一键部署 :
docker-compose up -d - ✅ 环境一致性:开发、测试、生产环境相同
- ✅ 易于维护:版本控制、代码审查
- ✅ 服务编排:轻松管理多服务依赖
📄 完整配置示例
基础配置
yaml
version: '3.8'
services:
pishi-command:
build:
context: .
dockerfile: Dockerfile
container_name: pishi-app-command
ports:
- "8889:8889"
volumes:
- ./logs:/app/logs
environment:
- SPRING_PROFILES_ACTIVE=prod
- TZ=Asia/Shanghai
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:8889/pishi/command/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
🔍 配置详解
1. build 配置
yaml
build:
context: . # 构建上下文目录
dockerfile: Dockerfile # Dockerfile 文件名
参数说明:
| 参数 | 说明 | 示例 |
|---|---|---|
context |
构建上下文路径 | . 当前目录 ./app 子目录 |
dockerfile |
Dockerfile 文件名 | Dockerfile docker/Dockerfile |
args |
构建参数 | JAVA_VERSION: 8 |
2. ports 端口映射
yaml
ports:
- "8889:8889" # 主机端口:容器端口
格式:
"HOST:CONTAINER"- 绑定特定端口"CONTAINER"- 随机主机端口"HOST:CONTAINER/PROTOCOL"- 指定协议(tcp/udp)
示例:
yaml
ports:
- "8889:8889" # 映射 8889 端口
- "8080-8090:8080-8090" # 端口范围
- "127.0.0.1:8889:8889" # 只绑定到 localhost
3. volumes 卷挂载
yaml
volumes:
- ./logs:/app/logs # 本地目录:容器目录
- ./config:/app/config:ro # :ro 只读
- pishi_data:/app/data # 命名卷
挂载类型对比:
| 类型 | 语法 | 说明 | 示例 |
|---|---|---|---|
| 绑定挂载 | ./host:/container |
主机目录映射 | ./logs:/app/logs |
| 命名卷 | volume_name:/path |
Docker 管理的卷 | data:/app/data |
| 临时文件系统 | /type=tmpfs |
内存存储 | /tmpfs:size=1g |
最佳实践:
yaml
volumes:
# 日志文件 - 使用绑定挂载便于查看
- ./logs:/app/logs
# 配置文件 - 只读挂载更安全
- ./config:/app/config:ro
# 数据持久化 - 使用命名卷
- app_data:/app/data
4. environment 环境变量
yaml
environment:
- SPRING_PROFILES_ACTIVE=prod
- TZ=Asia/Shanghai
- DATABASE_URL=jdbc:mysql://db:3306/app
替代方式 - 使用 .env 文件:
yaml
# docker-compose.yml
services:
app:
environment:
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-dev}
bash
# .env 文件
SPRING_PROFILES_ACTIVE=prod
DATABASE_PASSWORD=secret
5. restart 重启策略
| 策略 | 说明 | 使用场景 |
|---|---|---|
no |
不自动重启 | 调试时 |
always |
总是重启 | 关键服务 |
on-failure |
失败时重启 | 允许正常退出 |
unless-stopped |
除非手动停止 | 推荐 ✅ |
6. healthcheck 健康检查
yaml
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:8889/actuator/health"]
interval: 30s # 检查间隔
timeout: 10s # 超时时间
retries: 3 # 重试次数
start_period: 60s # 启动宽限期
健康检查命令格式:
yaml
# 字符串格式
test: wget -q -S http://localhost:8889/actuator/health
# 列表格式
test: ["CMD", "wget", "-q", "--spider", "http://localhost:8889/actuator/health"]
# Shell 格式
test: ["CMD-SHELL", "curl -f http://localhost:8889/actuator/health || exit 1"]
🚀 使用流程
首次部署
bash
# 1. 构建 JAR
mvn clean package -DskipTests
# 2. 复制 JAR 到 docker-compose 目录
cp target/pishi-app-command.jar ./pishi-app-command.jar
# 3. 构建镜像
docker-compose build
# 4. 启动服务
docker-compose up -d
# 5. 查看状态
docker-compose ps
# 6. 查看日志
docker-compose logs -f
更新部署
bash
# 1. 构建新 JAR
mvn clean package -DskipTests
# 2. 复制 JAR
cp target/pishi-app-command.jar ./pishi-app-command.jar
# 3. 重新构建镜像
docker-compose build
# 4. 重启服务
docker-compose up -d
# 或一步完成
docker-compose up -d --build
停止和清理
bash
# 停止服务
docker-compose stop
# 停止并删除容器
docker-compose down
# 停止并删除容器和数据卷
docker-compose down -v
📊 常用命令速查
查看类命令
bash
# 查看所有服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
# 查看特定服务日志
docker-compose logs pishi-command
# 实时跟踪日志
docker-compose logs -f
# 查看最近 100 行
docker-compose logs --tail=100
管理类命令
bash
# 启动服务
docker-compose start
# 停止服务
docker-compose stop
# 重启服务
docker-compose restart
# 暂停服务
docker-compose pause
# 恢复服务
docker-compose unpause
构建类命令
bash
# 构建镜像
docker-compose build
# 强制重新构建(不使用缓存)
docker-compose build --no-cache
# 构建并启动
docker-compose up -d --build
进入容器
bash
# 进入容器 Shell
docker-compose exec pishi-command sh
# 在容器中执行命令
docker-compose exec pishi-command ps aux
# 查看容器环境变量
docker-compose exec pishi-command env
🔧 高级配置
多服务编排
yaml
version: '3.8'
services:
# 应用服务
app:
build: .
ports:
- "8889:8889"
depends_on:
- mysql
- redis
environment:
- MYSQL_HOST=mysql
- REDIS_HOST=redis
# MySQL 数据库
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- mysql_data:/var/lib/mysql
# Redis 缓存
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
mysql_data:
redis_data:
网络配置
yaml
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
networks:
frontend:
backend:
driver: bridge
资源限制
yaml
services:
app:
deploy:
resources:
limits:
cpus: '2.0' # 最多 2 个 CPU
memory: 1G # 最多 1GB 内存
reservations:
cpus: '0.5' # 保留 0.5 个 CPU
memory: 512M # 保留 512MB 内存
💡 最佳实践
1. 使用 .env 文件管理环境变量
bash
# .env
SPRING_PROFILES_ACTIVE=prod
MYSQL_PASSWORD=secure_password
yaml
# docker-compose.yml
environment:
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
2. 使用命名卷而非绑定挂载(对于数据)
yaml
volumes:
- app_data:/app/data # ✅ 好于
- ./data:/app/data # 跨平台兼容
3. 添加健康检查
yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8889/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
4. 使用多阶段构建优化镜像
dockerfile
# 构建阶段
FROM maven:3.8.6-openjdk-8-slim AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src .
RUN mvn package -DskipTests
# 运行阶段
FROM openjdk:8-jre-alpine
COPY --from=builder /build/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
🐛 常见问题排查
问题 1:端口被占用
bash
# 错误
Bind for 0.0.0.0:8889 failed: port is already allocated
# 解决:检查占用
lsof -i :8889
# 停止占用端口的容器
docker stop <container_id>
问题 2:容器启动失败
bash
# 查看详细日志
docker-compose logs -f
# 查看容器状态
docker-compose ps -a
# 查看容器事件
docker-compose events
问题 3:volume 权限问题
bash
# 解决:设置正确的用户
user: "1000:1000"
# 或在 Dockerfile 中设置
RUN chown -R 1000:1000 /app/logs
📚 相关文档
文档结束