Docker容器化部署Spring Boot项目实战指南(最新整理)
一、项目背景与技术栈
1. 项目概述
- 项目名称:Spring Boot应用
- 核心功能:用户管理系统(UserIndexController)
- 技术栈:
- Spring Boot
- JSP视图
- MySQL数据库
- Docker容器化
2. 部署目标
- 将Spring Boot应用容器化
- 将MySQL数据库容器化
- 实现容器间网络通信
- 确保应用正常访问
二、Docker基础配置
1. 环境准备
- Docker版本:支持Docker Compose
- 网络配置:默认bridge网络或自定义网络
- 存储配置:Docker卷用于MySQL数据持久化
- 网络环境:需要稳定的网络连接(镜像拉取可能需要科学上网)
2. 核心概念
- 镜像:应用的可执行包
- 容器:镜像的运行实例
- 网络:容器间通信的桥梁
- 卷:数据持久化存储
三、Spring Boot项目配置
1. JSP视图配置
问题:访问UserIndexController的listUser方法跳转"index"页面时出现404错误 解决方案:
修改pom.xml:配置JSP文件打包
<resources>
<resource>
<directory>src/main/resources</directory>
<includes><include>**/*.*</include></includes>
</resource>
<resource>
<directory>src/main/webapp/WEB-INF/jsp</directory>
<targetPath>WEB-INF/jsp</targetPath>
<includes><include>**/*.*</include></includes>
</resource>
</resources>修改application.properties:配置JSP视图解析器
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
2. 数据库配置
配置文件:application.properties
spring.datasource.url=jdbc:mysql://mysql8:3306/wxdev? useUincode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
四、MySQL容器部署
1. 基础部署
# 运行MySQL容器
docker run -d --name mysql8 -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root \ -e MYSQL_DATABASE=wxdev \ -v mysql-data:/var/lib/mysql \ mysql:8.0
2. 数据持久化
- 使用Docker卷:-v mysql-data:/var/lib/mysql
- 优势:容器重启后数据不丢失,便于备份和迁移
3. 网络配置
- 默认网络:容器IP通常为172.17.0.x
- 端口映射:-p 3306:3306,宿主机可访问
- 实际IP:MySQL容器IP为172.17.0.2(最终使用此IP连接)
五、Spring Boot应用容器化
1. 项目打包
运行
# 清理并打包项目
mvn clean package -DskipTests
2. Dockerfile配置
FROM amazoncorretto:8-alpine COPY target/springboot-0.0.1-SNAPSHOT.war app.war ENTRYPOINT ["java","-jar","/app.war"]
3. .dockerignore配置
问题:构建时出现"target目录不存在"错误 解决方案:修改.dockerignore文件
.git/ .gitignore .idea/ *.iml .DS_Store *.log
# 不要包含target目录
4. 构建镜像
问题:下载JDK8镜像时失败 解决方案:使用科学上网工具后成功下载
# 构建Spring Boot镜像
docker build -t springboot-app .
六、容器网络通信
1. 网络模式选择
- 默认bridge网络:通过IP地址通信
- 自定义网络:支持容器名称DNS解析
- host网络:与宿主机共享网络(不推荐)
2. 连接方式
最终方案:使用容器IP连接
# 获取MySQL容器IP(实际IP为172.17.0.2)
MYSQL_IP=$(docker inspect --format '{{range.NetworkSettings.
Networks}}{{.IPAddress}}{{end}}' mysql8)
# 运行Spring Boot容器(使用实际IP)
docker run -d --name springboot-app -p 8080:8080 \
-e 'SPRING_DATASOURCE_URL=jdbc:mysql://172.17.0.2:3306/wxdev?
useUincode=true&characterEncoding=utf-8' \
-e SPRING_DATASOURCE_USERNAME=root \
-e SPRING_DATASOURCE_PASSWORD=root \
springboot-app备选方案:使用docker-compose
version: '3.8'
services:
springboot-app:
image: springboot-app
container_name: springboot-app
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql8:3306/wxdev?
useUincode=true&characterEncoding=utf-8
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=root
depends_on:
- mysql8
networks:
- app-network
restart: unless-stopped
mysql8:
image: mysql:8.0
container_name: mysql8
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=wxdev
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
restart: unless-stopped
networks:
app-network:
driver: bridge
volumes:
mysql-data:3. 网络连通性测试
运行
# 进入Spring Boot容器
docker exec -it springboot-app sh
# 测试IP连通性
ping 172.17.0.2
# 测试MySQL端口
telnet 172.17.0.2 3306
七、部署验证
1. 容器状态检查
运行
# 查看所有容器状态
docker ps
# 查看Spring Boot容器日志
docker logs springboot-app
# 查看MySQL容器日志
docker logs mysql8
2. 应用访问测试
运行
# 测试应用访问
curl http://localhost:8080/
# 查看应用启动状态
docker logs springboot-app | grep "Started Application"
3. 数据库连接测试
运行
# 进入MySQL容器
docker exec -it mysql8 mysql -u root -p
# 查看数据库
show databases;
use wxdev;
show tables;
八、常见问题与解决方案
1. 构建问题
- 问题:.dockerignore包含target导致构建失败
- 解决方案:修改.dockerignore移除target配置
- 问题:镜像拉取403 Forbidden或下载失败
- 解决方案:使用科学上网工具后成功下载,或使用国内镜像源
- 问题:运行命令时-e: command not found
- 解决方案:使用单引号包围环境变量值
2. 网络问题
- 问题:UnknownHostException: mysql8
- 解决方案:最终采用直接使用容器IP(172.17.0.2)连接的方式
- 问题:127.0.0.1无法访问
- 解决方案:容器内127.0.0.1指向容器本身,使用容器IP或网络别名
3. 应用问题
- 问题:JSP文件404错误
- 解决方案:确保JSP文件正确打包到WEB-INF/jsp目录
- 问题:数据库连接失败
- 解决方案:使用容器实际IP(172.17.0.2)进行连接
九、最佳实践
1. 镜像管理
- 使用官方基础镜像
- 最小化镜像大小
- 定期更新镜像
- 准备科学上网环境以应对镜像拉取问题
2. 网络配置
- 生产环境使用自定义网络
- 开发环境可直接使用容器IP
- 配置网络安全策略
3. 存储管理
- 使用Docker卷持久化数据
- 定期备份重要数据
- 监控存储使用情况
4. 容器管理
- 使用docker-compose管理多容器应用
- 配置健康检查
- 设置合理的重启策略
5. 部署流程
- 自动化构建和部署
- 环境变量分离
- 版本控制和回滚机制
十、完整部署脚本
1. 一键部署脚本
#!/bin/bash
# 清理并打包项目
echo "=== 打包Spring Boot项目 ==="
mvn clean package -DskipTests
# 构建Docker镜像(注意:可能需要科学上网)
echo "=== 构建Docker镜像 ==="
docker build -t springboot-app .
# 运行MySQL容器
echo "=== 运行MySQL容器 ==="
docker run -d --name mysql8 -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=wxdev \
-v mysql-data:/var/lib/mysql \
mysql:8.0
# 获取MySQL容器IP
echo "=== 获取MySQL容器IP ==="
MYSQL_IP=$(docker inspect --format '{{range.NetworkSettings.
Networks}}{{.IPAddress}}{{end}}' mysql8)
echo "MySQL容器IP: $MYSQL_IP"
# 运行Spring Boot容器(使用实际IP)
echo "=== 运行Spring Boot容器 ==="
docker run -d --name springboot-app -p 8080:8080 \
-e 'SPRING_DATASOURCE_URL=jdbc:mysql://'$MYSQL_IP':3306/wxdev?
useUincode=true&characterEncoding=utf-8' \
-e SPRING_DATASOURCE_USERNAME=root \
-e SPRING_DATASOURCE_PASSWORD=root \
springboot-app
# 验证部署
echo "=== 验证部署 ==="
sleep 10
docker ps
curl http://localhost:8080/2. docker-compose部署
# docker-compose.yml
version: '3.8'
services:
springboot-app:
build: .
container_name: springboot-app
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql8:3306/wxdev?
useUincode=true&characterEncoding=utf-8
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=root
depends_on:
- mysql8
networks:
- app-network
restart: unless-stopped
mysql8:
image: mysql:8.0
container_name: mysql8
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=wxdev
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
restart: unless-stopped
networks:
app-network:
driver: bridge
volumes:
mysql-data:# 启动服务
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs springboot-app
十一、总结
通过本指南,您已经掌握了:
- Spring Boot项目容器化:包括JSP配置、Maven打包和Docker镜像构建
- MySQL容器化:包括数据持久化和网络配置
- 容器网络通信:最终采用容器IP(172.17.0.2)直接连接的方式
- 镜像拉取问题:通过科学上网工具解决JDK8镜像下载失败问题
- 部署验证:包括容器状态检查和应用访问测试
- 问题排查:包括常见错误的解决方案
- 最佳实践:包括镜像管理、网络配置和容器管理
Docker容器化部署不仅提高了开发和部署效率,也为应用的可扩展性和可维护性奠定了基础。通过合理的配置和管理,您的Spring Boot应用将在容器环境中稳定运行。
到此这篇关于Docker容器化部署Spring Boot项目实战指南的文章就介绍到这了,更多相关docker容器化部署spring boot项目内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


最新评论