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):

在云计算中,也就是在天界中,织女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 nanzehua@163.com

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和日志。

作者:取个帅气的昵称华华
链接:https://www.jianshu.com/p/37693eb8f646
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Docker遇见golang https://www.jianshu.com/p/37693eb8f646的更多相关文章

  1. 如何利用docker 构建golang线上部署环境

    公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...

  2. [转]https://www.jianshu.com/p/06443248f4d8

    eos是什么? 原文 https://www.jianshu.com/p/06443248f4d8 简介 用一句话来定义eos,即:区块链操作系统,支持在它之上构建dapp,支持智能合约.帐户.身份验 ...

  3. Zabbix调优不完全指南(https://www.jianshu.com/p/2d911d55448f)

    从学习搭建zabbix到完成各类监控.调优.二次开发已经过去了两年,期间通过QQ学习群.zabbix官方社区.各个技术博客整理学习了不少关于各种报错的处理方法,现在将常见的一些报错处理方法整理出来分享 ...

  4. 接口测试之——Charles抓包及常见问题解决(转载自https://www.jianshu.com/p/831c0114179f)

    简介 Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在Windows,Mac,Linux上使用,安装Charl ...

  5. jar与war包区别,转自https://www.jianshu.com/p/3b5c45e8e5bd

    https://www.jianshu.com/p/3b5c45e8e5bd

  6. fastdfs(https://www.jianshu.com/p/1c71ae024e5e)

    参考 官方网站:https://github.com/happyfish100/ 配置文档:https://github.com/happyfish100/fastdfs/wiki/ 参考资料:htt ...

  7. Docker部署Golang

    1. 安装docker 2. mkdir myDocker 3.  cd myDocker && touch Dockerfile 4.  Dockerfile写入 # 将golang ...

  8. docker registry的https错误解决

    从docker1.3.2版本开始默认docker registry使用的是https,当你用docker pull 非https的docker regsitry的时候会报下面错误: Error: In ...

  9. 利用Docker搭建本地https环境的完整步骤

    利用Docker搭建本地https环境的完整步骤 这篇文章主要给大家介绍了关于如何利用Docker搭建本地https环境的完整步骤,文中通过示例代码将实现的步骤介绍的非常详细,对大家的学习或者工作具有 ...

  10. https://www.jianshu.com/p/1038c6170775

    import os # 方法一: os.walk实现 def items_dir(rootname): l = [] for main_dir, dirs, file_name_list in os. ...

随机推荐

  1. CURL 用法记录

    CURL 用法记录 在工作中经常需要用到curl 命令,记录一下常用的场景 Send a POST Request with JSON Data curl -d '{"login" ...

  2. MySQL InnoDB缓存

    1. 背景 对于各种用户数据.索引数据等各种数据都是需要持久化存储到磁盘,然后以"页"为单位进行读写. 相对于直接读写缓存,磁盘IO的成本相当高昂. 对于读取的页面数据,并不是使用 ...

  3. 最新一线大厂Redis使用21条军规及详细解读

    说明:个人原创,本人在一线互联网大厂维护着几千套集群,关于redis使用的一些坑进行了经验总结,希望能给大家带来一些帮助 适用场景:并发量大.访问量大的业务 规范:介绍军规内容 解读:讲解军规设置原因 ...

  4. 编写 bzt 脚本的正确姿势

    这是今年1月24日的旧文,发现没在这里发过,就搬运过来了. 声明 本文讨论的使用场景主要为使用已有的 jmx 脚本,并配合 json 对 jmx 脚本进行部分参数的动态修改. 只补充一些官方文档上没有 ...

  5. 【ceph】理解Ceph的三种存储接口:块设备、文件系统、对象存储

    文章转载自:https://blog.51cto.com/liangchaoxi/4049104

  6. kubernetes给容器生命周期设置操作事件

    Kubernetes支持预启动和预结束事件. Kubernetes在容器启动的时候发送预启动事件,在容器结束的时候发送预结束事件. 定义预启动和预结束事件操作 下面是Pod的配置文件: # cat l ...

  7. 不能获取到镜像,ImagePullBackoff或者Pending

    Pending 应用长时间处于 Pending 状态时,也可以按照这个办法查看镜像的下载进度. 安装 Kubernetes 过程中,或者向 Kubernetes 部署应用的过程中,有可能会碰到 Ima ...

  8. 秋初 WAMP 集成环境 v2.1

    基于QT的PHP集成开发环境v2.1 https://gitee.com/xiaqiuchu/wamp-integrated-environment 界面预览 已实现功能 服务的启动.关闭.重启. p ...

  9. QML 信号与响应方法的总结

    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16748191.html 如果面试过程中,面试官想了解你对 ...

  10. jquery修改图片src

    jquery修改图片src,会重新请求此图片url,重新加载图片.方法如下: $("#<img的id>").attr("src", src_valu ...