Jekyll 与 Docker 入门
了解如何使用 Docker 容器搭建 Jekyll,获得干净、隔离的开发环境。本教程将带你创建、定制和部署静态网站,无需在本机直接安装 Ruby 或 Jekyll,非常适合希望在任何平台上都保持一致工作流的开发者。

Jekyll 是由 GitHub 联合创始人 Tom Preston-Werner 使用 Ruby 编写的静态网站生成器。Jekyll 解析 Liquid 模板和以 Markdown 格式存储的内容,生成可由任意 Web 服务托管的静态内容。这些 Markdown 内容完全不含 HTML、布局、样式以及自定义短代码,而在 WordPress 等其他博客平台中,这些东西往往会污染内容本身。
如果你想找一份不错的 Jekyll 入门资料,我推荐 Jekyll Bootstrap。
Docker
为什么要使用 Docker?Jekyll 在基本配置下只是生成静态内容,但可以通过插件进行扩展。Docker 的好处在于,可以把一个简单、开箱即用的容器交付给开发者或持续部署服务。
Docker Machine
Linux 用户可以跳过安装 Docker Machine,但需要安装 Docker Compose。如果 OS X 用户还没有运行中的 Docker Machine 实例,则需要创建一个。在继续之前,请确保已安装最新版的 Docker Toolbox。
docker-machine create --driver=virtualbox default
eval $(docker-machine env default)
Docker Compose
Linux 用户需要单独安装 docker-compose,因为它通常不包含在 Docker 安装包中。安装说明可以在 Docker 的官网上找到。
Jekyll 容器
Jekyll 在 Docker Hub 上提供了镜像,这让一切变得轻而易举。
注意,我使用的不是该容器的 GitHub Pages 版本。如果你打算使用 GitHub Pages,应将下面的镜像标签从 latest 改为 pages。pages 镜像能更准确地模拟 GitHub Pages 所使用的 Jekyll 配置。
在仓库根目录下创建一个名为 docker-compose.yml 的文件,并输入以下内容:
version: "2"
services:
web:
image: "jekyll/jekyll:latest"
name: jekyll
ports:
- "4000:4000"
volumes:
- ./:/srv/jekyll
networks:
default:
driver: bridge
然后使用 Docker Compose 启动 Docker 容器:
docker-compose up -d
打开你常用的浏览器并访问 http://localhost:4000。由于目前还没有任何文件,容器使用的 Web 服务会列出我们所挂载卷的目录内容。
如果你是 OS X 用户,由于 Docker 运行在虚拟机中,访问 localhost:4000 将得不到响应。你需要运行 docker-machine ip default 来获取 Docker Machine 的 IP,或者在 VirtualBox 中设置端口转发。在 default Docker Machine 运行的情况下,在终端中运行以下命令来设置端口转发:
VBoxManage controlvm "default" natpf1 "http,tcp,,4000,,4000"
之后就可以像访问本地服务一样访问 http://localhost:4000 了。
初始化网站
要初始化网站,我们可以复用现有的 Jekyll 容器。通过 docker exec 命令在仓库根目录下执行 jekyll new . --force。
docker exec -it jekyll jekyll new . --force
刷新浏览器,就能看到重新编译后的 Jekyll 默认主题,以及一些示例页面和文章。
提交到版本控制
现在是添加 Git 仓库、提交网站并推送到你的远程仓库的好时机。将 <username> 替换为你的 GitHub 账号名:
git init
git add . -m "Initial Jekyll site"
git remote add origin git@github.com:<username>/<username>.github.io.git
git push -u origin master
自定义 Jekyll 配置
总有一天你会需要修改 Jekyll 的 _config.yml,这时就需要重启 Jekyll 服务。为此,我们实际上需要重启 Docker 容器。
docker-compose restart