玩转 Docker:一键部署 Hexo 博客环境,彻底告别繁琐配置


大家好!今天咱们来聊一个能极大提升效率的话题——如何使用 Docker 来搭建和管理你的 Hexo 博客。如果你还在为本地 Node.js 版本冲突、环境配置复杂而头疼,那这篇文章就是你的救星。我们将一步步带你从零开始,实现一个干净、隔离、可移植的 Hexo 环境。

为什么选择 Docker?它到底是个啥?

简单来说,Docker 就像一个超轻量级的虚拟机。它能把你的应用程序(比如 Hexo)连同它需要的所有运行库、环境打包到一个“集装箱”里。

  • 轻量高效:与 Vmware 这种重量级虚拟机不同,Docker 直接共享主机的操作系统内核,只隔离运行库和程序本身。性能损失微乎其微,启动速度飞快。
  • 环境隔离:你可以在主机上同时运行需要不同 Node.js 版本的多个项目,它们在各自的 Docker 容器里互不干扰。再也不用担心把主机的环境搞得一团糟了!
  • 一键部署:环境配置好了,打包成一个镜像,就可以在任何安装了 Docker 的机器上一键运行,完美复现。

准备工作:先给你的机器装上 Docker

在开始我们的 Hexo 之旅前,你的电脑或服务器上需要先安装好 Docker 环境。这就像做饭前得先有口锅一样。

Centos 系统安装 Docker

对于使用 X86 架构的 Centos 系统,官方提供了一键安装脚本,非常方便:

curl -sSL https://get.docker.com/ | sh

对于 Arm 架构的 Centos(比如在某些云服务器或树莓派上),步骤会多几步:

  1. 安装必要的工具
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  2. 添加 Docker 的软件仓库
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  3. 安装 Docker 引擎
    sudo yum install docker-ce docker-ce-cli containerd.io
  4. 启动 Docker 服务
    sudo systemctl start docker

QNAP (威联通) NAS 安装 Docker

如果用的是 QNAP,直接在系统应用 AppCenter 中找到 Container Station (容器工作站),点击安装即可。

Synology (群晖) NAS 安装 Docker

同样地,如果你的群晖是 x86 平台的,可以在“套件中心”里找到 Docker 套件并直接安装。(注意:ARM 架构的群晖不支持 Docker 哦)

Docker 版 Hexo 环境一键部署

环境就绪!接下来就是见证奇迹的时刻。这里使用一个已经打包好的 Hexo Docker 镜像,它集成了最新版的 Node.js 和 Hexo,让你省去所有环境配置的烦恼。

执行下面这条命令,你的 Hexo 容器就创建并运行起来了!

docker create --name=hexo \
-e HEXO_SERVER_PORT=4000 \
-e GIT_USER="your-git-username" \
-e GIT_EMAIL="[email protected]" \
-v /path/to/your/blog:/app \
-p 4000:4000 \
bloodstar/hexo

代码解析:

  • docker create --name=hexo:创建一个名为 hexo 的容器。
  • -e HEXO_SERVER_PORT=4000:设置环境变量,指定 Hexo 服务的端口为 4000。
  • -e GIT_USER="your-git-username":设置你的 Git 用户名,用于 hexo deploy
  • -e GIT_EMAIL="[email protected]":设置你的 Git 邮箱。
  • -v /path/to/your/blog:/app这是最关键的一步! 它将你主机上的一个目录(比如 /mnt/myblog)挂载到容器内的 /app 目录。这样,所有 Hexo 的源文件都保存在你的主机上,即使容器删除了,你的博客文章也不会丢失。请务必将 /path/to/your/blog 替换成你自己的真实路径。
  • -p 4000:4000:将主机的 4000 端口映射到容器的 4000 端口。这样你就可以通过访问 http://主机IP:4000 来预览你的博客了。
  • bloodstar/hexo:指定使用的 Docker 镜像。

拥有一个炫酷的 Web 写作后台

每次都用命令行写文章?太麻烦了!我们可以给 Hexo 装上一个后台管理插件 hexo-admin,让你像用 WordPress 一样在网页上写文章、管理文章。

1. 进入 Docker 容器

首先,我们需要进入正在运行的 hexo 容器内部来执行命令。

docker exec -it hexo /bin/bash

执行后,你就进入到了容器的命令行环境,可以像在普通 Linux 系统里一样操作了。

2. 安装并配置 hexo-admin

在容器内,执行安装命令(假设你已经 cd /app):

npm install --save hexo-admin

然后,编辑你博客根目录下的 _config.yml 文件,添加 admin 的配置:

# Hexo Admin- Interface
admin:
  username: youradmin      # 设置你的登录用户名
  password_hash: be121740bf988b2225a313fa1f107ca1 # 这是'password'的bcrypt哈希值, 请替换成你自己的密码哈希
  secret: a secret something # 用于cookie加密的密钥,随便写一串复杂的字符串
  deployCommand: '/app/tools/cide.sh' # 点击后台的Deploy按钮时执行的部署脚本

提示password_hash 需要使用 bcrypt 加密生成。你可以找一个在线工具生成,或者在容器里用 npm install -g bcrypt 然后用 node 命令生成。

配置完成后,重启你的 Docker 容器 (docker restart hexo)。现在,访问 http://主机IP:4000/admin 就可以看到登录界面了!

实现自动化部署:配置 SSH Key

要在后台或者命令行通过 hexo deploy 推送博客到 Github 等平台,你需要让 Docker 容器拥有访问你代码仓库的权限。这通常通过 SSH Key 来实现。

  1. 获取容器内的公钥:这个 Docker 镜像在启动时会自动在 /app/.ssh 目录下生成一对 SSH 密钥。我们先进入容器:

    docker exec -it hexo /bin/bash
  2. 查看并复制公钥

    cat /app/.ssh/id_rsa.pub

    复制输出的全部内容(以 ssh-rsa 开头)。

  3. 添加到 Github

    • 登录 Github,点击右上角的头像 -> Settings
    • 在左侧菜单选择 SSH and GPG keys
    • 点击 New SSH keyAdd SSH key
    • Title 随便填,Key 粘贴你刚刚复制的公钥内容,然后保存。

搞定!现在你的容器就可以免密推送到你的 Github 仓库了。

高级玩法:使用 Nginx 反向代理

每次都用 IP:端口 的方式访问博客,是不是觉得有点 low?而且没法用 HTTPS。我们可以用 Nginx 作为反向代理,实现通过域名(如 blog.17lai.fun)来访问,并且还能轻松加上 SSL 证书。

我们同样使用 Docker 来运行 Nginx。

1. Docker Compose 配置

创建一个 docker-compose.yml 文件,把 Nginx 和 Hexo 放在一起管理,会更方便。

version: '3'
services:
  hexo:
    image: bloodstar/hexo
    container_name: hexo
    environment:
      - GIT_USER="your-git-username"
      - GIT_EMAIL="your-git-[email protected]"
    volumes:
      - /path/to/your/blog:/app
    # 这里不需要 ports 映射了,因为 Nginx 直接和它内部通信

  nginxweb:
    image: bloodstar/nginx-purge
    container_name: "nginxweb"
    ports:
      - "80:80"
      - "443:443"
    restart: always
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro # Nginx 网站配置
      - ./nginx/certs:/etc/nginx/certs:ro   # SSL 证书
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # Nginx 主配置
    depends_on:
      - hexo

2. Nginx 配置

docker-compose.yml 同级目录下创建 nginx/conf.d 文件夹,并新建一个 blog.conf 文件:

upstream blog {
    # 'hexo' 是上面 docker-compose.yml 文件里定义的 hexo 服务的名字
    server hexo:4000;
}

server {
    listen 80;
    server_name  blog.17lai.fun;

    # 如果要启用 SSL,请取消下面的注释
    # listen 443 ssl http2;
    # ssl_certificate /etc/nginx/certs/your_cert.pem;
    # ssl_certificate_key /etc/nginx/certs/your_key.key;

    access_log /var/log/nginx/blog.access.log;
    error_log  /var/log/nginx/blog.error.log;
    
    location / {
        proxy_pass http://blog;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    } 
}

3. 本地测试:修改 Hosts 文件

为了让你的电脑知道 blog.17lai.fun 这个域名指向你的 Docker 主机,需要修改一下 hosts 文件。

  • Windows: 文件路径是 C:\Windows\System32\drivers\etc\HOSTS。需要用管理员权限的记事本打开,在末尾添加一行:

    127.0.0.1   blog.17lai.fun

    (如果 Docker 运行在其他机器,请把 127.0.0.1 换成那台机器的 IP)

  • Linux/Mac: 文件路径是 /etc/hosts。使用 sudo vim /etc/hosts 编辑,同样在末尾添加上面那行。

现在,在 docker-compose.yml 所在目录运行 docker-compose up -d,然后直接在浏览器里输入 http://blog.17lai.fun,就可以访问你的博客了!是不是非常酷?

结语

通过 Docker,我们不仅快速搭建了一个稳定、纯净的 Hexo 运行环境,还学会了如何使用后台、配置自动部署以及通过 Nginx 实现域名访问。整个过程下来,你会发现,折腾环境的时间大大减少,可以更专注于内容创作本身。快来试试吧,享受 Docker 带来的丝滑体验!


  目录