龍芯Fedora21推出docker方案
http://www.loongson.cn/news/company/495.html
IT界的技術發展更新速度不斷加快,5年前的hadoop,3年前的openStack,現在的docker。龍芯平臺以支援docker作為建設伺服器軟體生態的核心工作。
龍芯在3A2000、Fedora21上完成了docker 1.6的移植和驗證。可供雲端計算、大資料廠商推出相應龍芯解決方案產品時選用。
一、簡介
什麼是docker?其實docker就是一種虛擬化技術,它是一個開源的應用容器引擎,開發者可以將某個應用以及應用執行時依賴庫製作成映象,分發到其他機器上執行。如圖1,相比虛擬機器(VM)技術而言,docker共享hostOS,少了guestOS對記憶體和CPU等資源的開銷,因此docker效率更高,更加的輕量級化。
圖1. VM與docker的架構比較
docker形式為:build(製作映象)、ship(倉庫遷移)、run(執行應用)。而這三種形式由映象、倉庫、容器承載實現。
IMAGES(映象):docker映象由多個只讀層合併而成。除了最下層外,每個層都有一個指標指向相鄰的下層。其中每一層由id、元資料、指向相鄰下層的指標組成。
CONTAINER(容器):容器是映象執行的一個例項。一個容器包含code、runtime、system tools、system binaries等一切執行所需的依賴。相比映象,它多了一層讀寫層。
映象和容器可描述為圖2所示
圖2.docker映象和容器
REPOSITORY(倉庫):存放映象的地方,分為公有倉庫和私有倉庫。公有倉庫由git Hub提供。倉庫伺服器上存放多個倉庫,每個倉庫又包含多個映象,由不同的映象tag區分,每個tag下包含多個不同的容器。倉庫描述見圖3
圖3.docker註冊伺服器上的倉庫
二、移植環境
docker1.6對平臺軟體的要求:
系統必須是64位 (執行file /bin/ls命令檢視系統位數)
iptables>1.4 (執行iptables -v檢視設定防火牆工具的版本)
golang>=1.4.2(執行go version命令檢視go語言版本)
核心版本必須大於3.10 (執行uname -r檢視核心版本)
本次移植的環境為龍芯3A2000,作業系統為fedora21-1030版本,kernel 3.10.84,go 1.7,iptables1.4.21。
三、docker的安裝、啟動
在fedora21-1030上安裝、啟動docker,只需執行下述命令:
# yum install docker ;安裝docker,需要機器連線網路 #docker version ; 驗證docker安裝是否正常 # systemctl start docker ;啟動docker的服務 # docker -d ;啟動docker的守護程序 |
四、基本映象的製作
安裝docker後基本命令是可以執行的,但pull官方映象是無法在mips64el上執行的,這是因為官方的映象全部是x86-64架構。要想在龍芯平臺上使用docker,需要我們自己建立mips64el版本的基礎映象。
官方文件沒有提供mips64el版本的基礎映象製作方法,筆者通過長時間摸索出下面的正確方法。建立基礎映象是執行下面的命令:
# tar --exclude=/usr/lib32 -cPvf fedora21-base.tar /home 將本機執行的作業系統打成一個fedora21-base.tar包,其中--exclude引數是將不需要的目錄排除,可以使用--exclude多個引數排除多個目錄。 # cat fedora21-base.tar | docker import - fedora21-base 將tar包使用docker import編譯匯入映象 # docker run -i -t fedora21-base /bin/bash 啟動映象。-i 代表開啟標準輸入 -t 虛擬一個視窗 /bin/bash啟動映象執行的命令。 |
Docker正常啟動容器的輸出如下圖:
圖4.啟動docker基本映象
五、製作定製應用映象
實際應用中,往往將一個應用程式單獨封裝成一個映象,以便於釋出應用。官方提供了一個示範的hello-world映象,通過剖析這個映象可以掌握定製應用映象的製作方法。
官方的hello-world映象總共910B,可謂麻雀雖小,五臟俱全。包含Dockerfile,Makefile,hello,hello.asm四個檔案。
[Dockerfile] FROM scratch #FROM指定build基於哪個映象,scratch是一個空映象,用於創 建極小映象 ADD hello / #ADD是將指定的檔案新增到指定目錄 CMD ["/hello"] #CMD是不帶命令引數時啟動映象執行的命令 |
[Makefile] hello: hello.asm #Makefile 語法"target:dependcy1 dependcy2 nasm -o [email protected] $< #[email protected]目標檔案target$<--第一個依賴檔案depency chmod +x hello .PHONY: clean #使用PHONY目標,避免同名檔案相沖突,不會檢查檔案存在與否,都要執行清除操作 clean: -rm -vf hello |
剩下的hello.asm是intel x86寫的彙編原始碼,hello檔案是最終make編譯出來的可執行檔案。
執行docker run hello-world的流程見下圖:
圖5.啟動hello-world映象的流程
注:
1.向docker的守護程序發起一個啟動hello-world映象請求
2.守護程序訪問宿主作業系統,請求建立容器
3.建立一個空的容器
4.作業系統訪問本地倉庫伺服器
5.訪問本地倉庫伺服器,若hello-world映象已經在本地倉庫伺服器,則將映象放入空容器裡執行
5.1. 若本地伺服器上沒有此映象,訪問遠端官方伺服器
5.2 .若官方伺服器有此映象,下載到本地伺服器,再將其放在空容器裡執行。若無,則列印錯誤資訊
編寫我們自己的hello-world,需修改的檔案如下:
[hello.c] #include<stdio.h> int main() { char * string="Hello from Loongson docker"; printf("%s\n",string); return 0; } |
[Dockerfile] FROM fedora21-base ADD hello / CMD ["/hello"] |
[Makefile] hello:hello.c gcc hello.c -o hello .PHONY : clean clean: rm -f *.o |
執行如下命令,製作龍芯平臺的映象
# make ;編譯出可執行檔案 # docker build -t fc21/hello-world . ;編譯生成fc21/hello-world的映象 # docker images ;顯示檢視是否有fc21/hello-world映象 # docker run fc21/hello-world ;啟動hello-world映象 |
最後,在終端就會見到如下圖的訊息輸出
圖6.啟動hello-world映象的輸出結果
六、總結
本文驗證了docker在龍芯平臺上的移植和執行過程。證明docker能夠做為大資料、雲端計算的原型平臺。
對於其它更深入的技術話題,包括registry映象製作和搭建,有興趣的朋友可以登入龍芯社群(http://www.loongnix.org)進行更深入的了、學習。
參考資料:
[1]http://www.docker.com/
[2]https://github.com/docker/docker/
[3]http://blog.csdn.net/x931100537/article/details/49633107
[4]http://www.csdn.net/article/2014-10-28/2822323
[5]http://blog.csdn.net/cbl709/article/details/43955687
[6]http://blog.csdn.net/hazir/article/details/45111161
[7]https://my.oschina.net/2xixi/blog/516951
[8]https://my.oschina.net/feedao/blog/222699
[9]http://blog.csdn.net/s1070/article/details/52459963