(精品)(Docker系列之六)龙芯平台搭建容器管理工具dockerUI,并解决dockerUI启动容器的bug

整体制作过程:

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[root@6253a4c3f078 /]#
到这里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
            
  [root@localhost 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里
                 
     [root@6253a4c3f078/]#
    • 创建文件夹ui,用来存放dockerui.tar
                
      [root@6253a4c3f078/]# mkdir ui
    • 把dockerui.tar传入到容器6253a4c3f078里:
       [root@6253a4c3f078/]# scp root@10.20.42.96:/home/loongson/dockerui.tar /ui
    • 把dockerui.tar解压
                
      [root@6253a4c3f078 ui/]# tar xvf dockerui.tar
    • 进入到解压后的dockerui文件夹里
       [root@6253a4c3f078 ui/]# cd dockerui
     
    • 运行文件ui-for-docker
           
       [root@6253a4c3f078 dockerui/]# ./ui-for-docker
     
    • 回到容器6253a4c3f078外面的终端运行
                  在镜像fedora21-base 创建的容器内安装完dockerUI后,重新导出一个镜像,是为了使容器内部和本机有一个端口映射,使本机可以访问容器内的dockerUI
        [root@localhost loongson]# docker commit 6253a4c3f078  dockerui-loongson    [root@localhost loongson]# docker stop 6253a4c3f078    [root@localhost loongson]# docker run -i  -t --name f2 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock    dockerui-loongson   /bin/bash
    在启动的容器中执行:
    [root@6253a4c3f078 /]# cd ui/dockerui[root@6253a4c3f078 /]# ./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 个评论

    注意,写完文章后发现,有另一种方法启动DockerUI,
    就是不在镜像中,而是在本地启动。
    方法是:
    * 在本地,把官方ui-for-docker的镜像文件解压缩,就是文章中的下面两个命令:

    # docker export 433b60b7cbd2 >1.tar
    把1.tar解压
    # tar xvf 1.tar

    * 编译出龙芯版本的api(也就是ui-for-docker)复制到1.tar解压缩的目录下,可以直接执行

    ./ui-for-docker

    * 在浏览器中测试:http://localhost:9000,效果是和文章中的运行结果完全相同的。

    要回复文章请先登录注册