golang的杀手级应用:docker

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 之后,怎么调整参数都不怕侧漏。

总结

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

参考

转载请注明出处: golang的杀手级应用:docker