EN

新闻中心

LOONGSON NEWS

栏目导航

龙芯Fedora21推出docker方案

发布时间:2016-11-17    已阅读:

 

        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 $@ $<   #$@--目标文件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