前言
容器化部署已经成为现代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/mydb
复制代码 Q: 内存溢出?
在Dockerfile中设置JVM堆内存限制- ENV JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC"
复制代码 总结
通过本文,你已经掌握了Spring Boot应用Docker容器化的完整流程。关键点:多阶段构建减少镜像体积、非root用户提升安全性、docker-compose实现服务编排。
本文由AI辅助创作。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |