1. 程式人生 > >龍芯平臺搭建容器管理工具dockerUI,並解決dockerUI啟動容器的bug

龍芯平臺搭建容器管理工具dockerUI,並解決dockerUI啟動容器的bug

http://ask.loongnix.org/?/article/84

 

整體制作過程:
 

dui.png



dockerUI是基於本地容器的部署
第一步:要製作出龍芯fedora21-base映象
第二步:下載ui-for-docker的官方映象,因為ui-for-docker官方映象是在x86下正常執行的,所有提取跟平臺無關的檔案,例如:js、css、html等檔案。
第三步:從github上下載dockerUI的原始碼檔案,編譯龍芯平臺支援的二進位制檔案,通過分析原始碼中的gruntFile.js,只需要編譯api
第四步:把第三步提取跟平臺無關的檔案(js、css、html),和第四步編譯好的龍芯平臺支援的二進位制檔案(api),傳輸到fedora21-base映象建立的容器內,並執行ui-for-docker檔案


第五步:在瀏覽器位址列中輸入:localhost:9000


dockerUI是基於本地容器的部署,所以首先要製作龍芯fedora21-base映象


    建立基礎映象fedora21-base,可以參考: http://ask.loongnix.org/?/article/81 ” 

  • 驗證feodra21-base映象是否建立成功,程式碼如下:
# docker images   REPOSITORY       TAG        IMAGE ID        CREATED         SIZE   fedora21-base    latest     099b24f7ff5a    33 hours ago    206.9 MB
  • 建立docker容器
  •     建立好feodra21-base映象,就可以建立容器了,程式碼如下:
# docker run -i -t fedora21-base /bin/bash[[email protected] /]#

到這裡feodra21-base的映象製作好了,並且建立好容器6253a4c3f078和進入到容器6253a4c3f078裡了, 這個視窗不要關閉,重新開啟另一個終端,在容器外面進行製作dockerUI映象2.製作龍芯支援的dockerUI映象

  • dockerUI官方映象是在x86上正常執行的映象,所以要測試在龍芯平臺上是否正常執行
  • 下下載官方映象,並檢視映象
[b] # docker pull uifd/ui-for-docker # docker images     REPOSITORY TAG IMAGE ID CREATED SIZE     docker.io/uifd/ui-for-docker latest 965940f98fa5 12 months ago 8.096 MB [/b]
  • 測試dockerUI官方映象在龍芯平臺上是否可用
  # docker run -i -t docker.io/uifd/ui-for-docker:latest /bin/bash       panic: standard_init_linux.go:175: exec user process caused "exec  format    error" [recovered]	   panic: standard_init_linux.go:175: exec user process caused "exec format error"       goroutine 1 [running, locked to thread]:       panic(0x1203d0060, 0xc42014e0e0)	    /usr/lib/golang/src/runtime/panic.go:500 +0x4c4       github.com/urfave/cli.HandleAction.func1(0xc4201072d0)[b]提示“exex  format  error”錯誤,容器不能正常執行,可見dockerUI官方映象在龍芯平臺上是不可用的[/b]
  • 雖然容器不能正常執行,但是docker.io/uifd/ui-for-docker映象能夠成功建立容器,檢視容器
 # docker ps -a    CONTAINER ID   IMAGE COMMAND   CREATED  STATUS  PORTS  NAMES    433b60b7cbd2   docker.io/uifd/ui-for-docker:latest   "/ui-for-docker /bin/"     3 minutes ago    Exited (2) 3 minutes ago   grave_lovelace
  • 檢視報錯的原因,是因為包含了x86的二進位制
    # file ui-for-dockerui-for-docker: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
  • 因為要提取docker.io/uifd/ui-for-docker映象裡跟平臺無關的檔案(js、css、html)等檔案,所以把docker.io/uifd/ui-for-docker映象建立的容器433b60b7cbd2匯出1.tar,並把1.tar解壓到dockerui資料夾裡
    # docker export 433b60b7cbd2 >1.tar
  • 把1.tar解壓 
     # tar xf 1.tar # ls     angular.js data dev etc fonts ico images img index.html     proc run sys ui-for-docker uifordocker.css uifordocker.js var     vendor.css vendor.js 

3.編譯龍芯平臺支援的二進位制檔案,通過分析原始碼中的gruntFile.js,只需要編譯api

  • 先下載dockerUI的原始碼, https://github.com/kevana/ui-for-docker

            

  [[email protected] 20170926-dockerui]# git clone https://github.com/kevana/ui-for-docker
  • 進入到原始碼中api目錄下:

             

 # cd /ui-for-docker/api 
  • DockerUI使用grunt作為編譯工具。但是在龍芯上不需要編譯原始碼,只需要編譯api下go語言原始碼,通過分析gruntFile.js,找出用於編譯api的編譯命令,具體命令如下:

           

  # export GOPATH=/usr/share/gocode  # go get github.com/gorilla/csrf  # go get github.com/gorilla/securecookie  # go build 
  • 到這裡就把龍芯平臺支援的api編譯好了,把編譯好的api拷貝到解壓後的1.tar的dockerui資料夾裡    
  # cp api /dockerui  # cd /home/loongson/dockerui
  • 把dockerui資料夾裡的ui-for-docker刪除

           

  # rm -rf ui-for-docker
  • 把編譯好的api重新命名為ui-for-docker 
 # mv api ui-for-docker

到這裡就把ui-for-docker官方映象中跟平臺無關的檔案(js、css、html),和編譯好的龍芯平臺支援的二進位制檔案api,整合到一起了。

  • 把整合到一起的資料夾dockerui壓縮

        

  # tar cvf dockerui.tar dockerui/
  • 回到第一步的終端頁面,進入feodra21-base生成的容器6253a4c3f078裡

             

 [[email protected]/]#
  • 建立資料夾ui,用來存放dockerui.tar

            

  [[email protected]/]# mkdir ui
  • 把dockerui.tar傳入到容器6253a4c3f078裡:
   [[email protected]/]# scp [email protected]:/home/loongson/dockerui.tar /ui
  • 把dockerui.tar解壓

            

  [[email protected] ui/]# tar xvf dockerui.tar

 

  • 執行檔案ui-for-docker

       

   [[email protected] dockerui/]# ./ui-for-docker

 

  • 回到容器6253a4c3f078外面的終端執行

              在映象fedora21-base 建立的容器內安裝完dockerUI後,重新匯出一個映象,是為了使容器內部和本機有一個埠對映,使本機可以訪問容器內的dockerUI

    [[email protected] loongson]# docker commit 6253a4c3f078  dockerui-loongson    [[email protected] loongson]# docker stop 6253a4c3f078    [[email protected] loongson]# docker run -i  -t --name f2 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock    dockerui-loongson   /bin/bash

在啟動的容器中執行:

[[email protected] /]# cd ui/dockerui[[email protected] /]# ./ui-for-docker
  • 在瀏覽器裡輸入:  http://localhost:9000    

       

d1.png



解決容器dockerUI啟動容器的bug:
復現bug:進入到localhost:9000頁面後,點選按鈕“Start Container”建立容器後,點選按鈕“stop”,再點選按鈕“start”,容器不能正常啟動
點選下圖中的按鈕“stop”
 

u1.png



再點選“start”按鈕:提示“Container Started”,其實容器是沒有啟動成功的,
 

u2.png


 
排查問題,是containersNetworkController.js中傳入容器id的引數值錯誤,

 

DockerUI截圖.png




由於映象中用到js都是經過編譯後的壓縮檔案,在原始碼中改過之後還要進行編譯和壓縮,所以提供修改後的壓縮檔案uifordocker.js_.zip,把uifordocker.js_.zip檔案下載,解壓後的檔案uifordocker.js替換容器內的檔案uifordocker.js,再測試容器"stop"再“start”,執行正常。

1.png