镜像选择
选择使用 Docker 部署,是为了能方便、快速的部署,这样可以聚焦到 Hexo 本身。
Hexo 官方是没有提供 Docker Image 的,因此需要自行寻找。
在寻找 Hexo 镜像的过程,花了一些时间,走了一段弯路。这里只介绍一下我试用过的镜像,以及碰到的问题。
bloodstar/hexo。在修改配置文件_config.yml或者发布文章等变更操作后,必须要重启容器,才能生效。在github上提起issue沟通后,得知无法解决这个问题。个人也发现了,可能和node的特性有关,restart pm2这个内部的web服务器也可以立即生效,个人的解决方法是如下重启web服务
pm2 restart /hexo_run.js。taskbjorn/hexo。这个镜像会有权限问题。简单来说就是因为,当宿主机上不存在挂载目录时,Docker 会自动创建它,但这个创建操作是由 Docker daemon 执行的,而 Docker daemon 通常以 root 权限运行,所以自动创建的目录归属于 root。这个创建过程发生在容器启动之前,与你在 docker-compose.yml 中设置的 user: 1000:0 无关。
到最后,我自己编写了一个 Dockerfile ,如下:
1 | # ============================================ |
接下来构建镜像
1 | ## --network host。让 docker build 时,使用宿主机网络, 这样 Dockerfile 中配置的代理才能生效。 |
在这里可以引申出一个知识点。
Docker 的三个环境:
- 第一个环境是 docker daemon 守护程序,就是运行在我们电脑上的 docker 软件,它负责管理镜像和容器。我们在命令行输入的内容,就是由 docker daemon 来处理的。
- 第二个环境是 docker build 环境。也是一个容器环境。docker 在 build 镜像时总是要新建一个临时容器,这个容器带了一个环境,build 的过程就在该环境中运行。
- 第三个环境是容器 container 自己的环境。每个运行的容器拥有的环境不同。
因此,可以对应三个很经典的问题
docker pull失败- 最佳解决方案是,修改
/etc/docker/daemon.json文件。1
2
3
4
5
6{
"proxies" : {
"http-proxy" : "http://127.0.0.1:7890",
"https-proxy" : "http://127.0.0.1:7890"
}
}
- 最佳解决方案是,修改
docker build失败- 最佳解决方案是,使用宿主机网络。
--network host。
- 最佳解决方案是,使用宿主机网络。
docker run失败- 最佳解决方案是,使用代理。
部署
这个镜像只提供一个环境,其实也并没有彻底解决权限问题,使用起来有先决条件。
那就是在启动容器之前,在宿主机创建挂载目录,并配置权限。
1 | mkdir -p ./blog ./ssh |
我习惯使用 Docker-Compose 来部署,如下:
1 | # ============================================ |
部署到 Github Pages
配置免密环境
1、配置本地 git 环境
1 | ## 邮箱必须和Github的注册邮箱一致 |
2、配置本地公钥对
1 | /home/hexo/.hexo # ssh-keygen -t rsa -C mali@codermali.com |
3、配置一键部署
Hexo 提供了快速、简便的部署策略。 您只需一条命令即可将网站部署到服务器上。
1 | $ hexo deploy |
该命令需要插件 hexo-deployer-git 支持,
1 | ## 安装 hexo-deployer-git |
同时,还需要修改配置文件 _config.yml
1 | # Deployment |
在这里有一个注意点, repo 的链接必须是 git 的链接,如果是 http 的链接,那么就需要配置 token ,否则在 hexo deploy 时会提示输入账号和密码。
参考:
hexo 部署填写 github 用户名和密码一次性解决方案_hexo账号忘记密码-CSDN博客
4、创建名为 ***username*.github.io** 的仓库。
注意: username 必须是 Github 的账户名。
5、部署
1 | /home/hexo/.hexo # hexo deploy |
6、部署成功

7、解析自定义域名到 Github Pages
1、添加域名

2、域名解析 CNAME 到 https://codermali.github.io/

3、完成