一、环境概览
ChestnutCMS 需要以下基础服务:
| 服务 | 版本 | 端口 | 用途 |
|---|---|---|---|
| MySQL | 8.0 | 3306 | 主数据库 |
| Redis | 7.x | 6379 | 缓存 + 消息队列 |
| MinIO | latest | 9000/9001 | 对象存储(图片、文件等) |
| ElasticSearch | 8.13.4 | 9200/9300 | 全文检索(可选) |
前置条件:
- Windows 10/11
- Docker Desktop 已安装并启动
- JDK 17 + Maven 3.8
- Node.js 20.x
二、Docker Desktop 镜像加速配置
国内拉取 Docker Hub 镜像经常超时,需要配置镜像加速源。
配置步骤:
-
打开 Docker Desktop → 点击右上角 ⚙️ Settings → Docker Engine
-
在 JSON 配置中添加
registry-mirrors:{
"registry-mirrors": [
"https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
"https://5tqw56kt.mirror.aliyuncs.com",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn/",
"http://mirror.azure.cn/",
"https://hub.rat.dev/",
"https://docker.ckyl.me/",
"https://docker.chenby.cn",
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com",
"https://func.ink",
"https://lispy.org",
"https://docker.xiaogenban1993.com"
]
} -
点击 Apply & Restart,等待 Docker 重启完成
验证配置是否生效:
docker info | findstr "Registry Mirrors" -A 5
看到输出中包含你配置的镜像地址即说明生效。配置生效后,所有 docker pull 命令会自动走加速源,无需在命令中手动指定镜像仓库地址。
三、Docker 镜像拉取与启动
以下命令均在 Docker Desktop 的终端(PowerShell / CMD)中执行。镜像加速已在上一步配置好,直接
docker pull即可。
3.1 MySQL 8.0
拉取镜像:
docker pull mysql:8.0
启动容器:
docker run -d --name cc-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=hello1234 -v D:/mysql/data:/var/lib/mysql --restart always mysql:8.0
参数说明:
| 参数 | 说明 |
|---|---|
--name cc-mysql |
容器名称,方便后续管理 |
-p 3306:3306 |
映射端口 |
-e MYSQL_ROOT_PASSWORD=hello1234 |
root 用户密码 |
-v D:/mysql/data:/var/lib/mysql |
数据持久化到宿主机 |
--restart always |
Docker 重启后自动启动 |
⚠️ 大小写敏感问题:
MySQL 在 Linux 容器中默认表名区分大小写,而 ChestnutCMS 的 SQL 脚本中表名是小写的。如果遇到表找不到的问题,需要加 --lower-case-table-names=1:
docker run -d --name cc-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=hello1234 -v D:/mysql/data:/var/lib/mysql --restart always mysql:8.0 --lower-case-table-names=1
⚠️ 重要 :
--lower-case-table-names=1必须在 MySQL 首次初始化时设置。如果 MySQL 已经初始化过数据目录,再添加这个参数会报错。需要先清空数据目录:
docker stop cc-mysql
docker rm cc-mysql
rd /s /q D:\mysql\data
docker run -d --name cc-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=hello1234 -v D:/mysql/data:/var/lib/mysql --restart always mysql:8.0 --lower-case-table-names=1
创建数据库:
# 进入 MySQL 容器
docker exec -it cc-mysql mysql -uroot -phello1234
# 创建数据库
create database `chestnut_cms` charset utf8mb4;
3.2 Redis
拉取镜像:
docker pull redis
启动容器:
docker run -d --name redis -p 6379:6379 --restart always redis
无密码模式,本地开发够用。如果需要加密码:
docker run -d --name redis -p 6379:6379 --restart always redis --requirepass yourpassword
验证连接:
docker exec -it redis redis-cli ping
# 返回 PONG 即正常
3.3 MinIO(对象存储)
ChestnutCMS 用 MinIO 存储图片、音视频等上传资源。
方式一:docker-compose(推荐)
在项目根目录创建 docker-compose.yml:
version: '3'
services:
minio2:
image: minio/minio
container_name: cc-minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- D:/MinIO2/data:/data
command: server /data --console-address ":9001"
restart: always
启动:
cd D:\YMKJ\ChestnutCMS
docker-compose up -d minio2
方式二:docker run
docker run -d --name cc-minio -p 9000:9000 -p 9001:9001 -v D:/MinIO2/data:/data -e MINIO_ROOT_USER=minioadmin -e MINIO_ROOT_PASSWORD=minioadmin --restart always minio/minio server /data --console-address ":9001"
访问管理控制台: http://localhost:9001
账号密码: minioadmin / minioadmin
⚠️ 设置公开桶(重要):
ChestnutCMS 上传的图片需要通过 HTTP 直接访问,必须将桶设为公开读:
# 安装 mc 客户端(如果容器内没有)
# 设置别名
docker exec cc-minio mc alias set local http://127.0.0.1:9000 minioadmin minioadmin
# 将 swikoon 桶设为公开(swikoon 是默认的站点目录名,按你实际的改)
docker exec cc-minio mc anonymous set public local/swikoon
如果你的站点目录名是
csld9,桶名也要对应改成csld9。
3.4 ElasticSearch(可选)
ES 是全文检索的依赖,如果不需要搜索功能或想用数据库降级,可以跳过。
拉取镜像:
docker pull elasticsearch:8.13.4
启动容器:
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" --restart always elasticsearch:8.13.4
参数说明:
| 参数 | 说明 |
|---|---|
discovery.type=single-node |
单节点模式,开发环境够用 |
xpack.security.enabled=false |
关闭安全认证,本地开发简化 |
ES_JAVA_OPTS=-Xms512m -Xmx512m |
限制 JVM 内存,避免吃满宿主机 |
验证:
curl http://localhost:9200
# 返回 JSON 格式的集群信息即正常
四、ChestnutCMS 配置对接 Docker 服务
4.1 修改 application-dev.yml
spring:
# MySQL
datasource:
dynamic:
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/chestnut_cms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: hello1234
# Redis
data:
redis:
host: 127.0.0.1
port: 6379
# password: 如果没设密码就注释掉
# ElasticSearch(如果没启动 ES,关闭相关配置)
elasticsearch:
uris: http://127.0.0.1:9200
enable: true # 没启动 ES 改为 false
# 关闭 XXL-JOB(本地开发不需要)
xxl:
job:
enable: false
4.2 ES 未启动时的降级配置
如果不想启动 ES,需要额外关闭健康检查:
spring:
elasticsearch:
enable: false
management:
health:
elasticsearch:
enabled: false
这样系统会自动降级到数据库 LIKE 查询,搜索功能仍然可用(仅支持标题匹配)。
4.3 MinIO 配置
在 ChestnutCMS 后台 → 站点管理 → 资源存储配置中,填入:
- Endpoint:
http://127.0.0.1:9000 - Access Key:
minioadmin - Secret Key:
minioadmin - Bucket: 你的站点目录名(如
swikoon或csld9)
五、启动项目
5.1 后端
# 1. 克隆项目
git clone https://gitee.com/liweiyi/ChestnutCMS.git
cd ChestnutCMS
# 2. 导入 IDEA,等待 Maven 依赖下载
# 3. 初始化数据库(二选一)
# 方式一:开启 Flyway
# application-dev.yml 中 spring.flyway.enabled = true
# 方式二:手动执行 db/migration/mysql/ 下的 SQL 文件
# 4. 运行 ChestnutApplication.main()
5.2 前端
cd chestnut-ui
npm install --registry=https://registry.npmmirror.com
npm run dev
# 访问 http://localhost:80
# 默认账号:admin / admin
六、Docker 常用管理命令
# 查看所有运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop cc-mysql redis cc-minio es
# 启动已停止的容器
docker start cc-mysql redis cc-minio es
# 重启容器
docker restart cc-mysql
# 查看容器日志
docker logs cc-mysql
docker logs -f cc-mysql --tail 100 # 实时查看最后100行
# 进入容器内部
docker exec -it cc-mysql bash
docker exec -it cc-mysql mysql -uroot -phello1234
# 删除容器(需先停止)
docker stop cc-mysql
docker rm cc-mysql
# 查看镜像列表
docker images
# 删除镜像
docker rmi mysql:8.0
# 查看容器资源占用
docker stats
七、docker-compose 一键编排
把所有服务整合到一个 docker-compose.yml,一键启动/停止:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: cc-mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: hello1234
volumes:
- D:/mysql/data:/var/lib/mysql
command: --lower-case-table-names=1
restart: always
redis:
image: redis
container_name: cc-redis
ports:
- "6379:6379"
restart: always
minio:
image: minio/minio
container_name: cc-minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- D:/MinIO2/data:/data
command: server /data --console-address ":9001"
restart: always
elasticsearch:
image: elasticsearch:8.13.4
container_name: cc-es
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms512m -Xmx512m
restart: always
使用方式:
# 一键启动所有服务
docker-compose up -d
# 一键停止所有服务
docker-compose down
# 只启动某个服务
docker-compose up -d mysql redis
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f mysql
八、踩坑记录
坑1:MySQL 表名大小写导致启动报错
现象: 应用启动时报 Table 'chestnut_cms.CMS_CONTENT' doesn't exist
原因: MySQL 在 Linux 容器中默认区分表名大小写,而 ChestnutCMS 的 SQL 用的是小写表名。
解决: 启动时加 --lower-case-table-names=1,且必须在首次初始化时设置,已有数据需要清空重来。
坑2:Redis 连接超时
现象: 应用日志报 Unable to connect to Redis
排查:
# 检查容器是否运行
docker ps | grep redis
# 检查端口是否通
docker exec -it cc-redis redis-cli ping
# 检查配置中的密码是否一致
# 如果 Redis 没设密码,application-dev.yml 中的 password 要注释掉(不是留空)
坑3:MinIO 图片上传后 404
现象: 图片上传成功但访问返回 403/404
原因: MinIO 桶默认是私有的,需要设置为公开读。
解决:
docker exec cc-minio mc alias set local http://127.0.0.1:9000 minioadmin minioadmin
docker exec cc-minio mc anonymous set public local/你的桶名
坑4:ES 占用内存过大
现象: ES 容器启动后占 2G+ 内存,电脑卡顿
解决: 限制 JVM 堆内存:
docker run -d --name es -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:8.13.4
512M 对本地开发完全够用。如果机器内存紧张,也可以不启动 ES,用数据库降级搜索。
坑5:search_log 表 log_id 无默认值
现象: 搜索时报错 Field 'log_id' doesn't have a default value
原因: search_log 表的 log_id 字段没有设置自增
解决:
docker exec -it cc-mysql mysql -uroot -phello1234 chestnut_cms
ALTER TABLE search_log MODIFY COLUMN log_id BIGINT NOT NULL AUTO_INCREMENT;
坑6:Windows 路径挂载权限问题
现象: 容器启动后无法写入挂载目录
原因: Docker Desktop 在 Windows 下的文件共享需要在 Settings → Resources → File Sharing 中添加对应盘符。
解决: 打开 Docker Desktop → Settings → Resources → File Sharing,添加 D:\ 盘。
九、整体架构图
┌────────────────────────────────────────────────────────┐
│ Windows 宿主机 │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Docker Desktop │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │
│ │ │ MySQL │ │ Redis │ │ MinIO │ │ │
│ │ │ :3306 │ │ :6379 │ │ :9000/:9001 │ │ │
│ │ └──────────┘ └──────────┘ └──────────────────┘ │ │
│ │ ┌──────────┐ │ │
│ │ │ ES │ (可选,可降级到数据库查询) │ │
│ │ │ :9200 │ │ │
│ │ └──────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ChestnutCMS (IDEA + VSCode) │ │
│ │ 后端: ChestnutApplication.main() :8080 │ │
│ │ 前端: npm run dev :80 │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ wwwroot_release/ (静态资源 + 模板) │ │
│ │ ├── {站点}/resources/ │ │
│ │ └── {站点}_pc/template/ │ │
│ └──────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────┘
十、总结
| 步骤 | 命令/操作 | 耗时 |
|---|---|---|
| 拉取镜像 | docker pull ... |
约 5-10 分钟 |
| 启动服务 | docker-compose up -d |
约 1 分钟 |
| 初始化数据库 | Flyway / 手动导入 SQL | 约 2 分钟 |
| 修改配置 | application-dev.yml | 约 3 分钟 |
| 启动项目 | IDEA + npm run dev | 约 2 分钟 |
| 合计 | 约 15 分钟 |
Docker Desktop 的优势在于环境隔离、一键启停、可复现。对于 ChestnutCMS 这种依赖多个中间件的 Java 项目,用 Docker 管理比本地安装 MySQL + Redis + MinIO + ES 要干净得多,不会污染宿主机环境。
建议:
- 日常开发用 docker-compose 编排,一个命令管理所有服务
- 不需要 ES 时直接删掉 elasticsearch 服务,搜索自动降级到数据库
- 数据目录挂载到 D 盘,避免占用 C 盘空间
- 生产环境部署参考同样的 docker-compose 配置,调整端口和密码即可
参考链接:
- ChestnutCMS 官网:https://www.1000mz.com/
- Gitee 仓库:https://gitee.com/liweiyi/ChestnutCMS
- Docker Desktop 下载:https://www.docker.com/products/docker-desktop/
- MinIO 官方文档:https://min.io/docs/minio/linux/index.html