使用 Docker + Hexo 搭建 Blog (保姆级教程)
今天我们来学习如何快速使用 Docker + Hexo 的组合来搭建我们的 Blog
前言
当我们站在信息爆炸的时代,我们拥有着前所未有的信息获取和分享能力。在这个数字化的世界里,博客已经成为了人们分享见解、展示才华、建立个人品牌的重要工具之一。然而,搭建博客并不仅仅是为了追逐潮流或者跟随趋势,而更是一种展现个人价值、记录生活点滴、探索思想的平台。
为什么要写博客?
写博客,首先是一种表达自己的方式。在博客中,你可以尽情地分享你的所思所想,无论是对某个领域的独特见解,还是对生活的深刻感悟,都可以通过博客找到自己的发声渠道。同时,博客也是一个记录自己阶段性技术进展的平台。
我为什么写博客?生命不停,装逼不止 立德、立功、立言“三不朽”。
《左传》载曰:“太上有立德,其次有立功,其次有立言,虽久不废,此之谓不朽。”
为什么使用 Docker 和 Hexo
为什么使用 Docker
Docker 是一种轻量级虚拟化技术,能够隔离应用程序的运行环境,而与主机共享内核。它提供了私有的运行库和环境,运行 Docker 程序与直接在主机上运行的程序相比,性能损失微乎其微。使用 Docker,你可以同时运行各种不同的运行库环境,而无需担心影响主机环境。另外,通过私有仓库和镜像的推拉,使得在更换服务器时,无需重新部署运行环境,同时夜简化了内容的搬迁和备份过程。
为什么使用 Hexo
Hexo 简洁易用,部署简单,拥有丰富的插件资源。由台湾人 Tommy Chen 创建,对中文支持良好。同时,作为开源项目,便于学习和自定义。生态较为完善,插件资源丰富。对 Markdown 语法友好,无后端,采用纯静态页面渲染,速度更快。文章和源码可通过 Git 管理备份,方便保存和维护。
使用 Docker 部署 Hexo
如果没有 Docker 环境,可以参考往期博客 Docker 安装部署 或者前往官网自行安装,本篇博客不再赘述。
本次使用到的镜像是其他大牛构建好的 Hexo 镜像, 镜像名称为: bloodstar/hexo。(题外话:后续会出教程如何构建属于自己的镜像)
继去年 Docker Hub 被”不知名原因”封锁后,导致各大镜像库或注册表都无法使用,但使用 docker pull 命令或者其他镜像源依然可以下载镜像。但在 2024-06-07 日(该日期之后暂不得知是否可以使用,毕竟电视剧看得少,我不会穿越),不管通过 docker pull 还是改镜像源,都无法访问 docker 镜像库了,这就导致所有存于 Docker Hub 的镜像无法下载。
为了教程的继续,博主部署了一个私有镜像仓库,开放给大家使用。
连接私有镜像仓库
1 | docker login --username=aliyun9370610045 registry.cn-shanghai.aliyuncs.com |
使用该命令可以连接我的私有镜像仓库, 显示 Login Succeeded 即为登录成功,如图所示:

拉取镜像
接下来,使用以下命令拉取私有镜像仓库中的 Hexo 镜像:
1 | docker pull registry.cn-shanghai.aliyuncs.com/huangyoufeng/bloodstar_hexo:latest |


等到全部下载完成后,我们将得到这样一个镜像:

可以看到这个镜像名称十分长,很不优雅,我们使用 docker tag [IMAGE ID] NEW_REPOSITORY:NEW_TAG 命令来给他进行一个”重命名”:

1 | docker tag 0f0ceca04a77 bloodstar/hexo:latest && docker rmi -f registry.cn-shanghai.aliyuncs.com/huangyoufeng/bloodstar_hexo |
命令解释:
可以看到,在 && 左右各有一条命令
第一条命令 TAG 命令: docker tag [IMAGE ID] NEW_REPOSITORY:NEW_TAG 的作用是复制一份镜像,并给新镜像的名称和标签进行重命名
第二条命令 RMI (remove image)命令: docker rmi -f [REPOSITORY / IMAGE ID] 的作用是删除镜像,-f 表示 forced,即为强制删除。(加上这条命令纯粹是博主本人强迫症,不希望镜像里面有 2 条IMAGE ID一样的记录 特别是这条名称这么长的)
在镜像已经被启动为容器的时候,不建议使用 -f 选项来删除镜像,而应该是先停止并删除容器后,再删除镜像。如果使用 -f 强制删除镜像,会使得镜像的 REPOSITORY 和 TAG 都变为<none>
Tips
在Linux中, && 符号用于连接两个命令,表示当第一个命令成功执行后,才会执行第二个命令。
使用 docker tag [IMAGE ID] NEW_REPOSITORY:NEW_TAG 命令打了新的 TAG 会多了一条记录,但是从 IMAGE ID 可以得知他们是同一个镜像,举个类比:在 git 中,同一个代码项目,可以有多个不同的分支。
在如上RMI命令中,不带 TAG 默认删除TAG 为 latest 版本标签的镜像,如果删除的不是 latest (最新版本), 需要指定 TAG 才能成功删除。
题外话:TAG 命令的使用场景
当镜像配置到一定程度时,想打个 tag 进行记录当前版本,可以打个 V1
再次更新镜像时,又可以打个 V2
当是最新版本待上传时,可以不打默认就是 latest 最新
这样不仅能保存最新版本的镜像,也能保存历史版本的镜像,方便新版本镜像出问题时进行版本回溯
现在我们已经从仓库拉取了镜像,Docker 三要素里的最后一个便是容器了。
启动和配置容器
docker compose 常用命令
在本小节正式开始学习之前,我们先来熟悉一下 docker compose 的一些常用命令:
常用命令
docker-compose up:构建并启动 Docker Compose 文件中定义的所有服务。
docker-compose down:停止并删除 Docker Compose 文件中定义的所有服务以及相关的网络和卷。
docker-compose ps:列出 Docker Compose 文件中定义的所有服务的状态。
docker-compose restart:重新启动 Docker Compose 文件中定义的所有服务。
docker-compose stop:停止 Docker Compose 文件中定义的所有服务,但不删除它们。
docker-compose start:启动 Docker Compose 文件中定义的所有停止的服务。
docker-compose logs:查看 Docker Compose 文件中定义的所有服务的日志输出。
接下来,我们将会用2种方式通过镜像启动容器。但在容器启动之前,我们需要先完善一下 Hexo 所需要的一些配置。
容器启动前置处理
容器成功启动后,我们需要将容器中的某些文件和文件夹挂载到宿主机上。这样做的好处是,我们可以避免每次都需要进入容器进行操作。毕竟,宿主机的环境通常比容器内的环境更加完善。例如,yum、vim 等工具在容器中重复配置会失去容器的意义。
创建要挂载的文件夹

1 | mkdir -p /mnt/docker/hexo |
命令解释
首先通过 mkdir(make directory)是用于创建目录的命令, -p 参数是 mkdir 命令的一个选项,用于创建目录的同时创建其所需的父目录。如果指定的目录中的某些父目录不存在,mkdir -p 将会创建这些父目录。这样可以避免出现错误提示并且简化创建目录的过程。
cd 命令移动到指定文件夹就不用我多说了哈
启动容器
使用 Docker-compose 部署容器(建议)
我们在 /mnt/docker/hexo 目录,使用 vim 或者 vi 命令创建一个 docker-compose.yml 文件:
1 | cd /mnt/docker/hexo |
vim 编辑器中复制或者输入以下命令(我都给你了,能复制何必手输呢?):
1 | services: |
参数解释
container_name: hexo:指定创建的容器的名称为 hexo。
image: bloodstar/hexo:指定要使用的 Docker 镜像为 bloodstar/hexo。这个镜像将用于创建容器。
environment:定义容器的环境变量。
- HEXO_SERVER_PORT:容器内
Hexo的默认端口 - GIT_USER=yofeng:告诉
Hexo服务使用的Git用户名。 - GIT_EMAIL=h.yofeng@outlook.com: 告诉
Hexo服务使用的Git邮箱地址。
volumes:定义要挂载到容器中的卷。
- ${PWD}/data/:/app/: 这个卷将容器中的
/app/目录与当前宿主机的工作目录下的/data/文件夹进行挂载
ports:定义容器的端口映射。
- 8080:4000:将容器的
4000端口映射到主机的8080端口。这样,外部的请求就可以通过主机的8080端口访问到容器中运行的Hexo服务。
在复制时,直接复制可能会出现格式错乱的问题,我们首先需要在命令行模式中(刚进入时按下 : 由普通模式进入到命令行模式) 输入 set paste 并按回车(set paste 命令用于在插入模式下禁用自动缩进和自动格式化功能,又称粘贴模式)。

然后输入小写的 i 由命令行模式进入插入模式(当左下角显示-- INSERT (paste) --就代表操作成功,可以进行复制粘贴了)



接下来,我们按下键盘左上角的 ESC 按键,由插入模式转为普通模式,然后输出 :wq 进入命令行模式并安全退出(我一般用x),我们的 docker-compose.yml 就编辑好了。

最后,我们使用 docker compose up -d 命令,来启动容器:

可以看到我们的容器已经被启动成功了。
使用 docker run 部署容器
我们也可以像启动临时容器那样使用 docker run 来部署容器,具体命令:
1 | docker run -d \ |

两种方式都可以成功部署启动容器,可以选择自己喜欢的模式来部署,
(没有 vim 或者 vi 什么编辑器都没有的读者 应该不会出现这种情况吧?应该吧? 也可以使用 touch 命令先创建一个空文件夹,然后使用 echo "内容" > 文件名 的方式同样可以完成写入数据的操作。有这闲工夫 。)vim 都下载安装好了
部署到远程仓库
修改 _config.yml 文件
在容器成功部署启动之后,稍等一下它下载完依赖后,我们可以进入到 data 文件夹中,可以看到如下文件:

其中我们需要重点配置一下 _config.yml 中的 Site 部分(在最开头)和 deploy 部分(在结尾):
在当前目录(/mnt/docker/hexo/data/)下,我们使用 vim 命令来编辑 _config.yml:
1 | cd /mnt/docker/hexo/data |

我们需要将开头 Site 的部分,填充以下内容(不是照着我的抄阿喂,按照自己的来写噢!):
1 | title: Yofeng # 博客网站的标题 |
在替换完之后,我们来到 vim 编辑器的最后一页:

将 deploy 部分按照自己的 github 或者 gitee 等远程代码仓库信息来填写,例如:
1 | deploy: |
Tips
vi 或者说 vim, 有三种模式,分别是普通模式,插入模式, 命令行模式,三者之间可以来回切换。而我们在刚进入 vim 编辑器,处于普通模式,我们可以通过输入 i 来进入插入模式进行文本编辑。在编辑完需要编辑的文本后,再通过点击电脑左上角的 ESC 按键,由插入模式转为普通模式。最后,通过输入 : 符号进入命令行模式,并接着输入 wq 安全保存并退出 vim 编辑器(我比较常用 x)。
配置 github 免密环境
我们需要获取位于 /mnt/docker/hexo/data 目录下的 .ssh 文件夹中的 id_rsa.pub 文件的内容,即容器启动时根据我们填入的 git 信息生成的 SSH 密钥。

(其实也不必如此繁琐,直接 vim /mnt/docker/hexo/data/.ssh/id_rsa.pub 就好了,但是说了保姆级教程,那就一步一步来)
将里面所有的内容全部复制,到我们上一小节修改的配置文件中 deploy 所选择的代码仓库的账号里,添加 SSH 密钥。例如我的是 github。


在填写完信息之后,使用 docker compose restart 我们重启一下我们的 Hexo 容器:

现在我们就可以免密将我们的文件和博客内容上传到我们的远程仓库了
测试部署到远程仓库功能

此刻我们的代码仓库里空无一物,现在我们使用 docker exec -it hexo bash 命令进入容器内部测试是否成功。

使用 hexo deploy 或者 hexo d 命令来将我们的博客内容上传到我们的远程仓库中:

现在我们的代码仓库就有了我们刚刚上传的数据了

当执行 hexo deploy 时,Hexo 会将 app 目录中的文件和目录推送至 _config.yml 中指定的远端仓库和指定分支中,并且完全覆盖该分支下的已有内容。
如何写博客
在 Hexo,我们可以通过三种方式去添加我们的博客。
在服务器中直接编写博客文章
我们可以选择在容器内使用 hexo new page [postsName] 来创建一篇博客文章,并对他进行编辑(不推荐),也可以直接在容器中的 /app/source/_posts/ 下直接新增一个 .md 后缀结尾的文件并编辑,来创建一篇博客文章。
由于篇幅关系,本文仅展示第二种:
由于前文我们将容器中 /app 文件夹挂载在宿主机的 /mnt/docker/hexo/data/ 下,所以我们可以直接在宿主机中对文件夹 /mnt/docker/hexo/data/ 中的 source/_posts/ 进行新增编辑操作
可以看到目前我们只有一篇 Hexo 在创建容器时自动帮我们生成的文章
而我们通过 IP + 前面 docker-compose.yml 或 docker run 中设置的 -p 选项左边的端口,来访问我们的 Hexo,可以看到当前有一篇 Hello World 文章

接下来我们使用命令, vim test1.md 来创建一篇测试博客,并输入我们的博客文章内容(我这里就随便写点东西了哈):

例如:
1 | # Hellow Hexo |
随后我们刷新一下网站页面,会发现我们刚刚写好的文章已经被渲染到页面上去了,(我没有设置文章标题等信息,所以在最新文章里显示(no title),页面也比较简陋,后续会写一个关于 如何更换 Hexo 主题 的文章)

在本地编写博客文章后上传
上述方法十分简单,但局限性也很多,例如:没有办法在线预览; 在 Linux 环境中使用 vim 编辑器来编写文本对新手也不太友好,所以接下来我们使用更简单的另一种方式来实现写博客的操作。
我们可以在本地使用任意文本编辑器,例如 sublime Text 3, VS code, IDEA 等编辑器,例如博主这里使用的是 VS code 编辑器,轻量的同时,也可以边在线预览边编写博客:

在我们编写完我们的博客文章之后,我们使用 scp 命令,将我们写好的博客文章上传到我们宿主机中
例如我现在创建了一个 test2.md 的文件,模拟了我写作了一篇博客:

接下来使用 scp [文件路径/文件] 服务器用户@IP:[指定目录] 命令,来将我们的文章上传到服务器指定的目录中。

命令解释
scp [选项] [源文件] [目标位置]
scp 是一个用于在本地计算机和远程计算机之间安全地传输文件的命令行工具。它的全称是 Secure Copy,通常用于在两台计算机之间复制文件或目录。
scp 命令基于 SSH 协议,因此它能够提供加密和安全的文件传输。
在我们输入完命令,并通过密码校验后,我们的文章被上传到了我们指定的容器挂载在宿主机的文章目录中,接下来,我们到我们的宿主机、容器内部以及网站中看看是否成功上传:
宿主机和容器内部:
网站:
可以看到不论是宿主机还是容器,亦或者是网站,都成功显示了我们刚刚推送的博客文章。
安装部署 Hexo 的管理服务。
例如 Hexo-Admin, Hexon,Hexo-Exon, Qexo等。使用上述服务可以很方便的对 Hexo 进行管理,例如新增,修改,删除等操作。除此之外,只要有网络,可以随时随地在网站上在线编写,且兼顾预览功能,甚至可以在手机浏览器进行在线编写。关于这块内容较多,后续有空会专门写一篇文章来阐述。
结语
通过本文,我们学习了如何利用 Docker 和 Hexo 搭建一个简单而强大的博客系统。Docker 提供了容器化技术,使得我们可以方便地部署和管理应用程序,而 Hexo 则是一个快速、简洁且高效的静态博客框架,能够满足我们的博客需求。
希望本文能够帮助您快速入门 Docker 和 Hexo,并且启发您发挥创造力,打造出属于自己的博客世界。让我们一起分享知识、交流思想,共同见证博客的魅力和价值!
- 标题: 使用 Docker + Hexo 搭建 Blog (保姆级教程)
- 作者: HYF
- 创建于 : 2024-06-07 23:12:32
- 更新于 : 2024-06-08 00:43:29
- 链接: https://yofeng.love/hexo-db3e2cd2d6a4/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。