基于 Docker 容器化的单机部署方案:MySQL · Redis · Spring Boot · Nginx
|------|---------------------------------------------|
| 文档信息 ||
| 文档类别 | 技术部署手册 |
| 适用系统 | JSH_ERP 开源 ERP(Spring Boot + MySQL + Redis) |
| 部署方式 | Docker 单机四容器(docker run + 自定义网络) |
| 发布日期 | 2026 年 11 月 |
目录
[1.1 安装基础工具与 Docker](#1.1 安装基础工具与 Docker)
[1.2 验证 Docker 环境](#1.2 验证 Docker 环境)
[1.3 安装 JDK 8 与 Maven(用于源码打包)](#1.3 安装 JDK 8 与 Maven(用于源码打包))
[二、拉取 JSH_ERP 项目源码](#二、拉取 JSH_ERP 项目源码)
[2.1 克隆仓库](#2.1 克隆仓库)
[2.2 确认项目结构](#2.2 确认项目结构)
[3.1 修改数据源与 Redis 配置](#3.1 修改数据源与 Redis 配置)
[3.2 Maven 打包](#3.2 Maven 打包)
[3.3 准备 Dockerfile](#3.3 准备 Dockerfile)
[五、部署 MySQL 数据库](#五、部署 MySQL 数据库)
[5.1 启动 MySQL 容器](#5.1 启动 MySQL 容器)
[5.2 验证 MySQL 就绪](#5.2 验证 MySQL 就绪)
[5.3 导入 ERP 初始化数据](#5.3 导入 ERP 初始化数据)
[六、部署 Redis 缓存](#六、部署 Redis 缓存)
[七、构建并部署 Spring Boot 后端](#七、构建并部署 Spring Boot 后端)
[7.1 构建后端镜像](#7.1 构建后端镜像)
[7.2 启动后端容器](#7.2 启动后端容器)
[7.3 验证后端启动成功](#7.3 验证后端启动成功)
[八、部署 Nginx 反向代理](#八、部署 Nginx 反向代理)
[8.1 准备 Nginx 配置](#8.1 准备 Nginx 配置)
[8.2 启动 Nginx 容器](#8.2 启动 Nginx 容器)
[8.3 验证代理链路](#8.3 验证代理链路)
[9.1 访问系统](#9.1 访问系统)
[9.2 登录系统](#9.2 登录系统)
[9.3 部署验收清单](#9.3 部署验收清单)
概述
系统简介
JSH_ERP(又称"华夏 ERP")是一款开源的企业级进销存/生产管理系统,技术栈为 Spring Boot + MyBatis + MySQL + Redis,功能覆盖采购、销售、库存、生产与财务报表。本手册介绍如何在一台 Linux 服务器上使用 Docker 容器化部署 JSH_ERP,并通过浏览器访问系统。
部署架构
本方案将 MySQL、Redis、Spring Boot 后端、Nginx 四个服务以容器方式集中部署在同一台服务器上,通过自定义 Docker 桥接网络 erp-net 实现容器间通信:
- 后端容器通过容器名 mysql:3306、redis:6379 访问数据库与缓存;
- Nginx 容器将 80 端口的 HTTP 请求反向代理到后端容器的 9999 端口;
- 外部浏览器只需访问 http://服务器IP 即可使用系统。
架构链路:浏览器 → 服务器 80 端口(Nginx 容器)→ jsh-erp 容器 9999 端口(Spring Boot)→ mysql / redis 容器 。
环境要求
|--------|------------------------------------------|
| 项目 | 要求 |
| 操作系统 | Linux(CentOS 7+/Ubuntu 20.04+ 均可) |
| 硬件配置 | 建议 2 核 CPU / 4GB 内存 / 20GB 磁盘以上 |
| 软件依赖 | Git、Docker 20.10+、JDK 8 与 Maven(仅打包阶段使用) |
| 网络要求 | 服务器可访问公网(拉取镜像与源码) |
部署前须知
- 手册默认以 root 用户操作;非 root 用户请在命令前加 sudo。
- 版本约定:MySQL 使用 5.7(兼容性最好,MySQL 8 的注意事项见"常见问题排查")、Redis 6.2、Nginx 1.25、JDK 8。
- 预计部署时长:首次操作约 40~60 分钟(含源码构建)。
一、环境准备
1.1 安装基础工具与 Docker
以 CentOS 7 为例(Ubuntu 将 yum 换为 apt 即可):
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 安装 Git 及基础工具 yum install -y git vim curl # 安装 Docker(使用阿里云镜像源) curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 启动 Docker 并设置开机自启 systemctl start docker systemctl enable docker |
1.2 验证 Docker 环境
|------------------------------|
| docker --version docker info |
预期输出示例:Docker version 24.x.x, build xxxxx,且 docker info 能正常显示 Server 信息。若报错 Cannot connect to the Docker daemon,请确认已执行 systemctl start docker。
1.3 安装 JDK 8 与 Maven(用于源码打包)
|------------------------------------------------------------------------------------------------------|
| # 安装 OpenJDK 8 与 Maven yum install -y java-1.8.0-openjdk-devel maven # 验证 java -version mvn -version |
预期输出:openjdk version "1.8.0_xxx" 与 Apache Maven 3.x.x。
|----------------------------------------------------------|
| ⚠️ 注意:JSH_ERP 后端基于 JDK 8 开发,请勿使用更高版本 JDK 编译,否则可能出现依赖不兼容。 |
二、拉取 JSH_ERP 项目源码
2.1 克隆仓库
|------------------------------------------------------------------------------------------------------------------------------------------|
| # 创建部署工作目录 mkdir -p /opt/jsherp && cd /opt/jsherp # 从 Gitee 拉取项目(国内访问更快) git clone https://gitee.com/jishenghua/JSH_ERP.git cd JSH_ERP |
预期输出:仓库开始下载,完成后 ls 可见后端 Maven 工程(含 pom.xml、src/ 目录)。
|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 💡 说明:主仓库即完整的 Spring Boot 后端源码;Vue 前端位于独立仓库 jshERP-web。本手册采用单体 jar 方式部署,无需单独构建前端。若 Gitee 访问异常,可改用 GitHub 镜像地址 https://github.com/jishenghua/JSH_ERP.git。 |
2.2 确认项目结构
|-------|
| ls -l |
重点关注三项:
- pom.xml ------ Maven 构建配置;
- src/main/resources/application.properties ------ 数据库与 Redis 连接配置(下一步修改);
- 项目根目录下的数据库初始化脚本(jshERP.sql 或同名 .sql 文件,以仓库实际文件为准)。
三、修改配置并打包后端
3.1 修改数据源与 Redis 配置
编辑 src/main/resources/application.properties:
|-----------------------------------------------|
| vim src/main/resources/application.properties |
将数据库与 Redis 的连接地址改为容器名 (容器在同一 Docker 网络内可通过容器名互访):
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # MySQL 数据源:主机名改为容器名 mysql,端口 3306,库名 jsh_erp spring.datasource.url=jdbc:mysql://mysql:3306/jsh_erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=jsherp@2024 # Redis:主机名改为容器名 redis,端口 6379 spring.redis.host=redis spring.redis.port=6379 spring.redis.password= |
|--------------------------------------------------------------------------------------------|
| ⚠️ 注意:mysql、redis 即后续第五、六步创建的容器名,必须保持一致;spring.redis.password 为空表示 Redis 未设置密码,与第六步部署方式对应。 |
3.2 Maven 打包
|---------------------------------------------------|
| # 在项目根目录执行,跳过测试加快构建 mvn clean package -DskipTests |
预期输出:末尾出现 BUILD SUCCESS,target/ 目录下生成可执行文件(如 jshERP.war,Spring Boot 可执行包)。
|-------------------------------------------------|
| ls -lh target/*.war target/*.jar 2>/dev/null |
记下实际生成的文件名,下文统一以 jshERP.war 表示。
3.3 准备 Dockerfile
在项目根目录创建 Dockerfile:
|----------------|
| vim Dockerfile |
内容如下:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 基础镜像:JRE 8 运行环境 FROM openjdk:8-jre # 将打包产物复制进镜像并重命名 COPY target/jshERP.war /app/jshERP.war # 后端服务端口 EXPOSE 9999 # 启动命令 ENTRYPOINT "java", "-jar", "/app/jshERP.war" |
四、创建容器网络
四个服务共用一个自定义桥接网络,这是容器间用容器名互相访问的前提:
|--------------------------------------------------------------------------------------------------------------------------|
| # 创建名为 erp-net 的桥接网络 docker network create --driver bridge erp-net # 验证 docker network ls docker network inspect erp-net |
预期输出:docker network ls 中出现名为 erp-net、driver 为 bridge 的网络;inspect 显示 Containers 为空(后续容器加入后会列出)。
|---------------------------------------------------------------------------------------------------|
| 💡 原理说明:同一自定义 bridge 网络内的容器,Docker 内置 DNS 会自动将容器名解析为对应容器 IP,因此配置文件中写 mysql、redis 即可,无需知道实际 IP 地址。 |
五、部署 MySQL 数据库
5.1 启动 MySQL 容器
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| docker run -d \ --name mysql \ --network erp-net \ --restart=always \ -e MYSQL_ROOT_PASSWORD=jsherp@2024 \ -e MYSQL_DATABASE=jsh_erp \ -e TZ=Asia/Shanghai \ -v mysql-data:/var/lib/mysql \ -p 3306:3306 \ mysql:5.7 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_general_ci |
参数说明:
|------------------------------|---------------------------------------|
| 参数 | 作用 |
| --name mysql | 容器名,与后端配置中的数据源主机名一致 |
| --network erp-net | 加入自定义网络,供后端容器访问 |
| -e MYSQL_ROOT_PASSWORD | root 密码,需与 application.properties 中一致 |
| -e MYSQL_DATABASE=jsh_erp | 启动时自动创建 jsh_erp 库 |
| -v mysql-data:/var/lib/mysql | 数据持久化到命名卷,容器删除数据不丢 |
| -p 3306:3306 | 映射到宿主机,便于外部工具调试(可省略) |
| --character-set-server | 字符集设为 utf8mb4,避免中文乱码 |
5.2 验证 MySQL 就绪
|----------------------|
| docker logs -f mysql |
预期输出:日志末尾出现 ready for connections. Version: '5.7.x',按 Ctrl+C 退出日志。
5.3 导入 ERP 初始化数据
|-------------------------------------------------------------------------------------------------------------------|
| # 在项目根目录执行,将 SQL 脚本导入 jsh_erp 库(按实际脚本文件名调整) docker exec -i mysql mysql -uroot -pjsherp@2024 jsh_erp < jshERP.sql |
验证导入结果:
|---------------------------------------------------------------------------------|
| docker exec -it mysql mysql -uroot -pjsherp@2024 -e "USE jsh_erp; SHOW TABLES;" |
预期输出:列出 jsh_user、jsh_material、jsh_depot 等业务表。
六、部署 Redis 缓存
|----------------------------------------------------------------------------------------------------------------------------|
| docker run -d \ --name redis \ --network erp-net \ --restart=always \ -v redis-data:/data \ -p 6379:6379 \ redis:6.2 |
验证 Redis 就绪:
|--------------------------------------|
| docker exec -it redis redis-cli ping |
预期输出:PONG。
|---------------------------------------------------------------------------------------------------------------------|
| 💡 说明:此处 Redis 未设置密码,与 3.1 节配置 spring.redis.password=(空)对应。若生产环境需要密码,可在启动命令后追加 --requirepass "你的密码",并同步修改后端配置后重新打包。 |
七、构建并部署 Spring Boot 后端
7.1 构建后端镜像
在项目根目录(Dockerfile 所在位置)执行:
|-----------------------------------|
| docker build -t jsherp-boot:1.0 . |
预期输出:分步执行 FROM、COPY、EXPOSE 等指令,末尾出现 Successfully tagged jsherp-boot:1.0。
|------------------------------|
| docker images | grep jsherp |
预期输出:镜像列表中出现 jsherp-boot 1.0。
7.2 启动后端容器
|------------------------------------------------------------------------------------------------------------------------------------|
| docker run -d \ --name jsh-erp \ --network erp-net \ --restart=always \ -e TZ=Asia/Shanghai \ -p 9999:9999 \ jsherp-boot:1.0 |
7.3 验证后端启动成功
|------------------------|
| docker logs -f jsh-erp |
预期输出:Spring Boot 启动日志,出现 Tomcat started on port(s): 9999 且无报错;按 Ctrl+C 退出日志。
再用 curl 直连后端验证:
|-------------------------------|
| curl -I http://localhost:9999 |
预期输出:返回 HTTP/1.1 200 或 302(非 Connection refused 即表示服务已监听)。
八、部署 Nginx 反向代理
8.1 准备 Nginx 配置
在宿主机创建配置文件目录与配置:
|--------------------------------------------------------------------|
| mkdir -p /opt/jsherp/nginx && vim /opt/jsherp/nginx/default.conf |
写入以下内容(核心为 proxy_pass 指向后端容器):
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| server { listen 80; # 对外服务端口 server_name _; location / { proxy_pass http://jsh-erp:9999; # 容器名 jsh-erp,由 erp-net 网络解析 proxy_set_header Host host; proxy_set_header X-Real-IP remote_addr; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto scheme; proxy_read_timeout 300s; } } |
8.2 启动 Nginx 容器
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| docker run -d \ --name nginx \ --network erp-net \ --restart=always \ -v /opt/jsherp/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro \ -p 80:80 \ nginx:1.25 |
8.3 验证代理链路
|---------------------------------------------------------------------------------------------------------------------------------------|
| # 检查四个容器是否全部运行 docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 通过 80 端口访问,验证 Nginx → 后端链路 curl -I http://localhost |
预期输出:docker ps 列出 nginx、jsh-erp、mysql、redis 四个容器且状态均为 Up;curl 返回 HTTP/1.1 200 或 302。
九、浏览器访问验证
9.1 访问系统
在与服务器同网络的客户端浏览器中打开:
|--------------|
| http://服务器IP |
|-----------------------------------------------------------------------------------------------------------------------------------|
| ⚠️ 注意:若云服务器无法访问,请到云控制台安全组 放行 80 端口(TCP 入方向);本地防火墙可用 firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload 放行。 |
9.2 登录系统
使用默认管理员账号登录:
|--------|--------------|
| 项目 | 值 |
| 登录地址 | http://服务器IP |
| 默认账号 | admin |
| 默认密码 | 123456 |
9.3 部署验收清单
依次确认以下各项,全部通过即部署成功:
- □ 浏览器能打开登录页,页面样式与验证码图片正常显示;
- □ 使用 admin/123456 能成功登录进入工作台;
- □ 菜单(首页/商品管理/采购管理/销售管理/仓库管理等)可正常打开;
- □ 任选一模块执行一次查询,无报错(验证 MySQL 数据读写);
- □ 执行 docker ps 四个容器状态均为 Up,重启服务器后各容器自动恢复(--restart=always)。
十、常见问题排查
1. 容器未启动或反复重启
执行 docker ps -a 查看状态,docker logs 容器名 定位原因。常见原因:宿主机端口被占用(netstat -tlnp | grep 80)、配置文件挂载路径错误。
2. 后端启动报数据库连接失败(Communications link failure)
按顺序检查:① 后端容器与 MySQL 是否在同一网络(docker network inspect erp-net);② application.properties 中主机名是否写的是容器名 mysql 而非 localhost;③ MySQL 容器日志是否已 ready for connections;④ 密码是否与 MYSQL_ROOT_PASSWORD 一致。
3. 页面中文乱码或时间差 8 小时
确认 MySQL 启动参数含 --character-set-server=utf8mb4、数据源 URL 含 characterEncoding=utf8 与 serverTimezone=Asia/Shanghai,且容器均带 -e TZ=Asia/Shanghai。若修改了配置,需重新打包并重建后端镜像。
4. MySQL 8 兼容性问题(选用 8.0 时)
JSH_ERP 使用的旧版 MySQL 驱动可能不兼容 MySQL 8 默认的 caching_sha2_password 认证插件,报错认证失败时,建议改用 mysql:5.7 镜像,或在 MySQL 中执行 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'jsherp@2024';。
5. 浏览器无法访问但服务器本地 curl 正常
多为防火墙/安全组未放行 80 端口,见 9.1 节说明。
6. 修改配置或代码后如何更新
重新执行 mvn clean package -DskipTests → docker build -t jsherp-boot:1.0 . → docker rm -f jsh-erp → 重新执行 7.2 的 docker run 命令。MySQL/Redis 数据存放在卷中,重建后端容器不影响数据。
附录:常用命令速查
|-------------|-------------------------------------|
| 用途 | 命令 |
| 查看运行中容器 | docker ps |
| 查看全部容器(含退出) | docker ps -a |
| 查看容器日志 | docker logs -f 容器名 |
| 进入容器终端 | docker exec -it 容器名 bash |
| 重启容器 | docker restart 容器名 |
| 删除容器 | docker rm -f 容器名 |
| 查看网络内容器 | docker network inspect erp-net |
| 查看数据卷 | docker volume ls |
| 查看镜像 | docker images |
| 磁盘清理 | docker system prune -a(慎用,会删除未使用镜像) |
参考资料:JSH_ERP 开源仓库 https://gitee.com/jishenghua/JSH_ERP;Docker 官方文档 https://docs.docker.com。