Docker Desktop 部署 ChestnutCMS 全流程:从零搭建企业级 CMS 开发环境

一、环境概览

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 镜像经常超时,需要配置镜像加速源。

配置步骤:

  1. 打开 Docker Desktop → 点击右上角 ⚙️ Settings → Docker Engine

  2. 在 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"
    ]
    }

  3. 点击 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: 你的站点目录名(如 swikooncsld9

五、启动项目

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 配置,调整端口和密码即可

参考链接:

相关推荐
Lalolander1 天前
设备工程项目采购中缺料和浪费的痛点和解决思路
大数据·运维·设备工程项目管理系统·设备工程项目质量管控·设备工程项目成本管控
dayuOK63071 天前
AI内容创作工具的下一个战场:从“生成”到“全流程自动化”
运维·人工智能·chatgpt·职场和发展·自动化·新媒体运营·媒体
Agent手记1 天前
成本数据多系统自动采集与分析实操指南:基于2026大模型Agent的超自动化实践
运维·人工智能·microsoft·ai·自动化
wb1891 天前
Kubernetes服务优化
云原生·容器·kubernetes
szxinmai主板定制专家1 天前
电力设备RK3568/RK3576+FPGA,多系统混合部署Linux+RTOS RT-THREAD,强实时性
linux·运维·服务器·人工智能·嵌入式硬件·fpga开发
我是坑货1 天前
Jenkins 构建失败排查记录:mvn -U 把新版依赖被远程旧版覆盖
运维·jenkins
L、2181 天前
CANN调优工具链全景:从profiler到tensorboard的完整观测体系
linux·运维·服务器·深度学习
码点滴1 天前
Workload 自动化进化论:从手动运维到 AI 驱动的 Kubernetes 智能管控
运维·人工智能·kubernetes·自动化·workload
darkdragonking1 天前
Docker(五)OpenEuler22.03 安装docker ce、排坑
运维·docker·容器