设为首页收藏本站

LUPA开源社区

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

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

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

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


极简版搜索引擎

  在这篇帖子里,作者Adriaan de Jonge用一个最简单的http server作为例子,说明如何在Mac下用Docker运行一个程序。


  这篇帖子对我很有帮助。只是这个例子程序太过简单了——通常一个互联网产品包含不只一个程序——现代互联网产品几乎都采用micro service架构,一个http server和多个RPC server协同工作。之外,还会有一些daemon程序,不时向RPC server提供不断更新的数据。比如在搜索引擎里,一个indexer程序会不断将cralwer程序爬下来的网页内容加以整理,并且发送给搜索引擎服务。


  本节里我们介绍的极简版的搜索引擎就包括两个程序——search engine server和向它提供索引内容的indexer daemon。search engine server首先是一个http server,可以通过浏览器访问——对每个输入的query,返回相应的结果。同时,它还是一个RPC server,接受从indexer daemon发来的更新后的索引内容。这两个程序的源码在这里。


  为了下载和构建这个例子程序,请输入如下命令:

mkdir -p /tmp/learn-docker
cd /tmp/learn-docker
export GOPATH=`pwd`
go get github.com/wangkuiyi/helloworld/indexer
go get github.com/wangkuiyi/helloworld/searchengine


  此时,在 /tmp/learn-docker/bin 目录里应该有两个二进制程序文件 indexer和searchengine。这两个文件都是Darwin/AMD64格式的。我们可以在Mac主机上运行它俩:

./bin/searchengine -addr=":10000" &
./bin/indexer -searchengine="localhost:10000"


  这样首先启动了searchengine,并且让它的http和rpc服务都监听本机(Mac主机)的10000端口;随后启动了indexer,它每秒钟通过RPC调用告诉searchengine更新索引内容。


  启动成功之后,我们可以在浏览器里访问如下网址:http://localhost:10000/?q=news,从而看到searchengine返回的搜索结果(如下图):



  当然,我们也可以用命令行程序,比如wget和curl,来访问searchengine服务。这样我们可以很方便的写一个集成测试(regression test)程序。比如这个。


创建集装箱

  接下来,我们看看如何把这两个程序打包进Docker集装箱镜像,然后在Mac主机(实际上是boot2docker创建的Linux虚拟机)上运行集装箱。接下来我们会看到:这些集装箱不用修改,也就能在Amazon AWS和Google Compute Engine上运行,从而完成发布。


  首先,我们需要从源码生成Linux/AMD64二进制程序文件。用上文介绍的方法,得到一个支持交叉编译的Go编译器之后,编译示范程序很简单:

GOOS=linux GOARCH=amd64 go install \
github.com/wangkuiyi/helloworld/indexer \
github.com/wangkuiyi/helloworld/searchengine


  可以看到,我们只是通过环境变量设置了一下目标操作系统和架构。


  随后,我们要创建一个Docker集装箱镜像,把编译好的两个程序放进去。因为如上文介绍的,Go程序执行时不需要特殊的运行环境,所以这个集装箱镜像里,除了一些metadata和我们的程序之外,什么都不需要。以至于我们可以从Docker Hub网站上下载一个空的镜像,在里面安装我们的程序即可。为此,我们需要写一个Dockerfile:

FROM scratch
ADD bin/linux_amd64/searchengine /searchengine
ADD bin/linux_amd64/indexer /indexer


  这里的第一行是让Docker自动从Docker Hub上下载名为scratch的镜像;第二行说把本地文件bin/linux_amd64/searchengine装进这个镜像的根目录,成为/searchengine;第三行拷贝indexer。


  有了Dockerfile我们就能用docker命令创建一个镜像了。下面命令创建一个镜像,并命名为wangkuiyi/helloworld:

cp $GOPATH/src/github.com/wangkuiyi/helloworld/Dockerfile $GOPATH/
docker build -t wangkuiyi/helloworld $GOPATH


  此时,我们可以用docker images命令看到我们创建的镜像:

yiwang@yiwang-mn1-> docker images

REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

wangkuiyi/helloworld   latest              255460c3d095        3 hours ago         13.86 MB



酷毙

雷人
1

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

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

最新评论

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

返回顶部