Docker Compose 部署 Spring Boot 应用完全指南

Docker Compose 部署 Spring Boot 应用完全指南

文档编号:16

创建时间:2026-01-07

相关问答:Docker Compose 部署详解 - 你问我答


📋 前言

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

📚 相关文档


文档结束

相关推荐
等什么君!9 小时前
docker -数据卷技术
运维·docker·容器
m0_740043739 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务
重整旗鼓~10 小时前
1.外卖项目介绍
spring boot
上天_去_做颗惺星 EVE_BLUE10 小时前
Docker高效使用指南:从基础到实战模板
开发语言·ubuntu·docker·容器·mac·虚拟环境
一点技术11 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
shuair11 小时前
redis实现布隆过滤器
spring boot·redis·bootstrap
好好沉淀12 小时前
Docker开发笔记(详解)
运维·docker·容器
RANCE_atttackkk12 小时前
Springboot+langchain4j的RAG检索增强生成
java·开发语言·spring boot·后端·spring·ai·ai编程
禅口魔心13 小时前
Win10 + WSL2 + Docker:K510(DongshanPI-Vision)开发环境从踩坑到跑通全记录(交叉编译 + 上板运行)
docker·嵌入式开发·wsl2·k510
Ankie Wan13 小时前
cgroup(Control Group)是 Linux 内核提供的一种机制,用来“控制、限制、隔离、统计”进程对系统资源的使用。
linux·容器·cgroup·lxc