原创

10分钟搞定SpringBoot Docker化部署,效率提升200%!

告别繁琐的部署流程,一个Dockerfile让你的SpringBoot应用随处运行!

环境检查

1. 确保已安装:

SSH连接到服务器,执行以下的命令,检查环境,未安装的可参考: https://www.15102.com/article/4,进行安装

# 检查Docker是否安装
docker --version
# Docker version 24.0.5 或更高版本

# 检查Java版本
java -version
# openjdk version "17.0.8" 或更高

2. 创建一个简单的SpringBoot项目(已有项目可跳过)

可参考: https://www.15102.com/article/5

# 使用Spring Initializr或IDE创建
# 或直接使用以下Maven坐标:
# - Spring Boot 3.x
# - Web依赖
# - 打包方式:jar

实操开始:4步完成Docker化

步骤1:创建Dockerfile文件

在项目根目录创建 Dockerfile文件,填入以下内容后,ESC退出编辑模式,按住shift+冒号键输入wq进行保存:

vim Dockerfile

# 1. 构建阶段:使用Maven构建应用
FROM maven:3.9.6-eclipse-temurin-17-alpine AS build

# 设置工作目录
WORKDIR /app

# 复制Maven配置文件和源码
COPY pom.xml .
COPY src ./src

# 构建应用(跳过测试加快速度)
RUN mvn clean package -DskipTests -Dmaven.test.skip=true

# 2. 运行阶段:使用轻量级JRE
FROM eclipse-temurin:17-jre-alpine

# 设置工作目录
WORKDIR /app

# 创建非root用户(安全最佳实践)
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring

# 从构建阶段复制jar包
COPY --from=build /app/target/*.jar app.jar

# 暴露端口(根据你的应用修改)
EXPOSE 8080

# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]

# 可选:添加健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1

步骤2:创建 .dockerignore 文件

创建 .dockerignore 文件,排除不必要的文件:

vim .dockerignore

# 忽略构建输出
target/
bin/
build/

# 忽略版本控制
.git/
.gitignore

# 忽略IDE文件
.idea/
*.iml
.vscode/
.project

# 忽略系统文件
.DS_Store
Thumbs.db

# 忽略日志
*.log
logs/

# 忽略配置文件(生产环境使用外部配置)
application*.yml
application*.properties

步骤3:构建Docker镜像

# 进入项目根目录
cd your-springboot-project

# 构建镜像(注意最后的点)
docker build -t springboot-app:1.0.0 .

# 查看构建的镜像
docker images | grep springboot-app

加速技巧:使用多阶段构建,最终镜像只有100MB左右!

步骤4:运行容器

# 基础运行
docker run -d -p 8080:8080 --name myapp springboot-app:1.0.0

# 高级运行方式(带环境变量和挂载)
docker run -d \
  -p 8080:8080 \
  -p 8081:8081 \
  --name myapp \
  --restart unless-stopped \
  -e "SPRING_PROFILES_ACTIVE=prod" \
  -e "JAVA_OPTS=-Xmx512m" \
  -v /host/path/logs:/app/logs \
  springboot-app:1.0.0

# 查看运行状态
docker ps

# 查看日志
docker logs -f myapp

# 测试应用
curl http://localhost:8080/health

进阶优化

1. 使用Docker Compose(适合多服务)

创建 docker-compose.yml文件

vim docker-compose.yml

version: '3.8'

services:
  app:
    build: .
    container_name: springboot-app
    ports:
      - "8080:8080"
      - "8081:8081"  # 管理端口
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - DB_HOST=mysql
    depends_on:
      - mysql
    networks:
      - app-network
    # 健康检查
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  mysql:
    image: mysql:8.0
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: appdb
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:

启动服务:

# 一键启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 停止服务
docker-compose down

2. 镜像瘦身技巧

# 使用分阶段构建(已经在上面实现)
# 使用alpine基础镜像
# 清理Maven缓存
RUN mvn dependency:go-offline && \
    mvn clean package -DskipTests && \
    mvn dependency:purge-local-repository
    
# 移除不必要的文件
RUN rm -rf /root/.m2

3. 生产环境部署脚本

创建 deploy.sh

#!/bin/bash

# 部署脚本
APP_NAME="springboot-app"
VERSION="1.0.0"
PORT=8080

echo "1. 停止旧容器..."
docker stop $APP_NAME || true
docker rm $APP_NAME || true

echo "2. 删除旧镜像..."
docker rmi $APP_NAME:$VERSION || true

echo "3. 构建新镜像..."
docker build -t $APP_NAME:$VERSION .

echo "4. 启动新容器..."
docker run -d \
  --name $APP_NAME \
  -p $PORT:8080 \
  --restart always \
  -e TZ=Asia/Shanghai \
  $APP_NAME:$VERSION

echo "5. 部署完成!"
echo "应用地址:http://localhost:$PORT"

验证部署

# 1. 检查容器状态
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

# 2. 检查应用健康状态
curl http://localhost:8080/actuator/health | python -m json.tool

# 3. 查看资源使用情况
docker stats --no-stream

# 4. 进入容器调试(如果需要)
docker exec -it myapp sh

# 5. 查看实时日志
docker logs --tail 50 -f myapp

常见问题解决

问题解决方法
端口被占用修改 -p 8081:8080 或使用 --net=host
内存不足添加 -e JAVA_OPTS="-Xmx256m -Xms128m"
时区问题添加 -e TZ=Asia/Shanghai
启动慢使用 -e JAVA_TOOL_OPTIONS="-Dspring.main.lazy-initialization=true"
镜像太大使用多阶段构建,选择alpine基础镜像

效率提升对比

传统部署Docker部署效率提升
安装JDK、配置环境无需安装,自带环境节省90%时间
解决环境差异环境一致,一次构建到处运行减少80%问题
手动部署流程一键部署/自动化节省70%人工
多服务编排复杂Docker Compose/K8s管理简化80%配置


正文到此结束
本文目录