本文来自我的个人博客:
https://blog.chiyu.monster/archives/%E4%BD%BF%E7%94%A8docker%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E9%83%A8%E7%BD%B2halo#toc-head-0
使用 Docker + 宝塔面板部署 Halo
  我之前的博客一直基于 WordPress 部署,WordPress 作为老字号博客框架,功能非常强大,但过分繁杂的功能让我无法将注意力写博客这个正事上。Halo 这个框架就进入了文档视野。
  写这篇文章主要是因为官方提供了使用 Docker 部署 Halo 教程,也提供了与宝塔面板配合使用教程
,但并没有提供“如何使用 Docker + 宝塔面板部署 Halo 教程”。所以在此处把我部署 Halo 博客的步骤与踩过的坑记录一下。
另外,本文章并非零基础教程,如果你对服务器购买以及域名解析有疑问,可以看看halo 博客从零部署指南,在步骤“配置halo博客服务”后,再看此教程。
使用 Docker 镜像
  这部分与官方文档中内容一致。此部分最好在 SSH 中进行,宝塔面板中的“终端”功能我没有试过。对工作目录等概念不清楚的话,可以访问官方文档——写在前面。
  如果你不想使用 root 用户运行 Halo,请在执行以下步骤前,执行官方文档——在 Linux 环境部署——安装部分——第一步创建新的系统用户。
警告
请不要在宝塔面板中下载安装一个叫 “Docker 管理器”的应用,这个应用无法打开,并且会在安装后导致无法使用 SSH 。
如果你中招了,请卸载此应用然后重启服务器。
创建工作目录
mkdir ~/.halo && cd ~/.halo
下载示例配置文件到工作目录
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
编辑配置文件,配置数据库或者端口等,如需配置请参考参考配置
vim application.yaml
拉取最新的 Halo 镜像
docker pull halohub/halo:1.4.13
创建容器
docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:1.4.13
-it: 开启输入功能并连接伪终端
-d: 后台运行容器
--name: 为容器指定一个名称
-p: 端口映射,格式为 主机(宿主)端口:容器端口 ,可在 application.yaml 配置。
-v: 工作目录映射。形式为:-v 宿主机路径:/root/.halo,后者不能修改。
--restart: 建议设置为 unless-stopped,在 Docker 启动的时候自动启动
Halo 容器。
打开 http://ip:端口号 即可看到安装引导界面(不要做!!!)。
  在官方文档中,这一步下有如下 TIP ,即如果你需要使用域名以及 反向代理,请不要进行这个步骤。而且因为你正在使用宝塔面板,默认情况下不会开放这个端口的,你也访问不了这个网址。
TIP
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 http://ip:端口号 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
宝塔面板所需软件包下载
  需要在宝塔面板的软件商店安装的软件包有:
Nginx
警告
请不要在宝塔面板中下载安装一个叫 “Docker 管理器”的应用,这个应用无法打开,并且会在安装后导致无法使用 SSH 。
如果你中招了,请卸载此应用然后重启服务器。
添加站点并配置 Nginx
  点击左侧的 网站 菜单项,点击 添加站点 按钮。
  需要填写的表单信息如下:
域名:填写您已经解析到当前服务器公网 IP 的域名。
PHP版本:纯静态。
FTP 和 数据库均不创建,因为 Halo 自带了一个 H2 数据库,除非你想用其他数据库,如 MySQL 代替。不推荐代替,因为当你备份博客时,如果你使用其他数据库,需要自己备份数据库部分。
根目录保持原样即可。
  填写完成之后点击 提交 按钮即可。
设置 SSL
INFO
在配置反向代理之前,我们推荐先设置好 SSL 证书。
  点击左侧的 网站 菜单项,点击 你添加站点时填写的网站名。
  点击左侧的 SSL 菜单项。
  可选择 宝塔 SSL 或者 Let's Encrypt 进行证书申请。
  需要开启右上角的 强制 HTTPS。
修改配置文件
注意:
不要修改教程中未提及的部分。“完整配置文件示例”中有省略号,省略的就是未提及部分,请不要直接复制然后替换配置文件。
配置文件位置
  在根节点添加:
upstream halo {
server 127.0.0.1:8090;
}
  其中的 8090 为 Halo 的运行端口,请按需修改。
  在 server 节点添加:
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
  修改 server 节点中的 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ 节点:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
proxy_pass http://halo;
expires 30d;
error_log /dev/null;
access_log off;
}
  修改 server 节点中的 location ~ .*.(js|css)?$ 节点:
location ~ .*\.(js|css)?$
{
proxy_pass http://halo;
expires 12h;
error_log /dev/null;
access_log off;
}
  完整配置文件示例(仅包含关键部分):
upstream halo {
server 127.0.0.1:8090;
}
server
{
...
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
proxy_pass http://halo;
expires 30d;
error_log /dev/null;
access_log off;
}
location ~ .*\.(js|css)?$
{
proxy_pass http://halo;
expires 12h;
error_log /dev/null;
access_log off;
}
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...
}
  随后点击保存即可。如果配置不生效,请重载 Nginx 或者 重启 Nginx。
最后,访问域名即可进行 Halo 的初始化。
  开始体验你的博客吧!
TIP
Halo 博客分为前台和后台两部分,通过域名直接进入将进入前台,但写文章等功能都在后台,这里为了方便像我一样第一次进入后台后忘记保存网址的小伙伴,贴出后台地址:
你的域名/admin