Docker遇见golang

 

Docker遇见golang_第1张图片
golang logo

在我国古代,传说天庭中有种种天兵天将,有看守四大天门的(docker0网桥),有负责传话的门将(REST API),有负责人间和天界联络的,如财神爷,土地公等(NAT,DNS),而且还有绑定在每个神仙身上的坐骑(EVS,NFS,BS,  EFS),还有关于各个管辖的奏折(Log)。由于每个上仙的职责不同(Controller,Scheduler),被管辖范围的人数或者项目不同(Container,Host),还有吃了可以长命百岁的仙桃(image)等等等等;但是呢,天庭有个规,不许神仙与凡人相爱,而处于修道或者成魔成妖的人或者动物,则属于被监控和被调度的资源。

    原来古代的管理模式也属于云计算的范畴,即通过一个请求可以将计算资源,存储资源,网络资源进行调度、分配与整合。

牛郎:

    牛郎是一个很聪明,很朴实,很简单的语言,他所处的世代(runtime)是一个多帝王(CPU),多耕地(Disk),严制度(Gc),快通讯(Goutinue)的朝代。也正是就这样,天时地利人和,样样是牛郎的优势,于是乎牛郎(Go)就诞生在世人的眼帘。由于k8s的组件多数是基于go开发的,再加上牛郎自的优势,而他的贡献很快被世人所应用,大致有这几个特点:

    1、部署简单;相比Python,Python官方 PyPI 源又经常出问题,需要搭建私有镜像,而维护这个镜像又要花费不少时间和精力,而go语言可编译可执行的静态文件,除了 glibc 外没有其他外部依赖。

    2、效率之快;相比Java,它完善的基础库和的和高效gc,相比C语言,虽然C和C++有超快的处理速度和强大的性能,但是这两个者对字符串处理能力较弱,也没有gc,导致开发周期提升。

    3、并发性好;Goroutine和channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个 Go 应用也能有效的利用多个 CPU 核,并行执行的性能好。

    4、良好的语言设计;定义变量自由,切片和接口的设计大大提高了代码的通用性和移植能力。比如 gofmt 自动排版 Go 代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。

    而民间传说有一件法宝名叫beego框架,它正是借助牛郎的优势所发明出来的一件器皿。而它的出现大大简化耕地(程序)和农场(web项目)的开发的周期和流程设计,起初只需要按照生成模板进行增删改,就可以快速创建和部署一个小型农场。

    要先获取此件宝器,必须先去github官网下载源码,进行编译,然后搭建好bee和beego的环境,搭建好之后通过如下宝器的咒语创建beego项目,比如下面命令就可以创建项目:

bee new hello

    创建好项目之后,便可以给耕地种植不同种类的农作物,就可以让其生长,如下图所示的目录结构是我这个穷屌丝的农场结构,简单的国际化处理,特别简陋,希望大家熟练去应用牛郎的贡献。

Docker遇见golang_第2张图片

织女(Docker):

    在云计算中,也就是在天界中,织女Docker就好比集装箱,天界就好比大货轮。Mac上的Docker好比烟熏妆的织女,深沉而又优雅。

    “在集装箱之前,货物运输没有统一的标准方式进行搬运,于是铁路、公路、海洋等各种运输之间,需要大量的人力作为货物中转,效率极低,而且成本很高。集装箱出现之后,世界上绝大多数的货物运输都可以放到这个神奇的箱子里,然后在公路、铁路、海洋等所有运输场景下,这个箱子都可以不用变化形态直接可以承运,而且中间的中转工作,都可以通过大型机械搞定,效率大大提升”。引自腾讯高级工程师邹立巍在《什么是 Docker?》这篇文章的上半部分对Docker的通俗解释;

    正是由于标准货轮的出现,大大推动了云概念的进阶和天庭的改革。随着docker对天界的应想呈递增式增长,而且关于它的奏章目前也不少,每个上仙团队对docker的关注点也并不相同,这个得结合自己的应用去使用“集装箱”。

    织女Docker常见有三重性格:即MacOS、Linux/Unbutu、Windows,它们的安装步骤分别在下篇文章中可进行阅览,包括内容有织女Docker的命令、存储和网络等。

鹊桥(Dockerfile):

    每当牛郎(Go)和织女(Docker)相遇,一见钟情。而最后被王母(OS)经常阻拦或者拆散。但是他们十分相爱以至于感动了世间万物,即镜像的出现拉近了彼此之间的距离,推动了故事的进一步发展;都说过Docker是集装箱的容器,容器里面放的是应用,应用可以是web项目、也可以是程序还可以是农场。

有这么一句话:“Any problem in computer science can be solved by another layer of indirection”。意思是说,在计算机科学领域的任何问题都可以增加一个间接的中间层来解决。

    所以鹊桥的出现就相当于一个中间层。织女Docker通过Dockerfile构建出来鹊桥,来加载启动镜像和牛郎Go相遇,而镜像包的制作离不开牛郎家的牛皮即压缩好的tar包。鹊桥制作的模板如下:

FROM centos:latest

MAINTAINER nanzehua [email protected]

EXPOSE 8080

#RUN passwd paas < paas_pwd.txt

#RUN rm paas_pwd.txt

ADD hello.tgz /var/paas/project-hello/

#COPY tar -zxvf /var/paas/project-hello/hello.tgz

RUN mkdir -p /var/paas/log/

RUN touch /var/paas/log/project-hello.log

RUN chown paas:paas -R /var/paas/

RUN chmod -R 750 /var/paas/

#ENTRYPOINT ["/var/paas/project-hello"]

CMD ["/var/paas/project-hello/hello"]

    ADD和COPY的区别是,ADD命令会将压缩好的tar包直接解压到指定目录中,然后通过docker build -t hello:1.1.1来编译镜像,为了提高工作效率,可以通过编写shell脚本来构建自动化出包,直接用jenkins镜像搭建CI环境,再将Go项目编译二进制文件的时候值得注意一点是,由于编译环境不同,通过交叉编译后,二进制文件才能在指定环境中运行,大致这三种场景:

# Mac下进行交叉编译至Linux64

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

#bee pack -be=GOOS=linux -exs=.md:.go:.DS_Store:.tmp:.zip:.exe.exe~ -exp=.:swagger:static:runtime

# Mac下进行交叉编译至Windows64

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build

# Linux下编译

go build

    这些问题注意之后,咱们就生成了一个名为的hello的Image,然后通过

docker run -p 8080:8080 hello:1.1.1

就成功启动了一个容器,浏览器中在通过

http://127.0.0.1:8080

就可以看到beego的主界面和已经国际化的个别字样了,详细的自动化shell脚本和go代码,我已经上传至github库Docker+beego,欢迎大家的指点和补充。

    下一节,讲解Docker网络、CLI和日志。

你可能感兴趣的:(Docker遇见golang)