找回密码
 立即注册
首页 业界区 安全 Docker容器化Spring Boot:从构建到部署的完整实战 ...

Docker容器化Spring Boot:从构建到部署的完整实战

胆饬 4 小时前
前言

容器化部署已经成为现代Java应用的标准配置。本文用完整的实战案例,带你从零构建Spring Boot应用的Docker镜像,并实现生产级部署。
一、环境准备


  • Docker Desktop (Windows/Mac) 或 Docker Engine (Linux)
  • Spring Boot 3.x 项目
  • JDK 17+
二、项目结构
  1. my-springboot-app/
  2. ├── src/
  3. ├── Dockerfile          # Docker配置文件
  4. ├── docker-compose.yml   # 编排文件
  5. └── .dockerignore       # 忽略文件
复制代码
三、编写Dockerfile
  1. # 多阶段构建:构建阶段
  2. FROM maven:3.9-eclipse-temurin-17 AS builder
  3. WORKDIR /app
  4. COPY pom.xml .
  5. RUN mvn dependency:go-offline
  6. COPY src ./src
  7. RUN mvn package -DskipTests
  8. # 运行阶段
  9. FROM eclipse-temurin:17-jre-alpine
  10. WORKDIR /app
  11. # 创建非root用户
  12. RUN addgroup -S appgroup && adduser -S appuser -G appgroup
  13. # 复制jar包
  14. COPY --from=builder /app/target/*.jar app.jar
  15. # 设置权限
  16. RUN chown -R appuser:appgroup /app
  17. USER appuser
  18. # 环境变量
  19. ENV JAVA_OPTS="-Xms256m -Xmx512m"
  20. ENV SPRING_PROFILES_ACTIVE=prod
  21. # 健康检查
  22. HEALTHCHECK --interval=30s --timeout=3s \
  23.   CMD wget --quiet --tries=1 --spider http://localhost:8080/actuator/health || exit 1
  24. # 暴露端口
  25. EXPOSE 8080
  26. # 启动命令
  27. ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
复制代码
四、.dockerignore文件
  1. .git
  2. .gitignore
  3. target/
  4. *.md
  5. Dockerfile
  6. docker-compose.yml
  7. *.log
  8. .idea/
  9. *.iml
复制代码
五、构建镜像
  1. # 构建镜像
  2. docker build -t myapp:latest .
  3. # 查看镜像
  4. docker images | grep myapp
  5. # 运行容器
  6. docker run -d -p 8080:8080 --name myapp myapp:latest
  7. # 查看日志
  8. docker logs -f myapp
  9. # 进入容器
  10. docker exec -it myapp sh
复制代码
六、使用docker-compose编排
  1. version: '3.8'
  2. services:
  3.   app:
  4.     build: .
  5.     container_name: my-springboot-app
  6.     ports:
  7.       - "8080:8080"
  8.     environment:
  9.       - SPRING_PROFILES_ACTIVE=prod
  10.       - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb
  11.       - SPRING_DATASOURCE_USERNAME=root
  12.       - SPRING_DATASOURCE_PASSWORD=secret
  13.     depends_on:
  14.       db:
  15.         condition: service_healthy
  16.     restart: unless-stopped
  17.     networks:
  18.       - app-network
  19.   db:
  20.     image: mysql:8.0
  21.     container_name: mysql8
  22.     environment:
  23.       MYSQL_ROOT_PASSWORD: secret
  24.       MYSQL_DATABASE: mydb
  25.     ports:
  26.       - "3306:3306"
  27.     volumes:
  28.       - mysql-data:/var/lib/mysql
  29.     healthcheck:
  30.       test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  31.       interval: 10s
  32.       timeout: 5s
  33.       retries: 5
  34.     networks:
  35.       - app-network
  36. volumes:
  37.   mysql-data:
  38. networks:
  39.   app-network:
  40.     driver: bridge
复制代码
七、优化技巧

1. 使用阿里云镜像加速
  1. # /etc/docker/daemon.json
  2. {
  3.   "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
  4. }
复制代码
2. 缩小镜像体积


  • 使用 alpine 基础镜像
  • 多阶段构建分离编译和运行环境
  • 使用 .dockerignore 排除无关文件
3. 安全加固


  • 使用非root用户运行
  • 只暴露必要端口
  • 敏感信息使用Docker Secret
八、常见问题解决

Q: 容器内无法连接宿主机数据库?
使用 host.docker.internal 代替 localhost
  1. jdbc:mysql://host.docker.internal:3306/mydb
复制代码
Q: 内存溢出?
在Dockerfile中设置JVM堆内存限制
  1. ENV JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC"
复制代码
总结

通过本文,你已经掌握了Spring Boot应用Docker容器化的完整流程。关键点:多阶段构建减少镜像体积、非root用户提升安全性、docker-compose实现服务编排。
本文由AI辅助创作。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册