龙芯平台搭建容器管理工具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”,运行正常。