🚀 使用 Docker Compose 部署 Hexo(静态博客生成器)
🚀 使用 Docker Compose 部署 Hexo 博客
本文是一篇关于使用 Docker Compose 部署 Hexo 的详尽教程,旨在帮助您快速搭建一个基于 Docker 的 Hexo 博客,简化环境配置和部署流程。
📝 项目简介
Hexo 是一个快速、简洁且高效的静态博客框架,它基于 Node.js 开发,允许您使用 Markdown 语法编写文章,然后快速生成静态网页。
核心特点:
- 超快速度:Hexo 支持秒级生成数百个静态页面,得益于 Node.js 的高效性能。
- 一键部署:生成的静态网页可以轻松部署到 GitHub Pages、自己的服务器或其他云平台。
- 丰富的插件和主题:拥有庞大的插件生态系统和主题库,方便您扩展功能和定制外观。
- Markdown 支持:使用 Markdown 语法编写文章,简单高效,专注于内容创作。
- Docker 化部署:通过 Docker 容器化技术,可以避免复杂的环境配置,实现跨平台一键部署和运行。
🔧 部署前准备
在开始部署之前,请确保您的环境满足以下要求,并完成必要的准备工作。
系统环境要求
- 操作系统:支持 Linux(如 Ubuntu、CentOS)、Windows 10/11(建议使用 WSL2)或 macOS。
- Docker 引擎:确保已安装 Docker 引擎(版本 20.10 或更高)。您可以参考 官方 Docker 安装文档。
- Docker Compose:确保已安装 Docker Compose(版本 2.0 或更高)。请参考 官方 Docker Compose 安装文档。
环境检查
在终端中执行以下命令,检查 Docker 环境是否就绪:
docker --version
docker compose version
创建部署目录
建议创建一个独立的目录来管理您的 Hexo 部署文件和数据:
mkdir -p /home/compose/hexo && cd /home/compose/hexo
⚙️ 配置 Docker Compose
接下来,我们需要创建 Docker Compose 配置文件。根据您提供的配置,以下是一个详细的解释和说明。
配置文件详解
在您的工作目录(例如 /home/compose/hexo)下,创建名为 docker-compose.yml 的文件,内容如下:
services:
hexo:
container_name: hexo2 # 容器名称,便于管理(如停止/查看日志)
environment:
- HEXO_SERVER_PORT=4000 # 容器内 Hexo 预览服务端口(固定,不可改)
# 可选:配置 Git 信息(用于自动部署到 GitHub 等平台,需取消注释并修改)
#- GIT_USER=Your Name # 可选:设置 Git 用户名,用于部署
#- GIT_EMAIL=your.email@domain.tld # 可选:设置 Git 邮箱,用于部署
volumes:
- ./app:/app # 核心挂载:本地 ./app 目录 → 容器 /app 目录(存储博客源码,实时同步)
ports:
- 4001:4000 # 端口映射:主机 4001 → 容器 4000(通过主机 4001 端口访问预览服务)
image: spurin/hexo # Hexo 官方优化镜像(集成 Node.js 和 Hexo 环境,开箱即用)
restart: unless-stopped # 容器退出后自动重启(除非手动停止,保障服务稳定)
关键配置说明
-
镜像选择 (
image): 这里使用了spurin/hexo镜像。该镜像通常已经预配置了 Hexo 环境,开箱即用。您也可以根据需要选择其他镜像,例如zuolan/hexo(集成了自动构建和监视功能) 或自行构建的镜像。 -
端口映射 (
ports):4001:4000:将容器内部的 Hexo 服务器端口(4000)映射到宿主机的 4001 端口。您可以通过http://服务器IP:4001访问博客。- 您可以根据需要调整冒号左侧的宿主机端口(例如
8080:4000),确保其未被其他程序占用。
-
数据持久化 (
volumes):./app:/app:这是关键的挂载点。它将宿主机当前目录下的app文件夹映射到容器内的/app工作目录。这样,您的所有 Hexo 项目文件(包括文章、主题、配置)都会保存在宿主机上,即使容器删除也不会丢失数据。- 首次启动时,如果
./app目录为空,Docker 镜像可能会进行初始化(例如,克隆 Hexo 框架源文件并安装依赖),这可能需要一些时间。
-
环境变量 (
environment):HEXO_SERVER_PORT=4000:设置容器内 Hexo 服务器运行的端口。GIT_USER和GIT_EMAIL:这些是可选的环境变量,如果您计划使用 Git 方式部署博客到远程仓库(如 GitHub Pages),可以取消注释并填写您的信息,这些信息用于 Git 提交记录。
示例:在您的工作目录(例如 /home/compose/hexo/app)下,创建名为 _config.yml 的文件,内容如下:
# Hexo Configuration
## Docs: https://hexo.io/docs/configuration.html
## Source: https://github.com/hexojs/hexo/
# Site
title: Hexo
subtitle: ''
description: ''
keywords:
author: John Doe
language: en
timezone: ''
# URL
## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'
url: http://example.com
permalink: :year/:month/:day/:title/
permalink_defaults:
pretty_urls:
trailing_index: true # Set to false to remove trailing 'index.html' from permalinks
trailing_html: true # Set to false to remove trailing '.html' from permalinks
# Directory
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
i18n_dir: :lang
skip_render:
# Writing
new_post_name: :title.md # File name of new posts
default_layout: post
titlecase: false # Transform title into titlecase
external_link:
enable: true # Open external links in new tab
field: site # Apply to the whole site
exclude: ''
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
future: true
syntax_highlighter: highlight.js
highlight:
line_number: true
auto_detect: false
tab_replace: ''
wrap: true
hljs: false
prismjs:
preprocess: true
line_number: true
tab_replace: ''
# Home page setting
# path: Root path for your blogs index page. (default = '')
# per_page: Posts displayed per page. (0 = disable pagination)
# order_by: Posts order. (Order by date descending by default)
index_generator:
path: ''
per_page: 10
order_by: -date
# Category & Tag
default_category: uncategorized
category_map:
tag_map:
# Metadata elements
## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta
meta_generator: true
# Date / Time format
## Hexo uses Moment.js to parse and display date
## You can customize the date format as defined in
## http://momentjs.com/docs/#/displaying/format/
date_format: YYYY-MM-DD
time_format: HH:mm:ss
## updated_option supports 'mtime', 'date', 'empty'
updated_option: 'mtime'
# Pagination
## Set per_page to 0 to disable pagination
per_page: 10
pagination_dir: page
# Include / Exclude file(s)
## include:/exclude: options only apply to the 'source/' folder
include:
exclude:
ignore:
# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
#theme: landscape
theme: butterfly
#theme: fluid
#theme: icarus
#theme: next
#theme: stellar
#theme: fluid2
#theme: yilia
#theme: meow
#theme: shiroi #卡住是typo的变体
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
type: ''
🚀 启动与验证
配置完成后,就可以启动 Hexo 服务了。
启动服务
在 docker-compose.yml 文件所在目录执行以下命令:
docker compose up -d
参数 -d 表示在后台运行容器。
验证服务状态
-
检查容器运行状态: 执行
docker ps命令。如果看到名为hexo2的容器状态为Up,说明容器已成功启动。 -
查看服务日志(可选): 您可以通过以下命令查看容器的启动日志,以排查潜在问题或观察初始化过程:
bash docker compose logs -f hexo初次启动时,可能会看到依赖安装和初始化的日志。 -
访问博客并初始化:
- 在浏览器中输入
http://你的服务器IP地址:4001访问博客。 - 如果服务正常启动,您将看到 Hexo 的默认页面或初始化后的页面。
- 在浏览器中输入
文件结构确认
启动成功后,您应该在部署目录下看到一个 app 文件夹(由数据卷挂载生成),里面包含了您的 Hexo 项目文件。其结构可能类似:
app
├── _config.yml # Hexo 主配置文件
├── source # 存放文章和页面的源文件
│ └── _posts # 您的 Markdown 文章存放于此
├── themes # 主题目录
│ └── landscape # 可能包含默认主题
└── package.json # 项目依赖配置
(2)验证博客初始化与预览服务
1.检查 ./app 目录是否生成默认文件(初始化成功标志):
ls ./app # 应显示 _config.yml(配置文件)、source(文章目录)、themes(主题目录)等
2.访问预览服务:打开浏览器,输入 http://服务器IP:4001(如本地测试:http://localhost:4001);
3.若显示 Hexo 默认页面(“Hello World” 示例文章),说明预览服务正常。
🔌 基础配置与使用
成功部署并访问 Hexo 博客后,您可以开始进行个性化配置和内容创作。
基本配置修改
-
编辑 Hexo 主配置文件: 进入
app目录,找到_config.yml文件(通常被称为站点配置文件),您可以使用文本编辑器修改它。常见的配置项包括:title:网站标题subtitle:网站副标题description:网站描述author:您的名字language:网站语言(例如zh-CN)url:网站的 URL
-
应用更改: 修改配置文件后,通常需要重启 Docker 容器才能使更改生效:
docker compose restart hexo
管理博客内容
1.撰写新文章:
- 最简单的方式是在 app/source/_posts 目录下直接创建新的 Markdown (.md) 文件。您可以使用类似 我的第一篇文章.md 这样的文件名。
- 在 Markdown 文件的开头,建议包含 Front-matter 来设置文章属性,例如:
---
title: 我的第一篇文章
date: 2023-10-10 12:00:00
tags: [Hexo, Docker]
---
在 --- 下方开始撰写您的文章正文。
2.查看更新: 新建或修改文章后,保存文件。通常情况下,您只需要刷新浏览器页面,就能看到更新后的内容。
更换博客主题
1.进入主题目录:
Hexo 的主题通常存放在 app/themes/ 目录下。
2.安装新主题:
您可以从 GitHub 或其他来源克隆喜欢的主题到 themes 目录。例如,安装流行的 Next 主题:
# 确保在 app 目录下操作,或者使用 Docker 命令
docker exec -it hexo2 git clone https://github.com/next-theme/hexo-theme-next.git themes/next
3.启用主题:
修改 app/_config.yml 文件,找到 theme 配置项,将其值改为新主题的文件夹名(例如 next):
theme: next
4.重启容器: 修改主题后,需要重启容器来应用新主题:
docker compose restart hexo
🔌 基础配置与使用2
Hexo 核心操作是 “创建文章→预览→生成静态文件→部署”,所有操作可通过容器命令行或修改本地文件完成:
1. 进入容器命令行(执行 Hexo 命令)
# 进入 hexo2 容器的命令行界面
docker exec -it hexo2 /bin/bash
进入后可执行 Hexo 核心命令(后续操作均在容器内命令行执行)。
2. 创建第一篇文章
# 创建名为“我的第一篇 Hexo 博客”的文章(会在 ./app/source/_posts 目录生成 Markdown 文件)
hexo new "我的第一篇 Hexo 博客"
- 本地查看文章文件:
./app/source/_posts/我的第一篇 Hexo 博客.md,可用 Markdown 编辑器(如 Typora)修改内容。
3. 预览文章效果
# 启动预览服务(默认绑定 4000 端口,容器外通过 4001 端口访问)
hexo server
- 浏览器访问
http://服务器IP:4001,即可实时查看文章修改效果(修改 Markdown 文件后刷新页面生效)。
4. 生成静态文件(部署用)
预览满意后,生成可部署的静态 HTML 文件(存储在 ./app/public 目录):
hexo generate # 简写:hexo g
5. 配置博客基本信息(修改 _config.yml)
本地编辑 ./app/_config.yml(核心配置文件),修改站点信息:
# 示例:修改站点标题、作者、语言
title: 我的 Hexo 博客 # 博客标题
subtitle: 技术笔记 # 副标题
description: 记录学习过程的个人博客 # 描述(用于 SEO)
author: 用户名 # 作者名
language: zh-CN # 语言(中文)
timezone: Asia/Shanghai # 时区
修改后重启预览服务(hexo server)生效。
6. 更换主题(以 Next 主题为例)
1.容器内命令行执行(克隆主题到 themes 目录):
git clone https://github.com/next-theme/hexo-theme-next.git themes/next
2.本地编辑 ./app/_config.yml,修改主题配置:
theme: next # 主题名称改为 next
3.重启预览服务,页面会显示 Next 主题样式。
🛠️ 维护与管理
日常维护
- 服务启停:
# 停止服务
docker compose down
# 启动服务
docker compose up -d
# 重启服务
docker compose restart
- 数据备份:
定期备份部署目录下的
app文件夹至关重要。这个文件夹包含了您的所有博客文章、主题和配置。
# 在部署目录的上一级目录执行
tar -czf hexo-backup-$(date +%Y%m%d).tar.gz hexo/
- 服务更新:
若要更新 Hexo 镜像(例如
spurin/hexo发布了新版本):
# 进入部署目录
cd /home/compose/hexo
# 拉取最新镜像
docker compose pull
# 重启服务
docker compose down
docker compose up -d
注意:在升级前,请务必备份
app目录。对于生产环境,建议先在测试环境中验证新版本的兼容性。
问题排查与日志
- 查看容器日志: 如果遇到问题,查看容器日志是首要的排查手段:
docker compose logs hexo
# 或者实时查看
docker compose logs -f hexo
- 进入容器排查: 有时可能需要进入容器内部进行检查或执行命令(例如安装额外插件):
docker exec -it hexo2 /bin/sh
在容器内,您可以运行 `hexo version` 等命令进行检查。
🐛 常见问题排查
在使用过程中,可能会遇到一些问题,以下是一些常见问题的排查思路:
-
无法通过浏览器访问博客(
http://服务器IP:4001无响应)- 检查防火墙:确保您的服务器安全组(云服务商控制台)和系统防火墙(如
ufw)已放行4001端口。例如:sudo ufw allow 4001。 - 检查容器状态:运行
docker ps确认容器是否正常运行。如果状态异常,使用docker compose logs hexo查看详细错误日志。 - 确认端口占用:检查宿主机
4001端口是否被其他程序占用:netstat -tulpn | grep 4001。
- 检查防火墙:确保您的服务器安全组(云服务商控制台)和系统防火墙(如
-
文章或配置修改后未生效
- 确保文件已正确保存到挂载的
app目录中。 - 尝试重启容器:
docker compose restart hexo。 - 检查 Hexo 配置文件的语法是否正确,特别是 YAML 文件的缩进和冒号后的空格。
- 确保文件已正确保存到挂载的
-
容器启动失败或不断重启
- 查看日志获取具体错误信息:
docker compose logs hexo。 - 检查
app目录的权限,确保 Docker 容器有读写权限。 - 确认
docker-compose.yml文件的语法正确。
- 查看日志获取具体错误信息:
-
关于
spurin/hexo镜像初始化- 首次启动时,如果
./app目录为空,该镜像可能会执行初始化流程(如克隆基础框架、运行npm install),这可能需要几分钟,请耐心等待并查看日志。
- 首次启动时,如果
-
Alpine 镜像兼容性问题
- 如果您使用或构建基于 Alpine Linux 的镜像,有时可能会遇到某些 Node.js 模块或依赖的兼容性问题(例如
command not found错误)。可以考虑换用基于其他 Linux 发行版(如 Debian)的 Node.js 基础镜像,或确保在 Alpine 中正确安装了所有依赖。
- 如果您使用或构建基于 Alpine Linux 的镜像,有时可能会遇到某些 Node.js 模块或依赖的兼容性问题(例如
希望这篇教程能帮助你顺利完成 Hexo 博客的 Docker Compose 部署!Docker 化部署大大简化了环境配置,让你能更专注于内容创作。如果在使用中遇到更复杂的问题,可以参考 Hexo 官方文档、所使用的 Docker 镜像的说明页,或在相关的技术社区寻求帮助。
🐛 常见问题排查2
1. 预览服务访问不了(ERR_CONNECTION_REFUSED)
-
原因 1:4001 端口未开放或被占用。解决:
- 检查端口占用:
sudo lsof -i :4001,若占用则停止对应服务; - 重新开放端口:
sudo ufw allow 4001/tcp,云服务器同步安全组。 - 原因 2:容器内预览服务未启动。解决:进入容器命令行执行
hexo server,确保服务启动(日志显示Hexo is running at http://localhost:4000)。
- 检查端口占用:
2. 文章修改后预览不更新
-
原因 1:未重启预览服务或未刷新浏览器。解决:修改后执行
hexo server重启服务,或按Ctrl+Shift+R强制刷新浏览器。 -
原因 2:Markdown 文件路径错误(未放在
source/_posts目录)。解决:确保文章文件存储在./app/source/_posts目录下,Hexo 仅识别该目录的文章。
3. 主题更换后页面空白或报错
-
原因 1:主题名称配置错误(与
themes目录下的主题文件夹名不一致)。解决:检查_config.yml中theme的值(如 Next 主题文件夹名为next,则theme: next)。 -
原因 2:主题未正确克隆(文件夹为空或缺失)。解决:容器内重新克隆主题:
rm -rf themes/next && git clone https://github.com/next-theme/hexo-theme-next.git themes/next。
4. 执行 hexo deploy 部署失败(提示 Git 错误)
- 原因 1:未配置
GIT_USER和GIT_EMAIL环境变量。解决:修改docker-compose.yml,取消注释并填写实际信息:
environment:
- GIT_USER=你的用户名
- GIT_EMAIL=你的邮箱
重启容器:docker compose up -d。
- 原因 2:未配置部署目标(如 GitHub Pages)。解决:编辑
./app/_config.yml,添加部署配置(以 GitHub 为例):
deploy:
type: git
repo: https://github.com/你的用户名/你的仓库名.git
branch: main
通过以上步骤,新手可快速搭建 Hexo 静态博客,并掌握文章发布、主题更换等核心操作。Hexo 生态丰富,后续可探索评论插件(如 Waline)、SEO 优化等功能,具体可参考 Hexo 官方文档。