设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

Docker:分布式系统的软件工程革命(上)

2014-8-1 14:13| 发布者: joejoe0332| 查看: 7583| 评论: 0|原作者: 王益|来自: github

摘要: 为了使用Docker,需要了解不少工具及其设计思路;而这些工具的文档分布在不同的网站。为了方便大家学习,本文以开发一个极简的搜索引擎为例,展示Docker带来的革新。本文以技术教程为主线,穿插了一些关于Hadoop和Me ...


CoreOS

  实际开发中的测试机群和产品环境通常都是用的Linux服务器。要在上面执行集装箱,也需要安装Docker。因为Docker的开发者提供各种Linux软件包,所以通常输入一个命令,即可安装Docker。比如在Ubuntu/Debian Linux里,这个命令是:

sudo apt-get install docker.io


  但是目前最常用的用来执行Docker集装箱的Linux发行版本既不是Ubuntu、Debian也不是RedHat、Fedora,而是CoreOS。这个发行版本根本没有软件包管理程序,所以也不能通过输入某个命令来安装软件。但是CoreOS预装了Docker,所以可以制作集装箱镜像,或者下载别人发布的集装箱镜像来执行。目前,Amazon AWS和Google Compute Engine这两大云计算平台都提供预装了CoreOS的虚拟机。


  实际上,Google数据中心里运行的Linux系统和CoreOS有很多相似之处。我记得2010年我刚离开Google加入腾讯的时候,一位腾讯的同事好奇地问:“Google的机群里用的Linux用什么软件包管理程序?是apt-get吗?还是yum?”我回答:“其实服务器上运行的Linux是不需要包管理的,只有桌面Linux系统才需要”。这位同事很难相信。其实,要不是因为“见了一回猪跑”,我也想不到会是这样。


  CoreOS和其他Linux发行版本相比,执行效率高、内存耗费省;此外,利用双磁盘分区技术,即便是更新Linux内核也不需要重启。CoreOS还有很多独特之处,使得它在问世后很短的时间里就被Amazon和Google采用。如果想进一步了解这些特性,请看这个对Docker作者的访谈。


Go语言

  接下来,我们看看如何在Mac上用Go语言写一个极简化的搜索引擎,并且封装成集装箱镜像。


  我们选择Go语言为例,而不是更常见的Java、Python、Perl、Ruby、Scala等,有很现实的原因——后面这些语言写的程序,在执行时都需要某些运行环境的支持。比如,Java程序依赖Java虚拟机,Python程序需要Python解释器,这些加上预装的程序库需要占用几百MB的集装箱空间。而用Go写的程序默认是全静态编译的,执行时不需要任何环境支持,不需要预装库,甚至连Linux系统动态库都不依赖。鉴于一家公司的系统往往由成千上万的集装箱构成;每个集装箱少几百MB,能为公司省出很大一笔开销。那些每月要向Amazon或者Goolgle付账的公司,对此必然印象深刻。这是Go语言在很多创业公司拓展迅猛的一个原因。


  如果我们用C或者C++开发,也可以生成全静态链接的二进制程序文件。但是在Web时代,C/C++的开发效率不如Go。Google里倒是普遍使用C++,但是Google里有一套精心设计、积攒多年的C++库,这是外界没有的。外界普遍得使用第三方库,并往往因此挠头。比如,不同的第三方库(Thrift和boost)各有各的线程池机制,很难统一管理多线程。C++11倒是有了标准线程管理,但是把很多库统一到C++11是一项开销极大的工作。Go语言是专门为分布式系统开发设计的,根本就没有线程的概念,在语法上用goroutine代替了,线程池实现在Go runtime里,被编译进每个二进制程序。


交叉编译

  因为集装箱用主机的操作系统和硬件来执行程序,而Docker只支持Linux,所以Go程序必须被编译成Linux二进制文件,才能通过Docker运行。而我们在Mac上开发,需要利用交叉编译技术来生成Linux二进制文件。


  为了得到一个支持交叉编译的Go语言编译器,我们需要从源码安装Go,并且需要做一些额外的安装工作。具体过程如下:


1. 安装Xcode,从而获得C编译器。

2. 下载Go编译器的源码包。比如Go 1.3在这里。

3. 解压和编译

 tar xzvf go1.3.src.tar.gz
 cd go/src
 ./all.bash

4. 编译各种平台下的Go标准库

 git clone git://github.com/davecheney/golang-crosscompile.git
 source golang-crosscompile/crosscompile.bash
 go-crosscompile-build-all


  这里,我们用到了Dave Cheney写的一个Bash脚本程序。这个程序支持生成以下平台上的Go语言标准库:


  1. darwin/386
  2. darwin/amd64
  3. freebsd/386
  4. freebsd/amd64
  5. freebsd/arm
  6. linux/386
  7. linux/amd64
  8. linux/arm
  9. windows/386
  10. windows/amd64
  11. nacl/amd64
  12. nacl/386


  并行计算最常用的目标平台是linux/amd64——64bit的Linux系统,也是CoreOS的平台格式。下文中我们会演示如何在Mac下用这个编译器生成Linux平台的二进制代码文件。 



酷毙

雷人
1

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部