纯Docker部署Halo建站工具

发布时间 2023-05-24 14:25:31作者: 幻世、

缘由

最近入手了个绿联DX4600的Nas,折腾的时候了解到有Halo这个简单易用,而且还美观的建站。
Halo官方文档对于纯粹的 Docker 部署所提供的示例命令,只有使用 H2 Database 数据库的,官方不推荐用于生产环境,建议体验和测试的时候使用。
我想部署的是搭配 Mysql 数据库,这样还方便使用其他图形化工具连接数据库进行备份或其他操作什么的,性能应该也会更好。

由于在我的Nas中没找到能使用 Docker compose 的地方,所以只能纯粹使用 Docker 来进行部署,我按官方文档尝试了不少操作,都是先创建 Mysql 容器后,再创建 Halo 容器,但都屡屡失败,最接近成功的一次是 Halo 容器都往 Mysql 容器里写入数据了,但访问网页却一直无连接。

然后在电脑上尝试了使用 Docker compose ,刷的一下啊,很快就成功了,于是决定按照官方提供的 docker-compose.yaml 文件中的配置来,但由于没有系统的学习过 Docker 和 Docker compose ,尝试多次失败,去搜教程,去找B站视频,竟然除了用官方提供的 docker-compose.yaml 文件来部署的,就是用官方提供的搭配 H2 Database 数据库的命令来部署的。

既然没有这样的教程,那我就自己来写。

注意,此文章的大致内容就是 如何在不使用 Docker compose 的情况下,仅用 Docker 部署 Halo 搭配 Mysql 。 本质上是如何将官方的 docker-compose.yaml 文件改为 Docker 命令。

官方 docker-compose.yaml 文件分析

官方文档中创建 Halo + MySQL 的实例(官方还有仅创建 Halo 的实例(使用已有外部数据库,MySQL 为例),但是我试过不成功):

version: "3"

services:
  # 对 Halo 容器的配置
  halo:
    # 使用的镜像
    image: halohub/halo:2.5
    # 容器名称,对应命令 --name halo
    container_name: halo
    # 失败3秒后重启容器,可以不管
    restart: on-failure:3
    # 依赖,意思是这个容器要依赖下面的数据库,使用 Docker 命令可以不管
    depends_on:
      halodb:
        condition: service_healthy
    # 容器使用的网络,对应命令 --network=halo_network,这个网络需要我们自己创建
    networks:
      halo_network:
    # 文件路径映射,把宿主机的当前路径(yaml文件在的路径)作为容器的 /root/.halo2 路径
    volumes:
      - ./:/root/.halo2
    # 端口映射,把宿主机的 8090 端口作为容器的 8090 端口,左边的宿主端口号可以根据自己需求改
    ports:
      - "8090:8090"
    # 不了解,但是对我们使用 Docker 命令不影响
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    # 对容器进行一些设置
    command:
      # 设置 Mysql 数据库路径,其他数据库参考官方文档
      - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
      # 设置数据库的用户名
      - --spring.r2dbc.username=root
      # 设置数据库的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=o#DwN&JSa56
      # 设置数据库平台名称,就是告诉容器你用的什么数据库
      - --spring.sql.init.platform=mysql
      # 设置外部访问地址,请根据实际需要修改,后面用这个地址登录 Halo
      - --halo.external-url=http://localhost:8090/
      # 设置 Halo 初始化的超级管理员用户名,用来登录 Halo
      - --halo.security.initializer.superadminusername=admin
      # 设置 Halo 初始化的超级管理员密码,用来登录 Halo
      - --halo.security.initializer.superadminpassword=P@88w0rd

  # 对 Mysql 容器的配置
  halodb:
    # 使用的镜像
    image: mysql:8.0.31
    # 容器名称
    container_name: halodb
    restart: on-failure:3
    # 容器使用的网络
    networks:
      halo_network:
    # 对容器进行一些设置
    command:
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --explicit_defaults_for_timestamp=true
    # 文件路径映射
    volumes:
      - ./mysql:/var/lib/mysql
      - ./mysqlBackup:/data/mysqlBackup
    # 端口映射
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
      interval: 3s
      retries: 5
      start_period: 30s
    # 对容器再进行一些设置
    environment:
      # Mysql 数据库 root 用户的密码
      # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
      - MYSQL_ROOT_PASSWORD=o#DwN&JSa56
      # 在 Mysql 中新建一个叫 halo 的数据库
      - MYSQL_DATABASE=halo

networks:
  halo_network:

现在我们对数据库和 Halo 需要进行的配置有了一些了解,接下来用 Docker 命令的方式来部署

Docker 命令部署

第一步:创建网络

cmd 运行命令

docker network create halo_network

创建一个名称为 halo_network 的网络,由于没有进行配置,所以它是默认的桥接模式

使用下面的命令可以查看网络列表

docker network ls

image

第二步:创建 Mysql 容器

cmd 运行命令

docker run -it -d --name halodb -p 3306:3306 -v C:/docker/Halo/mysql:/var/lib/mysql -v C:/docker/Halo/mysqlBackup:/data/mysqlBackup --network=halo_network -e MYSQL_ROOT_PASSWORD=251731 -e MYSQL_DATABASE=halo mysql --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true

创建名为 halodb 的 mysql 容器

命令说明:

docker run \
  -it -d \ # -it 以交互模式运行容器,并为它分配一个伪终端, -d 后台运行容器,并返回容器ID
  --name halodb \ # 命名容器为 halodb
  -p 3306:3306 \ # 将宿主机的的 3306 端口作为容器的 3306 端口
  -v C:/docker/Halo/mysql:/var/lib/mysql \ # 宿主机的 C:/docker/Halo/mysql 路径作为容器的 /var/lib/mysql 路径
  -v C:/docker/Halo/mysqlBackup:/data/mysqlBackup \ # 同上
  --network=halo_network \ # 使用前面新建的 halo_network 网络
  -e MYSQL_ROOT_PASSWORD=123456 \ # 设置 Mysql 数据库 root 用户的密码为 123456
  -e MYSQL_DATABASE=halo \ # 新建一个名为 halo 的数据库
  mysql \ # 使用的镜像,可按官方的改为使用 mysql:8.0.31
  --default-authentication-plugin=mysql_native_password \ # 和下面都是对数据库的一些设置,不说明,照抄就好
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_general_ci \
  --explicit_defaults_for_timestamp=true

第三步:创建 Halo 容器

cmd 运行命令

docker run -d --name halo --networks=halo_network -v C:/docker/Halo:/root/.halo2 -p 8090:8090 halohub/halo:2.5 --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo --spring.r2dbc.username=root --spring.r2dbc.password=123456 --spring.sql.init.platform=mysql --halo.external-url=http://localhost:8090/ --halo.security.initializer.superadminusername=admin --halo.security.initializer.superadminpassword=123456

创建名为 halo 的 halo2.5.* 版本容器

命令说明:

docker run \
  -d \ # 后台运行容器,并返回容器ID
  --name halo \ # 命名容器为 halo
  --networks=halo_network \ # 使用前面新建的 halo_network 网络
  -v C:/docker/Halo:/root/.halo2 \ # 宿主机的 C:/docker/Halo 路径作为容器的 /root/.halo2 路径
  -p 8090:8090 \ # 将宿主机的的 8090 端口作为容器的 8090 端口
  halohub/halo:2.5 \ # 使用的镜像
  --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo \ # 设置 Mysql 连接, 其中 halodb 是数据库容器名称,halo 是数据库名称
  --spring.r2dbc.username=root \ # 连接的数据库的 root 用户
  --spring.r2dbc.password=251731 \ # 连接的数据库的 root 用户的密码
  --spring.sql.init.platform=mysql \ # 连接的数据库的类型
  --halo.external-url=http://localhost:8090/ \ # 外部访问地址,根据实际需要修改
  --halo.security.initializer.superadminusername=admin \ # 初始化 halo 超级管理员用户名
  --halo.security.initializer.superadminpassword=251731 # 初始化 halo 超级管理员用户密码

第四步 访问 halo

在以上的配置中,宿主机可以通过链接http://localhost:8090/访问 halo 页面,局域网内其他设备可以通过http://宿主机ip:8090/访问,如果部署在 Nas 中,宿主机 IP 及为 Nas 的 IP。

以上 Docker 命令变成在 Nas 的 Docker 管理界面实现应该不是很难,那就不多说了,有时间再整个绿联Dx4600部署 Halo 的视频教程。