XxBlog

knowledge is power

我叫潘潘,来自成都,是一名 Java,Python 开发者,爱好广泛,热爱各种新技术,致力成为一名全栈开发工程师。


基于Docker搭建Jekyll并实现自动部署

国内的服务器到期之后,博客就停了,最近打算重新启用起来,所以决定花了一天时间来重新搭建了一下。 先上地址:https://xxblog.cn

博客准备

博客是基于 Jekyll 搭建的,然后主题使用了 @onevcat 大神修改的 vno-jekyll ,一直很喜欢这种风格的博客,好了,开始正题。

Docker

既然jekyll是一个独立的服务,那么选择基于docker来运行它是自然了的。

Dockerfile
FROM ruby:latest
RUN gem install jekyll bundler
COPY blog /blog/
RUN cd blog \
         && bundler install
WORKDIR /blog
CMD bundle exec jekyll serve --host 0.0.0.0

这里我遇到了一个大坑,最后一行启动jekyll的命令bundle exec jekyll serve --host 0.0.0.0,默认如果不加 --host 0.0.0.0, 程序只绑定了127.0.0.1端口,使用Docker -p 4000:4000无法成功映射,找了很久的原因才发现,docker映射端口之后,是使用了宿主机的IP地址去访问 container 中的服务的,所以自然是访问不了只绑定了127.0.0.1的端口咯,再贴上 docker-compos文件。

docker-compose.yml
version: '3'
services:
  blog:
      build: .
      image: jekyll/blog:latest
      ports:
   		- "14000:4000"
      networks:
        - test-net
networks:
  test-net:

然后每次我都只需要 pull 一下Git远端仓库的更新,然后重新 build 一下docker image 就可以了。

自动部署

本来到了这里博客就已经可以通过Docker来运行了,但是爱折腾的我怎么能就这样停止了呢? 每次写完文章都要手动登录到服务器执行这么多行命令实在是太不方便了。我最想要的方式还是在本地写好了文章, push 到 Git 远程仓库,然后网站就自动更新。、 说干就干,首先把更新文章,构建镜像然后启动这些步骤都写到一个 shell 文件里面去。

build.sh
git pull origin master \
        && docker-compose build \
        && docker-compose down \
        && docker-compose up -d

每次只需要执行以下./build.sh就可以实现自动更新,构建,重启了,但是这样还是需要手动登录到服务器执行命令,如果我们连这一步都想要省去 呢? OK 配合 Git 的 Webhook就可以实现。 首先我们需要在服务器上面启动一个 http 服务,这么简单的一个需求,就用 python 来实现吧。

webhook.py
#!/usr/bin/env python
# coding=utf-8
from wsgiref.simple_server import make_server
import subprocess


def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    subprocess.Popen('/mnt/blog/build.sh')
    print('update success.')
    return [b'success, web hook!']


httpd = make_server('127.0.0.1', 18000, application)
print('Serving HTTP on port 18000...')
httpd.serve_forever()

然后再通过 nohub python webhook.py & 后台运行这个 python 程序就可以了。最好再把这条命令设置成开机启动。

教程完成,就当给自己记录一下吧。

最近的文章

Nginx 反向代理DNS缓存问题

发现问题作为一名程序员,Jetbrains 家的IDE自然是必须要使用的一个好工具,但是自从2017.3版本之后网上几乎所有的激活服务器域名都被封杀了,后来看到一篇博客文章给出了一个解决方案,可以通过自己的网站反向代理一个被封杀了的激活服务器,可以完美解决,所以我就通过自己服务器上的 Nginx 做了一个反向代理,但是使用一段时间之后发现偶尔会有失败的情况,经过努力排查发现只要重启一下服务器上的 Nginx 就可以解决这个问题,以前没有时间去检查就没有处理过,今天快过年了工作比较闲而且又出...…

nginxdnscache继续阅读
更早的文章

2018新年计划

技术方面前端 VUE2.0 10% Webpack 50%后端 Guava Spring 源码阅读 Spring Cloud 设计模式读书计划 人月神话 设计模式 SQL必知必会 代码整洁之道 Effective Java其他计划 LeetCode刷题12*5=60道 (6/60) 写12篇博客,每月一篇以上减肥 减到145斤…

Plan继续阅读