使用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自動集成的方式,我后面的博文會記錄到,這里先占個坑,寫好了重新更新到這里。點我)
總體過程還是有點復雜的,我由于是回憶的狀態寫,可能會有疏漏,如果碰到問題,你可以聯系我或者自己探索解決??傊?#xff0c;首先要了解docker,然后學會使用docker,然后做起這些來就比較輕松多了。
至于docker嘛,使用感覺并沒有想象中那么如絲般柔滑,加載一個鏡像,運行一個容器還是挺慢的。恩,對的。
Blog:
-
rebootcat.com
-
email: linuxcode2niki@gmail.com
2016-12-20 于杭州
By 史矛革
總結
以上是生活随笔為你收集整理的使用docker制作hexo镜像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hessiancpp编译和使用(C++版
- 下一篇: 微信跳一跳高分辅助踩坑