使用docker制作hexo镜像
个人博客:戳我,戳我
背景
这段时间一直在折腾我的博客,由于之前出现过一次电脑硬盘完全挂掉的情况,为了避免重新搭建博客系统,一直打算搞一个方便点的环境,能进行多机迁移之类的。正好,Docker完全满足我的要求。
之前一直只是听说过Docker,听说过容器,听说过镜像,但并没有正真的了解接触过Docker。这次借助于博客的折腾,正好有了这个研究折腾Docker的机会。
What is Docker?
正如Docker官网介绍的那样:
Docker is the world’s leading software containerization platform.
关于了解Docker不是本文的重点,这里可以推荐我之前收藏的关于Docker的几个链接:
- Docker中文指南
- Docker镜像创建
- Docker从入门到实战
- Docker 4 – 总结
看完上面的内容基本还是对Docker有了一个比较基础的认识,关于docker的安装,docker命令的使用,docker的设计原理等。
构建hexo镜像
安装Docker
这个地方我当时刚接触的时候没有理清,以为docker是把我windows上的本地环境打包构建成一个镜像,相当于克隆一个我在windows上的博客系统,这个想法还是有点太天真了看来。后来了解了Docker的原理以及使用后,才理清了这些问题。
其实可以很简单的理解,docker是一个软件,运行的是容器,容器里面是各种应用,运行一个容器需要一个镜像,这个镜像可以是一个基础镜像,也可以是一个你自己基于基础镜像构建好的镜像,镜像的内容可以粗略的理解为一个系统,比如各种版本的Linux等。所以关于构建hexo的镜像,就是首先拉取一个基础镜像,比如我选择了Ubuntu系统,然后当容器跑起来后,就相当于一个虚拟机了,这个时候你可以安装你的hexo环境,node环境,git环境等,最后可以把整个构建好的环境整体打包生成一个最终的镜像,这个镜像就是最终需要的镜像。
上面的理解,可能有偏差,因为只是我自己的理解。好了,废话不多说,开始了!(我的linux机器是centos7)
# yum update && yum install docker-engine
启动docker:
# systemctl start docker
运行测试:
# docker run --rm hello-world
Unable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-worldc04b14da8d14: Pull completeDigest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9Status: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker Hub account:https://hub.docker.comFor more examples and ideas, visit:https://docs.docker.com/engine/userguide/
Dockerfile
FROM ubuntu:14.04MAINTAINER nick,<linuxcode2niki@gmail.com>RUN \cp /etc/apt/sources.list /etc/apt/sources.list.bak && \echo "deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse" > /etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse " >> /etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse " >> /etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse " >> /etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse " >> /etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse " >> /etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse " >> /etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse " >> /etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse " >> /etc/apt/sources.list && \apt-get update && \apt-get install -y git && \apt-get install -y nodejs npm && \apt-get clean && \rm -rf /var/lib/apt/lists/* && \ln -s /usr/bin/nodejs /usr/bin/node && \alias cnpm="npm --registry=https://registry.npm.taobao.org --cache=$HOME/.npm/.cache/cnpm --disturl=https://npm.taobao.org/dist \--userconfig=$HOME/.cnpmrc" && \npm install hexo-cli -gWORKDIR /Hexo
#VOLUME ["/Hexo/source", "/Hexo/themes", "/root/.ssh"]
EXPOSE 4000
CMD ['/bin/bash']
Dockerfile是用来构建一个镜像的命令的集合,docker可以根据里面的命令自动化的构建一个用户所期望的镜像。关于上面Dockerfile的内容,我做一点简单的解释。
前面的echo命令是更换ubuntu的apt-get源为阿里云的源,加快访问下载速度。然后安装git,nodejs,npm,然后更换淘宝的cnmp:
alias cnpm="npm --registry=https://registry.npm.taobao.org --cache=$HOME/.npm/.cache/cnpm --disturl=https://npm.taobao.org/dist \--userconfig=$HOME/.cnpmrc"
后面就是安装hexo(注意此处的命令可以更换成cnmp install hexo-cli -g,我当时好像是碰到了问题,就采用原来的npm方式了)。
WORKDIR /Hexo
指明工作路径,启动容器后会自动切换到这个目录下。
#VOLUME ["/Hexo/source", "/Hexo/themes", "/root/.ssh"]
指定挂载目录,宿主机的/Heo/source,/Hexo/themes ,/root/.ssh 被挂载到容器里的相应位置,如果没有该目录,则创建该目录,提供一种宿主机和容器的访问策略。此处我前面加了#注释掉了,因为实际情况我不需要,可以在启动容器的命令中手工指定。
最后,
EXPOSE 4000
就是暴露端口4000,映射到宿主机的4000端口,提供另外一种宿主机和容器的访问策略。
关于Dockerfile中这些命令的详细解释,可以参考下面的链接:
Docker镜像创建
解释一下,按照上面的Dockerfile构建出来的镜像,安装了hexo的博客环境所依赖的工具或命令,包括git,node,npm,hexo本身,到此处,其实已经搭建好了一个hexo环境,只不过这个环境在一个容器中,接下来正常的操作就是新建一个目录作为hexo的博客根目录,然后执行‘hexo init . && npm install && …’,但是其实我不会这么做,后面解释。
运行docker,构建镜像
检查docker是否在运行:
# systemctl status docker
如果是"inactive",那么启动docker:
# systemctl start docker
依据Dockerfile构建hexo镜像:
#docker build -t hexo:v1 .
**注意:**此命令是必须在Dockerfile的目录下执行,hexo:v1可以自行命名,就是镜像的名字,v1应该类似于一个tag之类的东西。
如果正常的话,是会看到后面的输出正好对应着Dockerfile中的每条命令。构建成功后大致会看到类似“successful build”之类的提示。查看镜像:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hexo v1 522f7cfc7a31 8 seconds ago 405MB
关于405MB可能不准确,因为当时的数据我现在不太记得,不过大致在这个量级,还是挺大的。
测试容器hexo
执行命令:
# docker run -i -t 522f7cfc7a31 -p 4000:4000 /bin/bash
会启动容器,这个时候切换到容器里的系统的终端,如:
root@abfc3a0ec1f0:/Hexo#
紧接着敲入命令:
root@abfc3a0ec1f0:~# hexo -v
hexo-cli: 1.0.2
os: Linux 3.10.0-327.36.3.el7.x86_64 linux x64
http_parser: 2.5.2
node: 4.4.5
v8: 4.5.103.35
uv: 1.8.0
zlib: 1.2.8
ares: 1.10.1-DEV
icu: 56.1
modules: 46
openssl: 1.0.2h
证明hexo容器启动正常,hexo环境安装成功。
克隆hexo博客仓库源码,尝试提交
这一步就是上面提到的在后面解释的那一步。
上面说到,安装好hexo的环境后,接下来就是执行创建博客源码的步骤,但是由于前一篇博文使用coding私有仓库多终端编写博客中已经把博客源码放到了coding的私有仓库中,所以接下的步骤将会有些许不一样的地方。
配置ssh
配置ssh,目的是为了通过ssh通道克隆我的博客仓库源码,免去http方式的用户名密码验证。配置方式可以参照我之前的博文我的个人博客搭建记录中"配置SSH"一节。这里我把所有命令一起写下来:
root@abfc3a0ec1f0:~# cd ~/.ssl && ls -al ./*
root@abfc3a0ec1f0:~# rm -rf ./*
root@abfc3a0ec1f0:~# git config --global user.name "yourname" && git config --global user.email "youremail" && ssh-keygen -t rsa -C "yourmail@gmail.com" && cat ~/.ssh/id_rsa.pub
实际情况实际替换。然后在coding上添加上面产生的密匙。
克隆博客源码
执行命令:
root@abfc3a0ec1f0:~# git clone <server>
这一步完成后我们就把整个博客的源码克隆下来了,参照前一篇博文使用coding私有仓库多终端同步编写博客中"在另外的PC上"一节,只需要在博客目录下执行命令:
npm install
接下来就可以编写博客了:
hexo d -g
到这里其实完成了博客的所有依赖,也即此刻就不用再配置博客的系统了,接下来就是如何把这个容器保存下来的问题
构建最终hexo镜像
简要阐述下上面的过程,首先依赖ubuntu的基础镜像安装好了hexo的环境,导出了一个hexo的第一个版本v1镜像,此时还没有博客源码,然后运行容器,在容器里边操作,配置ssh,克隆博客,完成后,就是再次生成镜像。
执行命令:
root@abfc3a0ec1f0:~# exit
记住容器的id abfc3a0ec1f0,然后执行命令:
# docker commit -m "finally hexo" -a "Author" abfc3a0ec1f0 hexo:v2
完成后执行docker images后会看到现在构建好的镜像hexo:v2版本。这个版本就是我们最终需要的镜像。
# docker save -o hexo_finally.tar hexo:v2
上面把镜像导出到本地。
到此处,已经完成了这篇博客的目的,构建了一个hexo的docker镜像,这个镜像可以运行在任何安装了docker的机器上,达到了之前我预期的多终端同步编写博客的目的。也不再害怕那天我的电脑硬盘又悲剧了,当然这个hexo_finally.tar是要备份的,不然说啥也没用。
但是,为了测试下这个镜像有没有正确,接下来我做点测试。
验证hexo镜像
首先执行命令删除所有镜像:
# docker rmi $(docker images -q)
然后装载镜像:
# docker load < hexo_finally.tar
执行docker images即可查看到装载进来的镜像。然后运行容器:
# docker run -i -t <id> /bin/bash
然后(blog是我自己的博客根目录):
cd blog
尝试执行:
git pull origin master && hexo d -g
这一步多半凶多吉少,我在此处浪费了很多时间。我发现每次运行容器后root用户下的.ssh文件夹会不见了,这个文件下可是我之前生成的密匙所在地啊。反复试了好多次,发现都一样,只要重新运行,.ssh文件夹就会消失。后来我采取了一个折中的办法,把id_rsa和id_rsa.pub两个文件复制到root的$HOME下,然后在重新生成镜像导出,下次再运行容器的时候重新把这两个文件复制到.ssh文件夹下可以解决此问题
END
好了,到此处,基本完成了hexo的镜像制作,只要备份了这个hexo_finally.tar包,就可以不惧怕任何宕机问题了,欧耶。其实我如果写好博客后,是不需要执行hexo d -g命令的,由于我后来采用了daocloud自动集成,所以只需要把博客源码提交到coding就可以了,然后daocloud会自动集成构建。(关于这种采用daocloud自动集成的方式,我后面的博文会记录到,这里先占个坑,写好了重新更新到这里。点我)
总体过程还是有点复杂的,我由于是回忆的状态写,可能会有疏漏,如果碰到问题,你可以联系我或者自己探索解决。总之,首先要了解docker,然后学会使用docker,然后做起这些来就比较轻松多了。
至于docker嘛,使用感觉并没有想象中那么如丝般柔滑,加载一个镜像,运行一个容器还是挺慢的。恩,对的。
Blog:
rebootcat.com
email: linuxcode2niki@gmail.com
2016-12-20 于杭州
By 史矛革
相关文章:
3D目标检测深度学习方法数据预处理综述
作者 | 蒋天元来源 | 3D视觉工坊(ID: QYong_2014)这一篇的内容主要要讲一点在深度学习的3D目标检测网络中,我们都采用了哪些数据预处理的方法,主要讲两个方面的知识,第一个是representation,第二个数据预处…

NTLM协议认证
第一篇blog,发现这是个记录学习过程的好地方。从基础的开始吧。 NTLM: 基本知识telnet的一种验证身份方式,即Windows NT LAN Manager (NTLM); NTLM 是为没有加入到域中的计算机(如独立服务器和工作组)提供的…

新盒模型移动端的排版
这里采用的是新盒模型来进行排版: <div class"mytest"> <header></header> <section></section> <footer></footer> </div> 在CSS样式里添加如下样式 html,body{ height: 100%; } .mytest{ …

微信跳一跳高分辅助踩坑
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/01/08/wechat_jump_hack/ 最近挺火的微信跳一跳 最近新版微信的『跳一跳』小程序着实火了一把,也把小程序这个概念再次推波助澜了一波,看来以后小程序这个入口会有大作为。 张小…
“编程能力差,90%的人会输在这点上!”谷歌开发:其实都是在瞎努力
这是一个很难让人心平气和的年代。疫情之下,很多人的都在面临着:失业、降薪、找不到工作、随时被裁等风险。但是:有心的人早已上路超车,做个人能力的升级——提高自己的不可替代性。李开复曾提出过“五秒钟准则”:一项…

64位win7安装IIS7时不能浏览asp的问题
64位win7高级家庭版安装IIS7,安装完成后只能浏览静态页,找了很多的教程都没有解决,最后在一个博客里看到说64位系统下ASP是不支持的ODB读取ACC的数据库的,因此需要开启32位应用程序的支持。 方法是: Internet 信息服务…

0525 项目回顾7.0
一、sprint总结 当谈到团队,我开始真的不知道团队是怎么样的,怎么样进行工作的,要该怎么出力团队的关系,有时候会涉及到个人问题,是不是该考虑进来,但是很多时候是不能的,每一个人作为团队的一份…

辩证看待 iostat
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/01/16/using-iostat-dialectically/ 前言 经常做系统分析会接触到很多有用的工具,比如 iostat,它是用来分析磁盘性能、系统 I/O 的利器。 本文将重点介绍 iostat 命令的使用,并…
搞机器学习,Python和R哪个更合适?
【编者按】如果你正想构建一个机器学习项目,但却纠结于如何选择编程语言,这篇文章将是你所需要的。这篇文章不仅帮助你理解Python和R这两种语言的区别,还有助于你了解各个语言多方面的优势。作者 | Manav Jain译者 | Joe,编辑 | 夕…

Java安装方法
第1章 Java简介及开发环境搭建 实验1 JDK的下载、安装与配置 【实验目的】 (1)熟悉JDK工具包的下载及安装过程。 (2)掌握JAVA_HOME、CLASSPATH及Path的设置内容。 (3)掌握Java程序运行原理及Javac、Java命…

Hash函数的安全性
我们为了保证消息的完整性,引进了散列函数,那么散列函数会对安全正造成什么影响呢?这是需要好好研究一番的问题。 三个概念: 1.如果y<>x,且h(x)h(y),则…

一键安装python3环境
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/04/15/python3_in_a_box/ 一键安装python3环境 由于现在逐步转移到 python3 进行开发,但是很多机器并没有预装 python3 环境,所以需要安装。 所以分享一个我常用的,…
认知智能再突破,阿里 18 篇论文入选 AI 顶会 KDD
作者 | 马超责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)近日,国际知识发现与数据挖掘协会KDD在官网(https://www.kdd.org/kdd2020)公布其2020年度的论文收录结果,笔者看到阿里共有18篇论文入选&…

python采集cpu信息
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/05/20/analyze_cpu/ python脚本采集cpu 经常要做一些 linux 系统上的性能分析或者采集 cpu/mem/bandwidth 上报到监控系统。 分享一个我平常常用到的 cpu 采集脚本,原理是分析 /proc/stat…

Pretty Login便携版:Windows 7登录界面修改器
Pretty Login是由chnable开发的一个美化小工具,用来辅助修改Widnows 7登陆界面的背景图片,除此之外,它也能定制欢迎界面上的文本、按钮样式,如设置阴影、半透明效果。 由于Windows 7限制登录背景图片的大小不超过255KB,…
来了来了!趋势预测算法大PK!
作者 | 王哲责编 | Carol头图 | CSDN 付费下载自视觉中国趋势预测在很多应用场景中都会起到至关重要的作用,比如淘宝商家会考虑库存量应该保持在多少才能够满足客户需求,商场希望得知假期会迎来多大的客流量以安排系列活动,机场想要预测五一黄…

hdu 5713(状态压缩DP)
要进行两次dp, 第一个,dp[i],1<i<(1<<n) 其中用i的二进制形式表示已选择的点。 dp[i] 用来保存i中的点构成一个连通块,边集多少种可能。 转移方程: save[0] 1;//这里用save[i]表示dp[i]for(int i1;i<(1<<n)…

nginx特定的 404页面利于seo
要求:访问http://www.qq.com/123 url保持不变 显示的结果为指定的404页面curl -I http://www.qq.com/123 返回的状态码为404 准备一 404.php页面在最底部加上:<?phpheader(HTTP/1.1 404 Not Found);header(Status: 404 Not Found);?>然后ngin…

python采集bandwidth信息
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/05/21/analyze_bandwidth/ python脚本采集bandwidth 经常要做一些 linux 系统上的性能分析或者采集 cpu/mem/bandwidth 上报到监控系统。 分享一个我平常常用到的 bandwidth 采集脚本,原理…
零基础搭建个性化精准营销 AI 应用,这次手把手教你!
百万学AI系列AI 应用开发大师课已经直播两期了,在前两期的内容中,大家在入门级任务《猫狗分类器》中上手 TensorFlow 开发,通过离线 SDK 在 Android 手机中完成人脸识别应用的部署。在这两个任务中,能成功安装开发环境,…

C++数据类型简析
C语言的基本数据类型有如下四种: 整型,说明符为int;字符型,说明符为char;浮点型(又称实型),说明符为float(单精度),double(双精度&…
浅谈几种区块链网络攻击以及防御方案之51#37攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/11/network_attack_of_blockchain_51_attack/ 写在前面的话 自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之初的…
全球Python调查报告:Python 2正在消亡,PyCharm比VS Code更受欢迎
作者 | 唐小引题图 | 自东方 IC出品 | AI科技大本营(ID:rgznai100)一年一度的 Python 开发者调查报告终于发布了。该报告由 Python 软件基金会和 JetBrains 联合发起,已经持续三年,并且参与调查的开发者人数正在逐年上…

中兴V880使用手记之五——刷入recovery
Recovery是安卓系统的一个特殊工作模式,也就是一个刷机的工程界面,给安卓手机刷入Recovery相当于给系统安装了一个dos界面,可以在未开机的状态下,实现系统更新、还原出厂设置、清除手机缓存等。通过一些第三方工具,可以…

windows 系统常用操作
1、所有端口使用情况 netstat -ano 2、查询xxxx端口pid netstat -aon|findstr "xxxx" 3、根据端口Pid查详情 tasklist|findstr "pkd" 4、根据进程pid kill 进程 taskkill /pid pid -f 转载于:https://www.cnblogs.com/vitre/p/5549344.html
浅谈几种区块链网络攻击以及防御方案之日蚀攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/12/network_attack_of_blockchain_eclipse_attack/ 写在前面的话 自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之…
微服务的理想与现实
来源 | 京东智联云开发者随着云原生微服务的日益火热,很多人都开始对微服务的相关知识内容感兴趣。本篇内容,旨在扫盲(意思是小白可入),希望能对大家有帮助。如有问题,欢迎大家一起讨论,共同学习…

感恩心成就了车建新和红星美凯龙
前几天参加了红星美凯龙成立25周年庆典活动,庆典活动非常的隆重,庆典之前红地毯上星光熠熠,红星美凯龙掌舵人车建新等多位高管、品牌代言人大小S、刘谦、古巨基、萧亚轩、胡一虎等演艺群星、马未都、马艳丽、包小柏、王潮歌、殷智贤等不同领域…

第二阶段团队项目冲刺站立会议(九)
昨天做了什么: 已经简单实现我的后续显示问题。 今天准备做什么: 美观上的东西来不及做了估计,我要整合到项目的实现上去。 遇到的问题: 项目问题大体上和竞赛一致,但也有不一样的地方。转载于:https://www.cnblogs.co…
浅谈几种区块链网络攻击以及防御方案之女巫攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/13/network_attack_of_blockchain_sybil_attack/ 写在前面的话 自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之初…