使用docker制作hexo镜像
個(gè)人博客:戳我,戳我
背景
這段時(shí)間一直在折騰我的博客,由于之前出現(xiàn)過一次電腦硬盤完全掛掉的情況,為了避免重新搭建博客系統(tǒng),一直打算搞一個(gè)方便點(diǎn)的環(huán)境,能進(jìn)行多機(jī)遷移之類的。正好,Docker完全滿足我的要求。
之前一直只是聽說過Docker,聽說過容器,聽說過鏡像,但并沒有正真的了解接觸過Docker。這次借助于博客的折騰,正好有了這個(gè)研究折騰Docker的機(jī)會。
What is Docker?
正如Docker官網(wǎng)介紹的那樣:
Docker is the world’s leading software containerization platform.
關(guān)于了解Docker不是本文的重點(diǎn),這里可以推薦我之前收藏的關(guān)于Docker的幾個(gè)鏈接:
- Docker中文指南
- Docker鏡像創(chuàng)建
- Docker從入門到實(shí)戰(zhàn)
- Docker 4 – 總結(jié)
看完上面的內(nèi)容基本還是對Docker有了一個(gè)比較基礎(chǔ)的認(rèn)識,關(guān)于docker的安裝,docker命令的使用,docker的設(shè)計(jì)原理等。
構(gòu)建hexo鏡像
安裝Docker
這個(gè)地方我當(dāng)時(shí)剛接觸的時(shí)候沒有理清,以為docker是把我windows上的本地環(huán)境打包構(gòu)建成一個(gè)鏡像,相當(dāng)于克隆一個(gè)我在windows上的博客系統(tǒng),這個(gè)想法還是有點(diǎn)太天真了看來。后來了解了Docker的原理以及使用后,才理清了這些問題。
其實(shí)可以很簡單的理解,docker是一個(gè)軟件,運(yùn)行的是容器,容器里面是各種應(yīng)用,運(yùn)行一個(gè)容器需要一個(gè)鏡像,這個(gè)鏡像可以是一個(gè)基礎(chǔ)鏡像,也可以是一個(gè)你自己基于基礎(chǔ)鏡像構(gòu)建好的鏡像,鏡像的內(nèi)容可以粗略的理解為一個(gè)系統(tǒng),比如各種版本的Linux等。所以關(guān)于構(gòu)建hexo的鏡像,就是首先拉取一個(gè)基礎(chǔ)鏡像,比如我選擇了Ubuntu系統(tǒng),然后當(dāng)容器跑起來后,就相當(dāng)于一個(gè)虛擬機(jī)了,這個(gè)時(shí)候你可以安裝你的hexo環(huán)境,node環(huán)境,git環(huán)境等,最后可以把整個(gè)構(gòu)建好的環(huán)境整體打包生成一個(gè)最終的鏡像,這個(gè)鏡像就是最終需要的鏡像。
上面的理解,可能有偏差,因?yàn)橹皇俏易约旱睦斫?。好?#xff0c;廢話不多說,開始了!(我的linux機(jī)器是centos7)
# yum update && yum install docker-engine
啟動(dòng)docker:
# systemctl start docker
運(yùn)行測試:
# 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是用來構(gòu)建一個(gè)鏡像的命令的集合,docker可以根據(jù)里面的命令自動(dòng)化的構(gòu)建一個(gè)用戶所期望的鏡像。關(guān)于上面Dockerfile的內(nèi)容,我做一點(diǎn)簡單的解釋。
前面的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,我當(dāng)時(shí)好像是碰到了問題,就采用原來的npm方式了)。
WORKDIR /Hexo
指明工作路徑,啟動(dòng)容器后會自動(dòng)切換到這個(gè)目錄下。
#VOLUME ["/Hexo/source", "/Hexo/themes", "/root/.ssh"]
指定掛載目錄,宿主機(jī)的/Heo/source,/Hexo/themes ,/root/.ssh 被掛載到容器里的相應(yīng)位置,如果沒有該目錄,則創(chuàng)建該目錄,提供一種宿主機(jī)和容器的訪問策略。此處我前面加了#注釋掉了,因?yàn)閷?shí)際情況我不需要,可以在啟動(dòng)容器的命令中手工指定。
最后,
EXPOSE 4000
就是暴露端口4000,映射到宿主機(jī)的4000端口,提供另外一種宿主機(jī)和容器的訪問策略。
關(guān)于Dockerfile中這些命令的詳細(xì)解釋,可以參考下面的鏈接:
Docker鏡像創(chuàng)建
解釋一下,按照上面的Dockerfile構(gòu)建出來的鏡像,安裝了hexo的博客環(huán)境所依賴的工具或命令,包括git,node,npm,hexo本身,到此處,其實(shí)已經(jīng)搭建好了一個(gè)hexo環(huán)境,只不過這個(gè)環(huán)境在一個(gè)容器中,接下來正常的操作就是新建一個(gè)目錄作為hexo的博客根目錄,然后執(zhí)行‘hexo init . && npm install && …’,但是其實(shí)我不會這么做,后面解釋。
運(yùn)行docker,構(gòu)建鏡像
檢查docker是否在運(yùn)行:
# systemctl status docker
如果是"inactive",那么啟動(dòng)docker:
# systemctl start docker
依據(jù)Dockerfile構(gòu)建hexo鏡像:
#docker build -t hexo:v1 .
**注意:**此命令是必須在Dockerfile的目錄下執(zhí)行,hexo:v1可以自行命名,就是鏡像的名字,v1應(yīng)該類似于一個(gè)tag之類的東西。
如果正常的話,是會看到后面的輸出正好對應(yīng)著Dockerfile中的每條命令。構(gòu)建成功后大致會看到類似“successful build”之類的提示。查看鏡像:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hexo v1 522f7cfc7a31 8 seconds ago 405MB
關(guān)于405MB可能不準(zhǔn)確,因?yàn)楫?dāng)時(shí)的數(shù)據(jù)我現(xiàn)在不太記得,不過大致在這個(gè)量級,還是挺大的。
測試容器hexo
執(zhí)行命令:
# docker run -i -t 522f7cfc7a31 -p 4000:4000 /bin/bash
會啟動(dòng)容器,這個(gè)時(shí)候切換到容器里的系統(tǒng)的終端,如:
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容器啟動(dòng)正常,hexo環(huán)境安裝成功。
克隆hexo博客倉庫源碼,嘗試提交
這一步就是上面提到的在后面解釋的那一步。
上面說到,安裝好hexo的環(huán)境后,接下來就是執(zhí)行創(chuàng)建博客源碼的步驟,但是由于前一篇博文使用coding私有倉庫多終端編寫博客中已經(jīng)把博客源碼放到了coding的私有倉庫中,所以接下的步驟將會有些許不一樣的地方。
配置ssh
配置ssh,目的是為了通過ssh通道克隆我的博客倉庫源碼,免去http方式的用戶名密碼驗(yàn)證。配置方式可以參照我之前的博文我的個(gè)人博客搭建記錄中"配置SSH"一節(jié)。這里我把所有命令一起寫下來:
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
實(shí)際情況實(shí)際替換。然后在coding上添加上面產(chǎn)生的密匙。
克隆博客源碼
執(zhí)行命令:
root@abfc3a0ec1f0:~# git clone <server>
這一步完成后我們就把整個(gè)博客的源碼克隆下來了,參照前一篇博文使用coding私有倉庫多終端同步編寫博客中"在另外的PC上"一節(jié),只需要在博客目錄下執(zhí)行命令:
npm install
接下來就可以編寫博客了:
hexo d -g
到這里其實(shí)完成了博客的所有依賴,也即此刻就不用再配置博客的系統(tǒng)了,接下來就是如何把這個(gè)容器保存下來的問題
構(gòu)建最終hexo鏡像
簡要闡述下上面的過程,首先依賴ubuntu的基礎(chǔ)鏡像安裝好了hexo的環(huán)境,導(dǎo)出了一個(gè)hexo的第一個(gè)版本v1鏡像,此時(shí)還沒有博客源碼,然后運(yùn)行容器,在容器里邊操作,配置ssh,克隆博客,完成后,就是再次生成鏡像。
執(zhí)行命令:
root@abfc3a0ec1f0:~# exit
記住容器的id abfc3a0ec1f0,然后執(zhí)行命令:
# docker commit -m "finally hexo" -a "Author" abfc3a0ec1f0 hexo:v2
完成后執(zhí)行docker images后會看到現(xiàn)在構(gòu)建好的鏡像hexo:v2版本。這個(gè)版本就是我們最終需要的鏡像。
# docker save -o hexo_finally.tar hexo:v2
上面把鏡像導(dǎo)出到本地。
到此處,已經(jīng)完成了這篇博客的目的,構(gòu)建了一個(gè)hexo的docker鏡像,這個(gè)鏡像可以運(yùn)行在任何安裝了docker的機(jī)器上,達(dá)到了之前我預(yù)期的多終端同步編寫博客的目的。也不再害怕那天我的電腦硬盤又悲劇了,當(dāng)然這個(gè)hexo_finally.tar是要備份的,不然說啥也沒用。
但是,為了測試下這個(gè)鏡像有沒有正確,接下來我做點(diǎn)測試。
驗(yàn)證hexo鏡像
首先執(zhí)行命令刪除所有鏡像:
# docker rmi $(docker images -q)
然后裝載鏡像:
# docker load < hexo_finally.tar
執(zhí)行docker images即可查看到裝載進(jìn)來的鏡像。然后運(yùn)行容器:
# docker run -i -t <id> /bin/bash
然后(blog是我自己的博客根目錄):
cd blog
嘗試執(zhí)行:
git pull origin master && hexo d -g
這一步多半兇多吉少,我在此處浪費(fèi)了很多時(shí)間。我發(fā)現(xiàn)每次運(yùn)行容器后root用戶下的.ssh文件夾會不見了,這個(gè)文件下可是我之前生成的密匙所在地啊。反復(fù)試了好多次,發(fā)現(xiàn)都一樣,只要重新運(yùn)行,.ssh文件夾就會消失。后來我采取了一個(gè)折中的辦法,把id_rsa和id_rsa.pub兩個(gè)文件復(fù)制到root的$HOME下,然后在重新生成鏡像導(dǎo)出,下次再運(yùn)行容器的時(shí)候重新把這兩個(gè)文件復(fù)制到.ssh文件夾下可以解決此問題
END
好了,到此處,基本完成了hexo的鏡像制作,只要備份了這個(gè)hexo_finally.tar包,就可以不懼怕任何宕機(jī)問題了,歐耶。其實(shí)我如果寫好博客后,是不需要執(zhí)行hexo d -g命令的,由于我后來采用了daocloud自動(dòng)集成,所以只需要把博客源碼提交到coding就可以了,然后daocloud會自動(dòng)集成構(gòu)建。(關(guān)于這種采用daocloud自動(dòng)集成的方式,我后面的博文會記錄到,這里先占個(gè)坑,寫好了重新更新到這里。點(diǎn)我)
總體過程還是有點(diǎn)復(fù)雜的,我由于是回憶的狀態(tài)寫,可能會有疏漏,如果碰到問題,你可以聯(lián)系我或者自己探索解決??傊?#xff0c;首先要了解docker,然后學(xué)會使用docker,然后做起這些來就比較輕松多了。
至于docker嘛,使用感覺并沒有想象中那么如絲般柔滑,加載一個(gè)鏡像,運(yùn)行一個(gè)容器還是挺慢的。恩,對的。
Blog:
-
rebootcat.com
-
email: linuxcode2niki@gmail.com
2016-12-20 于杭州
By 史矛革
總結(jié)
以上是生活随笔為你收集整理的使用docker制作hexo镜像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hessiancpp编译和使用(C++版
- 下一篇: 微信跳一跳高分辅助踩坑