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 down2. 镜像瘦身技巧
# 使用分阶段构建(已经在上面实现)
# 使用alpine基础镜像
# 清理Maven缓存
RUN mvn dependency:go-offline && \
mvn clean package -DskipTests && \
mvn dependency:purge-local-repository
# 移除不必要的文件
RUN rm -rf /root/.m23. 生产环境部署脚本
创建 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%配置 |
正文到此结束
- 本文标签: docker springboot Java
- 本文链接: https://www.15102.com/article/3
- 版权声明: 本文由原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权