龍芯平臺搭建容器管理工具dockerUI,並解決dockerUI啟動容器的bug
http://ask.loongnix.org/?/article/84
整體制作過程:
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
- 進入到解壓後的dockerui資料夾裡
[[email protected] ui/]# cd dockerui
- 執行檔案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
解決容器dockerUI啟動容器的bug:
復現bug:進入到localhost:9000頁面後,點選按鈕“Start Container”建立容器後,點選按鈕“stop”,再點選按鈕“start”,容器不能正常啟動
點選下圖中的按鈕“stop”
再點選“start”按鈕:提示“Container Started”,其實容器是沒有啟動成功的,
排查問題,是containersNetworkController.js中傳入容器id的引數值錯誤,
由於映象中用到js都是經過編譯後的壓縮檔案,在原始碼中改過之後還要進行編譯和壓縮,所以提供修改後的壓縮檔案uifordocker.js_.zip,把uifordocker.js_.zip檔案下載,解壓後的檔案uifordocker.js替換容器內的檔案uifordocker.js,再測試容器"stop"再“start”,執行正常。