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"