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

📚 相关文档


文档结束

相关推荐
可爱又迷人的反派角色“yang”16 小时前
k8s(四)
linux·网络·云原生·容器·kubernetes·云计算
计算机毕设VX:Fegn089516 小时前
计算机毕业设计|基于springboot + vue律师咨询系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
2501_9399090516 小时前
Rancher 管理 Kubernetes 集群与Pod的详解
容器·kubernetes·rancher
可爱又迷人的反派角色“yang”16 小时前
k8s(二)
linux·运维·docker·云原生·容器·kubernetes·云计算
计算机小手16 小时前
内网穿透系列十六:使用 wg-easy 快速搭建基于 wireguard 的虚拟局域网,支持Docker部署
经验分享·网络协议·docker·开源软件
旧日之血_Hayter16 小时前
docker部署项目,/var/lib/docker/overlay2目录满了如何清理?
运维·docker·容器
m0_4887776516 小时前
Kubernetes基础
云原生·容器·kubernetes·yaml
q_191328469516 小时前
基于Springboo和vue开发的企业批量排班系统人脸识别考勤打卡系统
前端·javascript·vue.js·spring boot·mysql·毕业设计·人脸识别
文言一心16 小时前
基于 Docker + Docker Compose 实现一键部署(单节点部署场景下轻量、易维护、可一键启停)
运维·docker·容器