Docker 中的 Solr
开始使用 Docker 镜像
以下说明适用于 solr:8.0.0
及更高版本。
请参阅 Docker Hub 页面,以获取可用的完整标签和架构列表。
可用镜像
为每个版本提供了两个 docker 镜像,完整版和精简版。它们对应于为每个 Solr 版本生成的两个二进制发行版。可以在以下位置找到这些发行版的 docker 镜像
完整发行版 |
|
精简发行版 |
|
有关每个发行版的更多信息,请参阅 可用 Solr 软件包 部分。
使用主机挂载目录运行 Solr
通常,用户首先希望在容器中运行一个独立的 Solr 服务器,为数据使用一个核心,同时将数据存储在本地目录中。这是一种方便的机制,开发人员可以使用它,也可以用于单服务器生产主机。
mkdir solrdata
docker run -d -v "$PWD/solrdata:/var/solr" -p 8983:8983 --name my_solr solr solr-precreate gettingstarted
然后,使用 Web 浏览器转到 http://localhost:8983/
以查看 Solr 的管理用户界面(为 Docker 主机调整主机名)。在用户界面中,单击“核心管理”,现在应该看到“gettingstarted”核心。
接下来,加载容器中包含的一些示例数据
docker exec -it my_solr post -c gettingstarted example/exampledocs/manufacturers.xml
在用户界面中,找到“核心选择器”弹出菜单,选择“gettingstarted”核心,然后选择“查询”菜单项。这会为您提供对 :
的默认搜索,它将返回所有文档。点击“执行查询”按钮,您应该会看到一些包含数据的文档。恭喜!
映像的工作原理
容器包含一个 Solr 安装,由 服务安装脚本 安装。这将 Solr 发行版存储在 /opt/solr
中,并配置 Solr 使用 /var/solr
存储数据和日志,使用 /etc/default/solr
文件进行配置。如果您希望保留数据,请在 /var/solr
上挂载一个卷或目录。Solr 期望在 /var/solr
中有一些文件和目录;如果您使用自己的目录或卷,您可以预先填充它们,或者让 Solr Docker 为您复制它们。如果您希望使用自定义配置,请将其挂载在适当的位置。有关示例,请参见下文。
Solr docker 分发在 /opt/solr/docker/scripts
中添加了脚本,以便在 Docker 下更轻松地使用,例如在容器启动时创建核心。
创建核心
当 Solr 以独立模式运行时,您创建“核心”来存储数据。在非 Docker Solr 上,您将在后台运行服务器,然后使用 Solr 控制脚本 来创建核心并加载数据。使用 Solr docker,您有各种选项。
手动
第一个完全相同:启动在容器中运行的 Solr,然后在同一容器中手动执行控制脚本
docker run -d -p 8983:8983 --name my_solr solr
docker exec -it my_solr solr create_core -c gettingstarted
这对用户来说不太方便,并且使其更难将其转换为 Docker Compose 和 Kubernetes 等编排工具的配置。
使用 solr-precreate 命令
因此,通常您将使用 solr-precreate
命令,该命令准备指定的核心,然后运行 Solr
docker run -d -p 8983:8983 --name my_solr solr solr-precreate gettingstarted
solr-precreate
命令采用一个可选的额外参数来指定 /opt/solr/server/solr/configsets/
下面的 configset 目录,或者您可以在容器内指定自定义 configset 的完整路径
docker run -d -p 8983:8983 --name my_solr -v $PWD/config/solr:/my_core_config/conf solr:8 solr-precreate my_core /my_core_config
注意:在指定 configset 的完整路径时,实际核心配置应位于 conf
目录中该目录内。有关详细信息,请参阅 Configsets。
创建集合
在“SolrCloud”集群中,您创建“集合”来存储数据;并且您还有几个选项来创建核心。
这些示例假定您正在运行 docker compose 集群。
创建集合的第一种方法是转到 Solr 管理员 UI,从左侧导航菜单中选择“集合”,然后按“添加集合”按钮,为其命名,选择_default
配置集,然后按“添加集合”按钮。
第二种方法是通过其中一个容器上的 Solr 控制脚本
docker exec solr1 solr create -c gettingstarted2
第三种方法是使用单独的容器
docker run -e SOLR_HOST=solr1 --network docs_solr solr solr create_collection -c gettingstarted3 -p 8983
第四种方法是使用远程 API,从主机或其中一个容器,或同一网络上的某个新容器(相应地调整主机名)
curl 'http://localhost:8983/solr/admin/collections?action=CREATE&name=gettingstarted3&numShards=1&collection.configName=_default'
如果你想为集合使用自定义配置,则首先需要上传它,然后在创建集合时按名称引用它。你可以使用 bin/solr zk
命令 或 Configsets API。
加载你自己的数据
有几种方法可以加载数据;让我们看看最常见的方法。
最常见的首次部署是在工作站或服务器上以独立模式(不在集群中)运行 Solr,在那里你有想要加载的本地数据。执行此操作的一种方法是使用单独的容器,其中包含数据的挂载卷,使用主机网络,以便你可以连接到映射的端口
# start Solr. Listens on localhost:8983
docker run --name my_solr -p 8983:8983 solr solr-precreate books
# get data
mkdir mydata
wget -O mydata/books.csv https://raw.githubusercontent.com/apache/solr/main/solr/example/exampledocs/books.csv
docker run --rm -v "$PWD/mydata:/mydata" --network=host solr post -c books /mydata/books.csv
如果你使用 示例 docker compose 集群,则相同的方法也适用,或者你可以在同一网络中启动加载容器
docker run -e SOLR_HOST=solr1 --network=mycluster_solr solr solr create_collection -c books -p 8983
docker run --rm -v "$PWD/mydata:/mydata" --network=mycluster_solr solr post -c books /mydata/books.csv -host solr1
或者,你可以在 Solr 启动时在卷上提供数据,然后从 docker exec
或自定义启动脚本加载它。
solr.in.sh 配置
在 Solr 中,通常在 solr.in.sh 中配置设置,如 环境覆盖包含文件 部分中所述。
solr.in.sh
文件可以在 /etc/default
中找到
docker run solr cat /etc/default/solr.in.sh
它有各种已注释的值,你可以在运行容器时覆盖这些值,例如
docker run -d -p 8983:8983 -e SOLR_HEAP=800m solr
您还可以挂载自己的配置文件。不要修改文件末尾设置的值。
扩展映像
Solr docker 映像具有扩展机制。在运行时,在启动 Solr 之前,容器将在 /docker-entrypoint-initdb.d/
目录中执行脚本。您可以通过使用挂载卷或使用自定义 Dockerfile 在此处添加自己的脚本。例如,这些脚本可以复制具有预加载数据的核心目录以进行持续集成测试,或修改 Solr 配置。
这是一个简单的示例。使用类似于 custom.sh
的脚本
#!/bin/bash
set -e
echo "this is running inside the container before Solr starts"
您可以运行
$ docker run --name solr_custom1 -d -v $PWD/custom.sh:/docker-entrypoint-initdb.d/custom.sh solr
$ sleep 5
$ docker logs solr_custom1 | head
/opt/docker-solr/scripts/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/set-heap.sh
this is running inside the container before Solr starts
Starting Solr on port 8983 from /opt/solr/server
使用此扩展机制,查看 docker 日志中 docker-entrypoint.sh
脚本正在执行的 shell 命令可能很有用。为此,请使用 Docker 的 -e VERBOSE=yes
设置环境变量。
当然,您可以不使用此机制,而是创建自己的脚本来进行设置,然后调用 solr-foreground
,将该脚本挂载到容器中,并在运行容器时将其作为命令执行。
扩展映像的另一种方法是创建继承自此映像的自定义 Docker 映像。
使用 jattach 调试
jcmd
、jmap
、jstack
工具可用于在容器内调试 Solr。这些工具不包含在 JRE 中,但此映像包含 jattach 实用程序,它可以让您执行很多相同操作。
Usage: jattach <pid> <cmd> [args ...] Commands: load : load agent library properties : print system properties agentProperties : print agent properties datadump : show heap and thread summary threaddump : dump all stack traces (like jstack) dumpheap : dump heap (like jmap) inspectheap : heap histogram (like jmap -histo) setflag : modify manageable VM flag printflag : print VM flag jcmd : execute jcmd command
执行线程转储并获取 PID 10
的堆信息示例命令
jattach 10 threaddump
jattach 10 jcmd GC.heap_info
从 Solr 5-7 更新到 8+
在 Solr 8 中,Solr Docker 映像已从仅提取 Solr tar 切换为使用 服务安装脚本。这样做有各种原因:使之符合 Solr 参考指南的建议,并使其更容易挂载卷。
这是一个向后不兼容的更改,这意味着如果您从较旧版本升级,则很可能需要进行一些更改。如果您不想此时升级,请将 solr:7
指定为您的容器映像。如果您使用 solr:8
,您将使用新样式。如果您仅使用 solr
,则您可能会被向后不兼容的更改绊倒;始终至少指定一个主要版本。
更改
-
Solr 数据现在存储在
/var/solr/data
中,而不是/opt/solr/server/solr
中。/opt/solr/server/solr/mycores
不再存在。 -
自定义
SOLR_HOME
不再可用,因为各种脚本都依赖于新位置。因此,INIT_SOLR_HOME
也不再受支持。
在 tini 下运行
Solr docker 镜像在 tini 下运行 Solr,以更好地处理信号;特别是,这允许你对 JVM 执行 kill -9
。如果你运行 docker run --init
,或在 docker-compose.yml
中使用 init: true
,或已将 --init
添加到 dockerd
,docker 将启动其 tini
,docker-solr 将注意到它不是 PID 1,而只是 exec
Solr。如果你不使用 --init
运行,则 docker 入口点脚本将检测到它正在作为 PID 1 运行,并将启动 docker-solr 镜像中存在的 tini
,并在其下运行 Solr。如果你真的不想运行 tini
,而只是将 Solr 作为 PID 1 运行,则可以设置 TINI=no
环境变量。
内存不足处理
有关更多信息,请参阅 内存不足处理 部分。Docker 镜像不再具有针对 OOM 的自定义逻辑。
历史
Docker-Solr 项目由 Martijn Koster 于 2015 年在 docker-solr 存储库中启动。2019 年,维护和版权转让给了 Apache Lucene/Solr 项目,2020 年该项目迁移到 Solr 项目中。非常感谢 Martijn 多年来做出的所有贡献!