Docker 中的 Solr

开始使用 Docker 镜像

以下说明适用于 solr:8.0.0 及更高版本。

请参阅 Docker Hub 页面,以获取可用的完整标签和架构列表。

可用镜像

为每个版本提供了两个 docker 镜像,完整版和精简版。它们对应于为每个 Solr 版本生成的两个二进制发行版。可以在以下位置找到这些发行版的 docker 镜像

完整发行版

solr:<version>

精简发行版

solr:<version>-slim

有关每个发行版的更多信息,请参阅 可用 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”核心,然后选择“查询”菜单项。这会为您提供对 : 的默认搜索,它将返回所有文档。点击“执行查询”按钮,您应该会看到一些包含数据的文档。恭喜!

Docker Compose

您可以使用 Docker Compose 运行一个独立的服务器或多节点集群。您可以使用 Docker 卷而不是主机挂载目录。例如,使用包含以下内容的 docker-compose.yml

version: '3'
services:
  solr:
    image: solr
    ports:
     - "8983:8983"
    volumes:
      - data:/var/solr
    command:
      - solr-precreate
      - gettingstarted
volumes:
  data:

您可以简单地运行

docker-compose up -d

单命令演示

对于 Solr Docker 的快速演示,有一个命令可以启动 Solr,创建一个名为“demo”的集合,并将示例数据加载到其中

docker run --name solr_demo -d -p 8983:8983 solr solr-demo

映像的工作原理

容器包含一个 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

使用 solr-create 命令

第三个选项是使用 solr-create 命令。这在容器中后台运行 Solr,然后使用 Solr 控制脚本创建核心,然后停止 Solr 服务器并在前台重新启动它。此方法不太流行,因为双重 Solr 运行可能会令人困惑。

docker run -d -p 8983:8983 --name my_solr solr solr-create -c gettingstarted

自定义设置脚本

最后,您可以运行自己的命令行并指定要执行的操作,甚至调用挂载的脚本。例如

docker run -p 8983:8983 -v $PWD/mysetup.sh:/mysetup.sh --name my_solr solr bash -c "precreate-core gettingstarted && source /mysetup.sh && solr-foreground"

创建集合

在“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 调试

jcmdjmapjstack 工具可用于在容器内调试 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 多年来做出的所有贡献!