极简版搜索引擎在这篇帖子里,作者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 此时,在 /tmp/learn-docker/bin 目录里应该有两个二进制程序文件 indexer和searchengine。这两个文件都是Darwin/AMD64格式的。我们可以在Mac主机上运行它俩: ./bin/searchengine -addr=":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 \ 可以看到,我们只是通过环境变量设置了一下目标操作系统和架构。 随后,我们要创建一个Docker集装箱镜像,把编译好的两个程序放进去。因为如上文介绍的,Go程序执行时不需要特殊的运行环境,所以这个集装箱镜像里,除了一些metadata和我们的程序之外,什么都不需要。以至于我们可以从Docker Hub网站上下载一个空的镜像,在里面安装我们的程序即可。为此,我们需要写一个Dockerfile: FROM scratch 这里的第一行是让Docker自动从Docker Hub上下载名为scratch的镜像;第二行说把本地文件bin/linux_amd64/searchengine装进这个镜像的根目录,成为/searchengine;第三行拷贝indexer。 有了Dockerfile我们就能用docker命令创建一个镜像了。下面命令创建一个镜像,并命名为wangkuiyi/helloworld: cp $GOPATH/src/github.com/wangkuiyi/helloworld/Dockerfile $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 |