1. 准备工作

  • 确保已安装 Docker Desktop 并启动。

  • 确保终端可执行 docker-compose 命令。


2. 创建项目目录

mkdir -p ~/Documents/halo && cd ~/Documents/halo

目录结构:

~/Documents/halo
├── docker-compose.yaml
├── halo-data       # Halo 数据目录(自动生成)
└── mysql-data      # MySQL 数据目录(自动生成)

3. 编写 docker-compose.yaml

创建文件 docker-compose.yaml,内容如下:

version: "3.8"

services:
  halo:
    image: registry.fit2cloud.com/halo/halo:2.20
    restart: on-failure:3
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./halo-data:/root/.halo2   # Halo 数据持久化
    ports:
      - "8090:8090"
    environment:
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --spring.r2dbc.url=r2dbc:pool:mysql://mysql:3306/halodb
      - --spring.r2dbc.username=halo
      - --spring.r2dbc.password=halopassword
      - --spring.sql.init.platform=mysql
      - --halo.external-url=http://localhost:8090/

  mysql:
    image: mysql:8.0
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      - ./mysql-data:/var/lib/mysql   # MySQL 数据持久化
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=halodb
      - MYSQL_USER=halo
      - MYSQL_PASSWORD=halopassword
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  halo_network:

4. 启动容器

~/Documents/halo 目录下执行:

docker-compose up -d

5. 验证服务状态

  1. 查看容器状态

    docker-compose ps

    正常应显示两个容器均为 running

  2. 访问 Halo 管理后台

    • 浏览器打开 http://localhost:8090/console

    • 初始化管理员账号(如你的用户名 amin 和密码 Admin123)。


6. 数据持久化验证

  • Halo 数据:存储在 ~/Documents/halo/halo-data

  • MySQL 数据:存储在 ~/Documents/halo/mysql-data

    • 检查目录内容:

      ls -l ~/Documents/halo/halo-data
      ls -l ~/Documents/halo/mysql-data

      正常应包含数据库文件(如 ibdata1, ib_logfile0 等)。


7. 自定义数据存储路径(可选)

如果你希望将数据存储在其他位置(如 /Users/minghui/Documents/mysql),需修改 volumes 为绝对路径:

volumes:
  - /Users/minghui/Documents/mysql:/var/lib/mysql

但需确保目录存在且 Docker 有权限写入。


常见问题

1. MySQL 容器无法启动

  • 错误现象docker-compose logs mysql 显示权限错误。

  • 解决方案

    • 删除 mysql-data 目录并重新启动:

      rm -rf mysql-data
      docker-compose up -d

2. Halo 无法连接 MySQL

  • 错误现象:Halo 日志提示数据库连接失败。

  • 检查点

    • 确保 docker-compose.yaml 中的数据库用户名、密码、数据库名一致。

    • 确保 MySQL 容器健康检查通过(docker-compose ps 显示 healthy)。


总结

  • ✅ 修正后的配置将数据存储在 docker-compose.yaml 所在目录的子目录中。

  • ✅ 通过 volumes 配置实现数据持久化,避免容器删除后数据丢失。

  • ✅ 使用 Docker Compose 可一键部署 Halo + MySQL,适合本地开发和测试。