1. 程式人生 > >龍芯Fedora21推出docker方案

龍芯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
 

1.png