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。