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 集群吗?

是的。您可以简单地以“云模式”启动 Solr 容器,将其指向 Zookeeper 集群

对于本地开发,使用单个 zookeeper 容器就足够了。请查阅 Zookeeper docker 镜像 了解详细信息。

对于生产目的,我们不鼓励您自行进行 Zookeeper 编排,因为其中存在许多陷阱。相反,请使用支持 Solr 和 Zookeeper 的完善的容器编排器。对于 Kubernetes,我们提供了 Solr Operator 子项目。还有第三方 Helm 图表可用。

如何使用 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" 是镜像的名称,并且没有特定的命令,因此镜像默认运行 "solr" 命令,并使用 "-f" 参数在前台运行。

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

docker run -it solr -h myhostname

这与前一个相同,但传递了一个额外的参数。镜像将运行 "solr" 命令,并带有 "-f -h myhostname" 参数。

将 solr 作为任意命令运行

docker run -it solr solr zk --help

这里第一个 "solr" 是镜像名称,第二个 "solr" 是 "solr" 命令。镜像按照指定的精确运行命令;不会隐式添加 "-f"。容器将打印帮助文本并退出。

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

docker run -it solr bin/solr start -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"