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"