Administrator
发布于 2026-02-25 / 14 阅读
0
0

Halo部署记录

本次采用halo的免费社区版部署在阿里云的Alibaba Cloud Linux 服务器,个人建议采用Docker 进行部署,基本按照部署文档就可傻瓜式部署。

基本信息如下:

Halo:社区版2.22

服务器系统:Alibaba Cloud Linux 3.2104 LTS 64位

内存:2 核(vCPU)2 GiB

操作系统:CentOS 10.0

磁盘:40GB

内置数据库:H2

一、安装Docker

有一说一:相比于之前的云服务器的Workbench 操作方式,现在的亮点功能是:加入的自然语言AI理解功能,通过自然语言的输入,例如“安装Docker”,自动生产符合贴近要求的执行指令。对于我这样不经常使用生疏的人,这个功能应该是很友好。给阿里云的产品经理与开发点个赞。

由于网络系统的缘由:采用阿里云镜像的方式进行安装。

sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

添加阿里云的 Docker CE 镜像源。接下来,我会安装 Docker 社区版本、容器运行时 containerd.io 以及 Docker 构建和 Compose 插件。

查看安装Docker版本。

docker --version

Docker version 26.1.3, build b72abbb

之后,启动Docker。

sudo sytemctl start docker

再之后,查看安装后的Docker的容器列表。

docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

二、获取halo镜像

通过docker run 指令获取Halo镜像以及部署启动。

docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 -e JVM_OPTS="-Xmx256m -Xms256m" registry.fit2cloud.com/halo/halo:2.22

启动 Halo 参数:

参数

作用

-it

分配交互式终端并保持标准输入打开

-d

后台运行容器(守护进程模式)

--name halo

将容器命名为 halo

-p 8090:8090

将宿主机的 8090 端口映射到容器的 8090 端口

-v ~/.halo2:/root/.halo2

将宿主机的 ~/.halo2 目录挂载到容器内的 /root/.halo2,用于持久化数据

-e JVM_OPTS="-Xmx256m -Xms256m"

设置 Java 虚拟机的运行参数,最大和初始堆内存均为 256MB

registry.fit2cloud.com/halo/halo:2.22

指定要运行的 Docker 镜像及其版本

与此同时,或者通过docker-Compose统一配置docker-compose.yml文件。

三、DockerDocker-compose的区别

在这里讲解一下,DockerDocker-compose的区别。

1. 核心概念与定位

Docker (核心引擎)

docker 是核心命令行工具,直接与 Docker 守护进程交互,主要用于管理单个容器(创建、启动、停止、删除等)。

  • 你之前执行的 docker run 就是典型的 Docker 原生命令,用来启动单个 Halo 容器。

  • 适合场景:仅需运行 1 个容器,或手动管理少量容器。

Docker Compose (多容器编排工具)

docker-compose 是基于 Docker 引擎的多容器编排工具,通过一个 yaml 配置文件(docker-compose.yml)定义多个容器的依赖、网络、数据卷等,实现「一键启动 / 停止所有相关容器」。

  • 适合场景:应用由多个容器组成(比如 Halo + 数据库 + 缓存),需要统一管理容器间的协作。

2. 核心区别对比

特性

Docker (原生命令)

Docker Compose

管理对象

单个容器

多个关联容器(应用集群)

配置方式

命令行参数(冗长,易出错)

YAML 配置文件(清晰,可复用)

启动方式

逐个执行 docker run 命令

一条 docker-compose up 搞定

网络 / 依赖管理

需手动配置网络、依赖顺序

自动创建网络,按依赖顺序启动

常用命令

docker run/ps/stop/rm

docker-compose up/down/ps/logs

3. 实战示例:用两种方式启动 Halo (对比)

方式 1:纯 Docker 命令 (单容器)

你之前执行的命令(需手动处理所有参数):

docker run -it -d \
  --name halo \
  -p 8080:8080 \
  -v ~/.halo2:/root/.halo2 \
  -e JVM_OPTS="-Xmx256m -Xms256m" \
  registry.fit2cloud.com/halo/halo:2.22

方式 2:Docker Compose (配置文件 + 一键启动)

第一步:创建 docker-compose.yml 文件(放在任意目录,比如 ~/halo):

version: '3'  # Compose 文件版本(需与 Docker 版本匹配)
services:
  # 定义 Halo 服务
  halo:
    container_name: halo  # 容器名称
    image: registry.fit2cloud.com/halo/halo:2.22  # 镜像地址
    ports:
      - "8080:8080"  # 端口映射
    volumes:
      - ~/.halo2:/root/.halo2  # 数据卷挂载
    environment:
      - JVM_OPTS=-Xmx256m -Xms256m  # 环境变量
    restart: always  # 容器崩溃自动重启
    networks:
      - halo-network  # 归属自定义网络

# 自定义网络(隔离容器网络)
networks:
  halo-network:
    driver: bridge

第二步:一键启动 / 停止

# 启动(后台运行加 -d)
docker-compose up -d

# 停止
docker-compose down

# 查看日志
docker-compose logs halo

4. 进阶场景:多容器协作

如果 Halo 需要搭配 MySQL 数据库(而非内置数据库),用 Docker Compose 会极其方便,只需在 docker-compose.yml 中新增 MySQL 服务:

version: '3'
services:
  halo:
    container_name: halo
    image: registry.fit2cloud.com/halo/halo:2.22
    ports:
      - "8080:8080"
    volumes:
      - ~/.halo2:/root/.halo2
    environment:
      - JVM_OPTS=-Xmx256m -Xms256m
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/halo?useSSL=false  # 直接用容器名访问 MySQL
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=123456
    restart: always
    networks:
      - halo-network
    depends_on:  # 先启动 MySQL 再启动 Halo
      - mysql

  # 新增 MySQL 服务
  mysql:
    container_name: halo-mysql
    image: mysql:8.0
    ports:
      - "3306:3306"
    volumes:
      - ~/.halo-mysql:/var/lib/mysql  # 持久化数据库数据
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=halo  # 自动创建 halo 数据库
    restart: always
    networks:
      - halo-network

networks:
  halo-network:
    driver: bridge

只需执行 docker-compose up -d,就能自动创建网络、启动 MySQL、再启动 Halo,无需手动逐个配置,这是纯 Docker 命令无法高效实现的。

总结

  1. Docker 是基础,负责单个容器的核心操作,适合简单场景;

  2. Docker Compose 是 Docker 的补充,专注多容器编排,通过 YAML 配置统一管理,适合复杂应用;

  3. 实际开发 / 部署中,单容器用 Docker 命令,多容器(如 Web + 数据库 + 缓存)优先用 Docker Compose。

四、开放网络端口8090

打开阿里云实例控制台,在防火墙(安全组)的规则,添加入口方向的规则。

安全组规则的配置如下表所示:

规则方向

授权策略

优先级

协议类型

端口范围

授权对象

入方向

允许

1

自定义TCP

服务的开放端口:

  • HTTP(80)

  • HTTPS(443)

  • Halo(8090):自定义端口

源:0.0.0.0/0

五、登录halo

通过公网IP:8090即可访问,后续也可购买域名便利访问。

购买域名,则需要安装Nginx服务器。

sudo dnf -y install nginx

随后,修改nginx.conf配置文件。

sudo vi /etc/nginx/nginx.conf

配件文件如下:添加Server相关Halo配置参数。

# Halo博客反向代理配置
server {
    # 监听80端口(HTTP)
    listen 80;
    # 绑定你的域名(替换成qianye16.top)
    server_name qianye16.top www.qianye16.top;

    # 字符编码设置
    charset utf-8;

    # 反向代理核心配置
    location / {
        # 转发请求到Halo的本地端口(8090)
        proxy_pass http://127.0.0.1:8090;
        # 传递真实IP给Halo(统计访问者IP用)
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 传递主机名
        proxy_set_header Host $host;
        # 支持WebSocket(Halo后台实时通知用)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        # 超时设置,避免长连接断开
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
    }

    # 静态资源缓存(提升访问速度)
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        proxy_pass http://127.0.0.1:8090;
        # 缓存1天,减轻服务器压力
        expires 1d;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }
}

启动Nginx服务并设置为开机自启。

sudo systemctl start nginx

sudo systemctl enable nginx

重启Nginx

sudo systemctl reload nginx


评论