Docker遇见golang https://www.jianshu.com/p/37693eb8f646
在我国古代,传说天庭中有种种天兵天将,有看守四大天门的(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的更多相关文章
- 如何利用docker 构建golang线上部署环境
公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...
- [转]https://www.jianshu.com/p/06443248f4d8
eos是什么? 原文 https://www.jianshu.com/p/06443248f4d8 简介 用一句话来定义eos,即:区块链操作系统,支持在它之上构建dapp,支持智能合约.帐户.身份验 ...
- Zabbix调优不完全指南(https://www.jianshu.com/p/2d911d55448f)
从学习搭建zabbix到完成各类监控.调优.二次开发已经过去了两年,期间通过QQ学习群.zabbix官方社区.各个技术博客整理学习了不少关于各种报错的处理方法,现在将常见的一些报错处理方法整理出来分享 ...
- 接口测试之——Charles抓包及常见问题解决(转载自https://www.jianshu.com/p/831c0114179f)
简介 Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在Windows,Mac,Linux上使用,安装Charl ...
- jar与war包区别,转自https://www.jianshu.com/p/3b5c45e8e5bd
https://www.jianshu.com/p/3b5c45e8e5bd
- fastdfs(https://www.jianshu.com/p/1c71ae024e5e)
参考 官方网站:https://github.com/happyfish100/ 配置文档:https://github.com/happyfish100/fastdfs/wiki/ 参考资料:htt ...
- Docker部署Golang
1. 安装docker 2. mkdir myDocker 3. cd myDocker && touch Dockerfile 4. Dockerfile写入 # 将golang ...
- docker registry的https错误解决
从docker1.3.2版本开始默认docker registry使用的是https,当你用docker pull 非https的docker regsitry的时候会报下面错误: Error: In ...
- 利用Docker搭建本地https环境的完整步骤
利用Docker搭建本地https环境的完整步骤 这篇文章主要给大家介绍了关于如何利用Docker搭建本地https环境的完整步骤,文中通过示例代码将实现的步骤介绍的非常详细,对大家的学习或者工作具有 ...
- https://www.jianshu.com/p/1038c6170775
import os # 方法一: os.walk实现 def items_dir(rootname): l = [] for main_dir, dirs, file_name_list in os. ...
随机推荐
- KingbaseES 的闪回查询
KingbaseES V008R006C006B0013版本新增支持闪回查询,闪回版本查询.闪回表到指定时间点.旧版本已支持闪回回收站技术. 闪回技术(闪回查询和闪回表到指定时间点)可以通过时间戳和C ...
- KingbaseES 两表关联Update的两种写法与性能
熟悉oracle 的人都知道,对于两表的关联更新,其执行计划主要有 Filter 和 Outer Join 两种方式.对于大批量数据的update,Join方式明显是更优的选择.KingbaseES ...
- IEEE浮点数向偶数舍
CSAPP 向偶数舍入初看上去好像是个相当随意的目标--有什么理由偏向取偶数呢?为什么不始终把位于两个可表示的值中间的值都向上舍入呢?使用这种方法的一个问题就是很容易假想到这样的情景:这种方法舍入 ...
- Kubernetes DevOps: Jenkins
提到基于 Kubernete 的CI/CD,可以使用的工具有很多,比如 Jenkins.Gitlab CI 以及新兴的 drone 之类的,我们这里会使用大家最为熟悉的 Jenkins 来做 CI/C ...
- parted创建磁盘分区并创建LVM(Linux合并多块大于2T的磁盘并合并到一个分区)
文章转载自:https://blog.csdn.net/likemebee/article/details/85630808
- Centos7搭建 KVM 环境
注意:使用KVM管理虚拟机分命令行和图形化界面两种方式,这里最后一步安装的工具是图形化管理工具 安装前准备 验证CPU是否支持KVM 如果结果中有vmx(Intel)或svm(AMD)字样,就说明CP ...
- css语言
css:样式表.级联样式表.层叠样式表 css写在style标签里面,放在head标签中:大括号中写键值对语法 color:文字颜色 Font-family:字体 Font-size:字号 text- ...
- Educational Codeforces Round 106 (Rated for Div. 2)
就ac了2题... A题一开始题意模模糊糊的似懂非懂,然后自己按样例推出了题意,简单题很容易ac了.还是自己的英语水平太菜了.... B题根据0和1的位置关系能看出来,因为0不能在1后面, 所以有00 ...
- HQL中出现XXX is not mapped的错误
我的代码如下 @Test public void testCollection(){ String hql = "from Order where orderItems is not emp ...
- 【算法训练营day1】LeetCode704. 二分查找 LeetCode27. 移除元素
[算法训练营day1]LeetCode704. 二分查找 LeetCode27. 移除元素 LeetCode704. 二分查找 题目链接:704. 二分查找 初次尝试 看到题目标题是二分查找,所以尝试 ...