Solr Docker 常见问题解答

如何保留 Solr 数据和配置?

Solr 的 Docker 映像预先配置为将容器路径 /var/solr/ 作为 。这意味着即使您删除容器实例,所有索引数据、日志文件和其他变量数据都将保留在 Docker 主机上。

如何将主机目录挂载为数据卷?

默认情况下,Solr 的卷保留在 Docker 在主机上的默认存储位置。在 Linux 系统上,此位置为 /var/lib/docker/volumes。这是存储 Solr 数据的推荐方式。您还可以灵活地使用绑定挂载主机文件夹

docker run --rm -p 8983:8983 -v $(pwd)/myData:/var/solr/ solr:9-slim

但这既取决于主机操作系统,也可能遇到不同类型的文件系统权限问题。

我可以将卷与 SOLR_HOME 一起使用吗?

虽然您可以在容器内重新定义 SOLR_HOME,但我们建议您使用在 /var/solr/ 定义的现有 SOLR_HOME,请参见上文。您可以为卷指定一个有意义的名称,而不是自动生成的哈希值,例如名称 solrData

docker run --rm -p 8983:8983 -v solrData:/mysolrhome solr:9-slim

我可以在 Docker 下运行 ZooKeeper 和 Solr 集群吗?

在网络级别,ZooKeeper 节点需要能够相互通信,而 Solr 节点需要能够与 ZooKeeper 节点和彼此通信。在应用程序级别,不同的节点需要能够识别和定位彼此。在 ZooKeeper 中,这是通过列出每个节点的主机名或 IP 地址的配置文件来完成的。在 Solr 中,这是通过指定主机或 IP 地址的参数来完成的,然后该参数存储在 ZooKeeper 中。

在典型的集群中,这些主机名/IP 地址是预先定义的,并且在集群的整个生命周期中保持静态。在 Docker 中,容器间通信和多主机网络可以通过 Docker 网络 来实现。但是,至关重要的是,Docker 通常不保证容器的 IP 地址在容器的生命周期中保持静态。在非网络化 Docker 中,IP 地址似乎在每次停止/启动时都会改变。在网络化 Docker 中,容器可能会在某些启动/停止序列中丢失其 IP 地址,除非您采取措施来防止这种情况。

IP 更改会导致问题

  • 如果您在配置中使用硬编码 IP 地址,并且容器的地址在停止/启动后发生更改,那么您的集群将停止工作,并且可能会损坏自身。

  • 如果您在配置中使用主机名,并且容器的地址发生更改,那么您可能会遇到缓存的主机名查找问题。

  • 如果您使用主机名,那么还有另一个问题:名称在各自的容器运行之前未定义。因此,例如当第一个 ZooKeeper 节点启动时,它将尝试查找其他节点的主机名,这将失败。这对于 ZooKeeper 3.4.6 来说尤其是个问题;未来的版本在恢复方面做得更好。

Docker 1.10 有一个新的 --ip 配置选项,允许您为容器指定一个 IP 地址。它还有一个 --ip-range 选项,允许您指定其他容器获取地址的范围。结合使用,您可以实现静态地址。有关更多信息,请参阅 Solr 和 ZooKeeper 与 Docker 网络

如何使用 Docker Compose 运行 ZooKeeper 和 Solr?

请参阅 docker compose 示例

如何在 Solr 启动时消除“共享内存”警告?

在启动 docker 映像时,您通常会看到这些日志行

OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory. (error = 1)

如果你的设置可以在不使用大页面或不需要大页面时运行,那么通过环境变量禁用 JVM 中的大页面分页是消除此警告的最轻松的方式

SOLR_OPTS=-XX:-UseLargePages

在你的 Solr 管理员 UI 中,你将在 JVM 参数下看到由 GC_TUNE 环境变量设置的原始 -XX:+UseLargePages,以及在列表中更靠下的覆盖 -XX:-UseLargePages 参数。

我对 Solr 的不同调用感到困惑——求助?

Solr docker 映像的不同调用看起来可能会令人困惑,因为该映像的名称是“solr”,而 Solr 命令也是“solr”,并且该映像以特殊方式解释各种参数。我们来说明一下各种调用

在映像中运行任意命令

docker run -it solr date

此处“solr”是映像的名称,“date”是命令。这不会调用任何 Solr 功能。

运行 Solr 服务器

docker run -it solr

此处“solr”是映像的名称,并且没有特定命令,因此该映像默认使用“-f”运行“solr”命令,以在前台运行它。

使用额外参数运行 Solr 服务器

docker run -it solr -h myhostname

这与前一个相同,但传递了一个附加参数。该映像将使用“-f -h myhostname”运行“solr”命令。

以任意命令运行 solr

docker run -it solr solr zk --help

此处第一个“solr”是映像名称,第二个“solr”是“solr”命令。该映像完全按照指定的方式运行该命令;不会隐式添加“-f”。该容器将打印帮助文本并退出。

如果你觉得这在视觉上令人困惑,那么使用更具体的映像标记和特定的命令路径可能会有所帮助。例如

docker run -it solr bin/solr -f -h myhostname

最后,Solr docker 映像提供了在调用 Solr 服务器之前执行一些工作的几个命令,例如“solr-precreate”和“solr-demo”。请参阅 README.md 以了解用法。这些命令由 docker-entrypoint.sh 脚本实现,并且必须作为第一个参数传递给映像。例如

docker run -it solr solr-demo

在此处了解实现细节非常重要。Dockerfile 使用 solr-foreground 作为 CMD,而 docker-entrypoint.sh 通过运行“solr -f”来实现它。因此,这两个是等效的

docker run -it solr
docker run -it solr solr-foreground

docker run -it solr solr -f

略有不同:“solr”是一个通用命令,docker-entrypoint.sh 不会以任何特殊方式处理它。具体来说,这意味着不会应用 docker-entrypoint-initdb.d 机制。因此,如果你想使用 docker-entrypoint-initdb.d,则必须使用其他两个调用之一。当你希望从 bash 命令调用 solr 时,也需要记住这一点。例如,这不会运行 docker-entrypoint-initdb.d 脚本

docker run -it -v $PWD/set-heap.sh:/docker-entrypoint-initdb.d/set-heap.sh \
    solr bash -c "echo hello; solr -f"

但这个会

docker run -it $PWD/set-heap.sh:/docker-entrypoint-initdb.d/set-heap.sh \
    solr bash -c "echo hello; /opt/docker-solr/scripts/docker-entrypoint.sh solr-foreground"