胆饬 发表于 2026-3-26 13:19:59

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

前言

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


[*]Docker Desktop (Windows/Mac) 或 Docker Engine (Linux)
[*]Spring Boot 3.x 项目
[*]JDK 17+
二、项目结构

my-springboot-app/
├── src/
├── Dockerfile          # Docker配置文件
├── docker-compose.yml   # 编排文件
└── .dockerignore       # 忽略文件三、编写Dockerfile

# 多阶段构建:构建阶段
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# 运行阶段
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app

# 创建非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# 复制jar包
COPY --from=builder /app/target/*.jar app.jar

# 设置权限
RUN chown -R appuser:appgroup /app
USER appuser

# 环境变量
ENV JAVA_OPTS="-Xms256m -Xmx512m"
ENV SPRING_PROFILES_ACTIVE=prod

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget --quiet --tries=1 --spider http://localhost:8080/actuator/health || exit 1

# 暴露端口
EXPOSE 8080

# 启动命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]四、.dockerignore文件

.git
.gitignore
target/
*.md
Dockerfile
docker-compose.yml
*.log
.idea/
*.iml五、构建镜像

# 构建镜像
docker build -t myapp:latest .

# 查看镜像
docker images | grep myapp

# 运行容器
docker run -d -p 8080:8080 --name myapp myapp:latest

# 查看日志
docker logs -f myapp

# 进入容器
docker exec -it myapp sh六、使用docker-compose编排

version: '3.8'
services:
app:
    build: .
    container_name: my-springboot-app
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=secret
    depends_on:
      db:
      condition: service_healthy
    restart: unless-stopped
    networks:
      - app-network

db:
    image: mysql:8.0
    container_name: mysql8
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

volumes:
mysql-data:

networks:
app-network:
    driver: bridge七、优化技巧

1. 使用阿里云镜像加速

# /etc/docker/daemon.json
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}2. 缩小镜像体积


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


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

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

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

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

丰江 发表于 3 天前

热心回复!
页: [1]
查看完整版本: Docker容器化Spring Boot:从构建到部署的完整实战