使用Docker和docker-compose容器化部署Hexo博客

使用Dockerfile和docker-compose容器化部署Hexo博客
使用Docker和docker-compose容器化部署Hexo博客
Photo by Jeremy Thomas / Unsplash

On this page

最近闲来无事,鼓捣了一下Hexo博客;Wordpress虽好,但好看的主题没几个,而且Wordpress的文章以SQL的形式存储在数据库里,想要迁移也挺困难;船小好掉头,趁着文章还不太多的时候把博客迁移到Hexo来。

Hexo最大的优点就是文章和页面都是.md格式的文件,即使不做博客了也可以拿来当笔记正常用

通过Dockerfile构建Hexo镜像

FROM node:latest
MAINTAINER CHUNYIWANG
WORKDIR /hexo
RUN npm install hexo-cli -g \
    && hexo init . \
    && npm install hexo-word-counter \
    && hexo clean \
    && hexo generate
VOLUME ["/hexo"]
EXPOSE 4000
CMD ["server"]
ENTRYPOINT ["hexo"]

这里安装了hexo-word-counter模块是因为目前使用的主题有需求,这个模块并非必须。
建议在做Dockerfile时先看好自己准备用的主题有哪些模块要求,通过dockerfile来直接安装好;否则要安装模块还需要exec到容器内执行npm命令,比较麻烦。
另外安装模块必须在初始化hexo后执行,一开始不知道这个点反复搞了半天。

创建docker-compose文件

version: "3"
services:
    hexo:
      image: chunyiwang/hexo:latest
      volumes:
        - blogfiles:/hexo
      restart: always
      networks:
        mynet2:
          ipv4_address: 172.20.0.10

volumes:
  blogfiles:

networks:
  mynet2:
    ipam:
      config:
        - subnet: 172.20.0.0/24

通过docker-compose管理容器

创建容器

docker-compose -f docker-compose.yml up -d

重启容器

docker-compose -f docker-compose.yml restart

停止容器

docker-compose -f docker-compose.yml stop

配置Nginx请求转发

目前博客只是运行在了容器内的内网IP上,无法提供外部访问;虽然nodejs本身可以充当web服务器提供网络服务,但是如果要配置ssl安全链接就比较麻烦了,因此,我们直接把nginx跑在80和443端口上,将接收到的请求转发给Hexo的4000端口上。

除此之外,使用Nginx做代理的另一个优点是允许我们在一台主机上运行多个Web服务,如果使用端口映射的话一台主机只有一个80和443端口,因此一旦被某个容器占用,这台主机就没办法再提供面向公众的Web服务了。

Nginx配置如下:

server {
        listen 80;
        listen [::]:80;
        listen 443 ssl;
        server_name blog.freelytomorrow.com freelytomorrow.com;

        ssl_certificate /etc/nginx/certification/chain.crt;
        ssl_certificate_key /etc/nginx/certification/SSL.key;

        location / {
            proxy_pass http://172.120.10.1:4000;
            include proxy_params.conf;
        }

        if ($server_port = 80) {
            rewrite ^(/.*)$ https://$host$1 permanent;
        }
}

由此一来,当用户访问博客时,nginx会作为反向代理服务器将请求转发给4000端口的nodejs。