Skip to main content

03 Hexo基于Docker上运行并发表到Gitlab

一 需求说明

  • 需求1:hexo快速迁机.hexo的源文件是存放在一台主机上的.而到了后期迁机会带来一系列麻烦,不是很方便.需要寻找一种能快速迁机的方法.
  • 需求2:让百度收录hexo页面.我之前hexo生成的静态文件是发布到github上的,考虑到github禁止百度抓取网页,导致百度将不能收录博客上的文章.需要实现百度能抓取网站收录的方法.
1 需求解决方案说明.
1.1 关于"hexo快速迁机"实现说明.

hexo基于docker可以实现快速迁机.流程操作步骤如下(点击查看实例):
1.1.1 配置dockerfile文件并构建hexo项目;
1.1.2 收集迁机所需要的文件;
1.1.3 迁机测试;
1.1.4 迁机小结和讨论;

1.2 关于"让百度收录hexo页面"实现说明.

由于gitlab是允许百度抓取的,所以将发布到github的页面改为gitab,实现百度收录.

  • 注:由于这个时间不够,只能下次再补上gitlab的相关教程了,这里是gitlabhexo官方教程,把例子拉下来再把markdown和主题挂上去再推送上去就行了,嗯,就这简单
2 准备工作
3 方案最终实现的理想结果

在任意一台安装docker且联网的主机上导入打包好的源码文件,一键自动化完成迁移,并实现在容器中发布能被百度收录的网站,实现快捷完全迁机,并且跟原来原来宿主主机的环境基本一致.

  • 整个源码文件+docke构建文件,用一条命令在已经安装好docker且能联网的主机上,自动化构建镜像完成全部自动化布署。由于我已经预见结果了,就先说下成功总结:由于镜像是由dockfile构建的非黑盒镜像,dockefile几乎不占用空间,而且hexo需要的依赖库由于会在构建时自动化下载,可以在源码文件中删除掉。所以整个项目的迁移大小其实就是你写的一些markdown文本和静态文件加上一个40多M的hexo框架,整个迁机的过程是非常轻量化的,操作很方便。

二 好,开干

实例:1.1.1 配置dockerfile文件并构建hexo项目;

新建一个任意目录并进入,这里用hexo目录做演示mkdir hexo && cd hexo;.以下是Dockerfile构建文件内容并保存起来,也可以根据自己的需求来定制.

        #基于debian 8.8
FROM node:8.2.0
# 安装hexo推送依赖git工具
RUN apt-get upgrade -y \
&& apt-get -y install git \
#git用户名,如:
&& git config --global user.name "wuchuheng" \
#git用户email,如:
&& git config --global user.email "wuchuheng@163.com" \
# 淘宝npm镜像
&& npm install -g cnpm --registry=https://registry.npm.taobao.org \
# 安装hexo命令行工具
&& cnpm install -g hexo-cli \
#初始化hexo项目目录,置于/hexo
&& hexo init /hexo && cd /hexo \
#根据自己喜好来安装插件,如:
#git 插件用于推送到仓库,必备插件之一,
&& cnpm install hexo-deployer-git --save \
#RRS功能插件
&& cnpm install hexo-generator-feed --save \
#next主题本地搜索插件,查找资料很管用不用next主题的可以不用
&& cnpm install hexo-generator-searchdb --savea \
#安装next主题,如果不喜欢默认主题就选择自己喜欢的来安装
&& git clone https://github.com/theme-next/hexo-theme-next /hexo/themes/next \
#next 本地搜索
&& cnpm install hexo-generator-searchdb --save;

WORKDIR /hexo

EXPOSE 4000

ENTRYPOINT ["hexo","server"]

保存好构建文件Dockerfile,目录hexo下执行命令开始构建镜像:

sudo systemctl start docker.servic; # 启动docker
sudo docker build -t hexo:0.1 . ; # 本地构建自定义镜像hexo 0.1

suodo docker images;查看已经生成的镜像:

实例:1.1.2 收集迁机所需要的文件

统一的rsa文件能确保hexo发布问题.本地hexo目录下将本地rsa文件复制cp ~/.ssh ./ -r ;;如没有.ssh目录,就 ssh-keygen -t rsa -C "" ;一路回车就行,然后重复上面操作.hexo结果目录如下.

 现在要将容器中的`hexo`目录下的`source`和`themes`目录和`_config.yml`导出来到本地迁机目录`hexo`下. ```bash sudo docker run -it -v $PWD/tmp/:/tmp --name hexo hexo:0.1 /bin/bash ; cp -r /hexo/source/ /hexo/_config.yml /hexo/themes/ /tmp ; ```
实例:1.1.3 迁机测试;

说明下:这里的迁机是指将本地的.ssh目录,source目录,_config.yml文件,themes目录通过Dockerfilehexo的整个运行环境在容器给构建出来,然后再把我们的这个文章的源数据source,themes主题目录,用于推送的密钥.sshhexo配置文件_config.yml给挂载到容器对应的位置中去.然后在容器中启动hexo就行了.也就是说要迁机只要把这挂载的几个文件和目录以及这个Dockerfile给拿走就行了,其它的就不用管,它们会通过Dockerfile去生成就行了.真正实现了轻量级迁机.
启动一个新的容器并将hexo目录下的文件对应挂载到容器上,映射4000端口;sudo docker run -itd -v $PWD/source/:/hexo/source/ -v $PWD/_config.yml:/hexo/_config.yml -v $PWD/themes/:/hexo/themes -v $PWD/.ssh/:/root/.ssh/ --privileged=true --name hexo_debug -p 4000:4000 hexo:0.2 /bin/bash ;

而当我在其它的主机生成容器成功运行,并能正常浏览迁机前的文章,说明我的这个想法是可行的.
实例:1.1.4 迁机讨论和小结

回顾下整个流程,有点绕是第2步的收集迁机文件,有3个地方可能会困惑:1一个是:我们需要构建出hexo的容器,从容器里给复制到临时的挂载目录tmp,再从容器外面把文件给收集起来,那为什么不能直接从容器中导出来呢?答案是否定的!如果要从容器中原本的文件导出来,我目前也就发现这种方法而已.
另一个是:.ssh目录?这个很好解释,如果我们不使用统一的密钥,到时候迁机要推送数据的时候又要去生成一个密钥再加到代码仓库那边,很麻烦,所以就算进迁机文件中了.
最后一个是:themes主题目录?这个也很好解释为什么要加入到迁机目录中.如果我们使用别人的主题的话.这个主题文件是在构建容器的同时下载下来的.由于每个主题的都有着它们的配置文件,要配置才能使用,那就会出现每次迁机都要去主题配置一下,不如算进迁机文件中,这样就再也不用再次去配置了,而且也规避了一个版本风险,其实主题在迭代同时也可能会带来配置改变,同样的配置在新的主题版本不一定有用,导致hexo运行,无疑增加学习成本.不如选一个主题版本配置后,算进迁机上目录中.
说到版本迭代,这种轻量级迁机可能会存在一个版本迭代的风险,只是有可能^_^! hexo它有一个配置_config.yml文件算在迁机文件中的所以它是不变的.但每次在构建镜像时都是下载最新版本hexo,如有一天迁机文件_config.yml配置不能满足新版本的话,可能会导致hexo不能正常启动.这是个问题,如果你有解决的方法也可以告诉我下,但愿我不要遇到它.
当然你也可以把整个容器镜像也导出来,这样就不会出现这样的可能了.