Docker容器化部署Spring Boot项目实战指南(最新整理)

 更新时间:2026年02月27日 11:02:12   作者:盐城吊霸天  
本文给大家介绍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

十一、总结

通过本指南,您已经掌握了:

  1. Spring Boot项目容器化:包括JSP配置、Maven打包和Docker镜像构建
  2. MySQL容器化:包括数据持久化和网络配置
  3. 容器网络通信:最终采用容器IP(172.17.0.2)直接连接的方式
  4. 镜像拉取问题:通过科学上网工具解决JDK8镜像下载失败问题
  5. 部署验证:包括容器状态检查和应用访问测试
  6. 问题排查:包括常见错误的解决方案
  7. 最佳实践:包括镜像管理、网络配置和容器管理

Docker容器化部署不仅提高了开发和部署效率,也为应用的可扩展性和可维护性奠定了基础。通过合理的配置和管理,您的Spring Boot应用将在容器环境中稳定运行。

到此这篇关于Docker容器化部署Spring Boot项目实战指南的文章就介绍到这了,更多相关docker容器化部署spring boot项目内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker镜像优化打包速度思考

    Docker镜像优化打包速度思考

    本文主要介绍了Docker镜像优化打包速度思考,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Docker compose部署minio服务

    Docker compose部署minio服务

    这篇文章主要介绍了Docker compose部署minio服务,minio的作用就是用来存储文件的,比如图片、视频、音频等各种类型的文件,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Docker搭建Gazee的实现示例

    Docker搭建Gazee的实现示例

    Gazee 是一个 Web 应用,专门用于阅读和管理数字漫画,本文主要介绍了Docker搭建Gazee的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • docker update 命令与环境变量管理方法

    docker update 命令与环境变量管理方法

    本文介绍Docker中dockerupdate命令用于动态调整运行中容器的配置,如资源限制、重启策略等,但部分需重启生效,环境变量在启动时设置,无法动态修改,建议通过挂载文件或Docker Compose管理,感兴趣的朋友跟随小编一起看看吧
    2025-07-07
  • Docker Swarm从部署到基本操作

    Docker Swarm从部署到基本操作

    这篇文章主要介绍了Docker Swarm从部署到基本操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Docker中数据卷(volume)管理的两种方式

    Docker中数据卷(volume)管理的两种方式

    数据卷有两种形式,一种是容器中的某个目录,它可以被别的容器引用,只要有一个容器引用了这个数据卷,数据就不会被删除;另一种数据卷是将容器中的数据卷和宿主机的目录进行挂载。 数据卷可以在多个容器之间共享,修改数据卷不会影响镜像
    2021-07-07
  • 如何解决安装docker的yum工具时报错问题

    如何解决安装docker的yum工具时报错问题

    在安装Docker时遇到yum工具错误可通过更新yum源解决,先卸载旧Docker,备份原yum源,下载新的CentOS-Base.repo文件到指定目录,安装yum工具后,配置Docker的yum源,国内用户建议使用aliyun源以避免访问异常,安装并启动Docker,校验是否成功
    2024-09-09
  • docker ps容器未显示的问题以及排查过程详解

    docker ps容器未显示的问题以及排查过程详解

    这篇文章主要给大家介绍了关于docker ps容器未显示的问题以及排查过程的相关资料,相信各位在使用docker容器的时候,经常docker run -d后台运行后,使用docker ps的时候发现这个容器显示不到,这里给大家介绍下,需要的朋友可以参考下
    2023-09-09
  • docker 容器添加指定网络地址的方法实现

    docker 容器添加指定网络地址的方法实现

    Docker容器运行的时候默认会自动分配一个默认网桥所在网段的IP地址,本文主要介绍了docker容器添加指定网络地址的方法实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 不使用sudo 执行Docker命令的方法

    不使用sudo 执行Docker命令的方法

    本篇文章主要介绍了不使用sudo 执行Docker命令的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论