在Docker中运行Sphinx基础
2014年08月15日 19:38:48 zhuhuiblog 阅读数:1315
该文原文为Sphinx in Docker. The basics.,发表于http://sphinxsearch.com。
留心一下互联网,你会发现一些关于Docker的消息。Docker是一个帮助开发者和系统管理员构建、封装和运行分布式应用的开源平台。在这篇博客中,我会就如何在一个Docker容器内使用Sphinx,建立一个基本的实例。
什么是Docker?
你可以从这里找到这个问题的答案。概括起来就是(直接从前面的网站上摘抄下来):
使用Docker,开发者可以使用任何工具链用任何语言构建任何app。”Docker化的(Dockerized)”应用完全是可移植的,可以在任何地方运行。
系统管理员使用Docker,可以为开发、QA和产品团队提供标准化的环境,减少“明明在我的机器上就能正常工作”这样的相互指责。通过将应用平台及其依赖Docker化,系统管理员可以抽象掉不同的操作系统和底层基础设施之间的差异。
Docker与虚拟机有那些不同点?Docker引擎容器仅仅由应用及其依赖组成。它就像一个隔离的进程一样,运行在宿主操作系统的用户空间中,与其它容器共享内核。因此,它既可以将资源相互隔离,还可以像虚拟机一样便于分发,但与虚拟机相比可移植性更强,效率更高。
这里有一份不错的案例列表。看一看表中的案例,它们会给你一些启发。
Docker和Sphinx
我认为还是由你自己来决定这对你的团队意味着什么,但是这篇博客在余下的部分,将为好奇的你简要的介绍在一个Docker容器中使用Sphinx会是什么样子。
为了继续下面的内容,下载Docker,check出这个github仓库(包含一个Docker文件,一个简短但是值得深究的Sphix配置实例,以及一些.sh文件)。你可能注意到我已经总结出了下面几个步骤。
克隆和构建
在这个例子中,因为我运行的是Ubuntu 14.04,所以 “docker”变成了“docker.io”。克隆这个github仓库后,下一步你要做的就是到合适的目录下构建容器。
Docker文件包含一个命令列表,这些命令将添加Sphinx PPA,安装Sphinx-beta,创建一些目录,添加我们的.sh文件,最后将9306端口暴露给宿主机。在运行以上命令后,Docker将会按照Docker文件中列出的步骤运行,最终会告诉你镜像已经成功创建。
从Docker hub上pull下这个镜像:
sudo docker.io pull stefobark/sphinxdocker
运行
现在,成功创建镜像之后,可以启动我们的Sphinx容器了。就像这样:
sudo docker.io build -t sphinx .
发生了什么?
-p 9311:9306向容器内的9306端口开启了宿主机的9311端口。然后,在我们的Sphinx配置文件中,我们让Sphinx在9306端口上监听MySQL协议。因此,我们将能够在宿主机的9311端口上打开Sphinx的命令行接口。
通过-v,我们向容器添加了数据卷。现在,我么能将Sphinx配置文件和各种索引数据文件保存到宿主机上。这么做相当方便,而且对于索引文件来说非常重要,因为在容易意外关闭后,这些文件都将不再存在。
-d为容器初始化一个守护进程
./indexandsearch.s最终运行索引器,启动搜索。
它在运行吗?
现在是时候来检查一下了:
sudo docker.io ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
250a08d4adc1 sphinx:latest ./indexandsearch.sh 8 seconds ago Up 3 seconds 0.0.0.0:9311->9306/tcp backstabbing_fermi
8fd479563a87 stefobark/mysql:latest /run.sh 2 days ago Up 36 hours 0.0.0.0:3311->3306/tcp elegant_albattani
你能看到容器正在运行,状态列告诉我们它已经运行了3s。你也能看到我们有一个运行中的MySQL容器。
sphinxy.conf
当我们启动这个Sphinx容器时,我们共享了宿主机上包含我们的基本配置文件的那个目录。在这个文件中,”sphinxy.conf“,我已经将Sphinx指向了一个MySQL数据源。为了设置这个源,我获取了这个运行中的MySQL容器的ID,然后运行docker.io inspect (container id)。
下面就是那个容器的检查结果:
“NetworkSettings”: {
“IPAddress”: “172.17.0.2”,
“IPPrefixLen”: 16,
“Gateway”: “172.17.42.1”,
“Bridge”: “docker0”,
“PortMapping”: null,
“Ports”: {
“3306/tcp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “3309”
}
]
}
我用上面的结果来定义数据源(很明显,这可能会与你的不同,你可以将Sphinx指向你喜欢的任何数据源)。
source src1
{
type = mysql
sql_host = 172.17.42.1
sql_user = admin
sql_pass =
sql_db = testing
sql_port = 3309
sql_query = select * from test
sql_field_string = content
sql_attr_uint = g_id
}
这份配置文件实在是太简单了(我用了许多默认设置),但是如果你看看文件剩下的部分,注意它正在设定的路径,以及在9306端口上监听MySQL协议。
检查一下我们的文档,可以了解更多有关我们所做的设定的内容。
indexandsearch.sh和searchd.sh
indexandsearch.sh很简单:
#!/bin/bash
/usr/bin/indexer -c /etc/sphinxsearch/sphinxy.conf test
./searchd.sh
它运行索引器,使用sphinxy.conf,这个文件从我们刚刚通过-v选项共享的宿主机目录,被挂载到了容器。运行searchd.sh将会结束(实际上启动了搜索)。
命令行搜索
现在,来确认一下Sphinx是否成功地索引了我们的测试数据和准备好为搜索提供服务。让我们试试下面的命令:
mysql -h127.0.0.1 -P9311
或者
mysql -h0.0.0.0 -P9311
或者,还可以更快一点
mysql -h0 -P9311
这会产生下面的结果:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 2.2.3-id64-beta (r4690)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>
不要被迷惑了。我们正在和Sphinx对话。你能看到服务器的版本是2.2.3-id64-beta (r4690)。现在,继续下一步,试着搜索“test”索引。
select * from test;
到现在为止,如果一切顺利的话,你会看到你选择索引的任何数据。就是这样,Docker看起来相当方便,试试吧。
视频
最后,这里有一个视频可以帮你复习一下上面的每个步骤,视频演示了在一个容器中运行Sphinx是什么样子。
你已经尝试在Docker中运行Sphinx了吗?我很乐意听到你的想法。
转载请注明:SuperIT » 在Docker中运行Sphinx基础