golang的杀手级应用:docker

标签: golang 杀手 应用 | 发表时间:2014-11-15 00:00 | 作者:草依山
出处:http://jser.me

docker 是 golang 的第一个杀手级应用,发展迅猛, 现在各大云计算平台几乎全都支持 docker 实例,包括 谷歌,亚马逊,阿里云等。 golang 本身已经让我惊喜万分,而 docker 更是极大的激发了我对虚拟化的想象。

关于软件和硬件

IT 业发展至今,软件和硬件始终是无法分割的两个物体。 就拿最近几年红红火火的智能机时代来说, 很久之前的诺基亚智能机, 软件和硬件相辅相成, 连进入主界面都需要按一个特定的按钮才能进入。 软件的操作都严重依赖键盘等按键。 体验非常不好, 对软件设计人员的约束也很大。

而苹果 iPhone 横空出世的时候, 最大限度的让你忘记硬件, 硬件主要只剩下一个 home键 和 可触控玻璃。 就是这样的 home键 和 触摸屏 组合, 大大的释放了软件开发人员的想象力, 自由的设计不同的软件交互风格。 从而让手机应该爆发式的增长。

两个最关键的概念: 镜像和容器

好像说跑题了,回到 docker , docker 是一种虚拟技术, 很多文档都说的云里雾里让人摸不着头脑, 但是按我的理解其实就是主要分为两个层次, 第一层是 【镜像(image)】 , 第二层是 【容器(container)】。 他们两者是互相转化的关系, 前者是一种【过去式】,后者是【进行时】, 镜像就好像是 git 的 tag 标签,是已经打上烙印, 是可以回滚回去的。 后者就是正在运行的状态,是基于镜像的。

比如我们对镜像 ImageA(镜像 ImageA 是静止状态)启动起来, 启动后就变成了 ContainerA 容器(运行状态), 当我们对该容器进行了修改(比如在该容器中运行了 sudo apt-get install cmake), 则该容器 ContainerA 和初始的镜像 ImageA 会出现了差异, 然后我们可以将该容器 commit 成另一个镜像 ImageB 。 这样下次在需要装有 cmake 的容器时,我们可以直接基于 ImageB 启动(run) 出一个 ContainerB , 这样 ContainerB 就自然而然已经装好了 cmake 这个软件。 而且各种容器互不干扰,每个容器其实就对应着一个虚拟机, 也就是在同一台物理机上面我们可以虚拟机 N 个虚拟机(N个容器)。

更具体的学习手册请看 【 Docker从入门到实践】。

一劳永逸的软件部署

docker 对软件部署非常的友好, 比如我们之前装了一个 cmake , 而今天我们需要搭建一个集群,有N台虚拟机,每个虚拟机都需要 cmakeclang。 则我们只需要对之前的 ImageB 启动一个容器 ContainerC (ContainerC 本身已经带有 cmake), 然后装上 clang ,然后再将 ContainerC commit 成 ImageC 。 这样 ImageC 就带有 cmakeclang 。 所以我们直接基于 ImageC 启动 N 个容器 (ContainerC1 ContainerC2 ... ContainerCN)。 就是环境一摸一样的N台虚拟机。 而不是之前的一台一台重复性的安装软件。 甚至对于以前让运维煞费苦心的软件依赖等问题, 现在也都可以通过不同镜像的叠加,轻松搞定。

tag就是最好的后悔药

可能很多人会想,如果只是为了避免重复性的安装操作。 可以将安装操作换成脚本即可。 但是假设如果我们的安装脚本出错了, 出现了误操作或者装错了软件版本导致兼容问题了怎么办? docker 也可以非常好的解决这个问题, 因为有镜像的缘故,每个镜像都是另一个镜像演化而来的, 而且每个镜像可以打标签, 所以回滚也非常的容易,如果我们有一个镜像叫 YanyiwuImage:v1 。 当下次讲 container commit 到 YanyiwuImage:v2 。 让我们发现 YanyiwuImage:v2 出错了,我们可以很轻易的回滚到 YanyiwuImage:v1 。 回滚也就是 image 支持标签的意义所在。 就像 git 版本管理一样,保存那么多 commit 信息就是为了更好的回滚。 告别以前动不动就需要重装系统,从头来过的软件部署之殇。

也可以防止一些误操作,比如当你的服务器上面有一个文件存储服务, 因为误操作上传了一些文件, 因为有了 docker 的回滚,直接一键回滚, 也就省去了一个个删除误上传的文件的麻烦事。

对测试更加友好

当我们开发系统级软件服务的时候, 就拿即时消息推送服务来说, 在测试推送服务的性能的时候, 我们经常需要调整 linux 系统参数来进行测试。 而我们很可能一不小心测试完后忘了将参数调整复原。 甚至也很容易忘了我们究竟修改了哪些参数。 这时候如果是在 docker 里面,因为 docker 支持回滚。 我们只需要回滚一下,即可回到过去。 大妈一分钟变萝莉。 世界还是那么美好。 测试时调整参数再也不需要那么提心吊胆和小心翼翼。 就像有句广告词说的,有了 docker 之后,怎么调整参数都不怕侧漏。

回滚还可以防攻击

当你的服务器遭受病毒之后,你所需要的先是切断掉该服务器和其他服务器的连接。 然后就是杀毒了,但是有时候病毒很难找出来,一般是重装系统来搞定。 但是有了 docker 之后,直接回滚即可,后悔药就是这么好喝。

总结

对于回滚的良好支持再加上镜像可以层层叠加, 光是这两者就可以组合出各种巧妙的应用。 再加上启动迅速,容器轻量, 轻松甩了其他虚拟机好几条街。

参考

相关 [golang 杀手 应用] 推荐:

golang的杀手级应用:docker

- - _不是我干的 _
docker 是 golang 的第一个杀手级应用,发展迅猛, 现在各大云计算平台几乎全都支持 docker 实例,包括 谷歌,亚马逊,阿里云等. golang 本身已经让我惊喜万分,而 docker 更是极大的激发了我对虚拟化的想象. IT 业发展至今,软件和硬件始终是无法分割的两个物体. 就拿最近几年红红火火的智能机时代来说, 很久之前的诺基亚智能机, 软件和硬件相辅相成, 连进入主界面都需要按一个特定的按钮才能进入.

Golang测试技术

- - Tony Bai
本篇文章内容来源于 Golang核心开发组成员 Andrew Gerrand在Google I/O 2014的一次主题分享“ Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对. 单元测试),包括基本技术、高级技术(并发测试、 mock/fake、竞争条件测试、并发测试、内/外部测 试、vet工具等)等,感觉总结的很全面,这里整理记录下来,希望能给大家带来帮助.

Golang 大杀器之跟踪剖析 trace

- - SegmentFault 最新的文章
在 Go 中有许许多多的分析工具,在之前我有写过一篇 《Golang 大杀器之性能剖析 PProf》 来介绍 PProf,如果有小伙伴感兴趣可以去我博客看看. 但单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作. GC 是怎么影响到 Goroutine 的执行的.

基于Golang的微服务——Micro实践

- - IT瘾-tuicool
开始开发前需要先配置好Go的开发环境,可以看我写的 基于Golang的微服务——上手篇. 在 GOPATH目录下的src目录下创建我们的实战项目目录 tech,切换到这个目录. go get github.com/micro/go-micro //用于开发的微服务的RPC框架,是micro架构的基础 go get github.com/micro/protoc-gen-micro // 用于生成Protobuf的代码 go get github.com/micro/micro // 工具集安装,会自动将 micro加入环境变量 复制代码.

gocode——VIM 和 Emacs 的 golang 代码自动补全

- XiaoHui - Some reminiscences, some memories
虽然 golang 自身提供了 VIM 的语法高亮之类的脚本,但 autocompletion 并没有官方解决方案. 无意之中发现 gocode 这个支持 VIM 和 Emacs 的 autocompletion daemon. 这里有个Flash 动画演示,展示了 gocode 的强大. 我得说,用过之后,感觉速度确实够快.

windows 下搭建 GoLang 语言开发环境

- - haohtml's blog
golang官方二进制分发包包括FreeBSD, Linux, Mac OS X (Snow Leopard/Lion), and Windows等平台,包括32位、64位等版本. 我自己使用的是windows 32位分发包,MSI格式的,下载地址为: http://code.google.com/p/go/downloads/list.

[转][转]Golang适合高并发场景的原因分析

- - heiyeluren的blog(黑夜路人的开源世界)
来源: http://blog.csdn.net/ghj1976/article/details/27996095. 我们先看两个用Go做消息推送的案例实际处理能力. 16台机器,标配:24个硬件线程,64GB内存 . 单机80万并发连接,load 0.2~0.4,CPU 总使用率 7%~10%,内存占用20GB (res) .

Golang并发模型:轻松入门流水线FAN模式

- - SegmentFault 最新的文章
前一篇文章 《Golang并发模型:轻松入门流水线模型》,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Golang并发,提高软件性能. 但FAN模式不一定是万能,不见得能提高程序的性能,甚至还不如普通的流水线. 我们先介绍下FAN模式,再看看它怎么提升性能的,它是不是万能的.

基于 HLS 创建 Golang 视频流服务器

- - 掘金 前端
HLS 是 HTTP Live Streaming 的缩写,是苹果开发的一种基于 HTTP 的自适应比特率流媒体传输协议, 并于 2009 年. HLS 流媒体已经成为应用最广泛的实时视频协议. 它是一种将流分解成基于文件小段的格式, 可以通过 HTTP 下载,HLS 可以通过标准的 HTTP 或代理服务器等,这和基于 UDP 的协议(例如 RTP)不同.

GO 工具包安装方法 - Go语言中文网 - Golang中文社区

- -
go 安装依赖包一般会通过四种路径. 比如我们可以通过go get github.com/xxx来下载安装包. 下载好之后, 通过go install github.com/xxx来安装包. 安装包会下载到$GOPATH/src文件中. 安装后的执行文件在$GOPATH/bin文件. 当我们执行go get golang.org/x/tools/cmd/goimports会报错.