Solr部署:Docker容器化部署完整指南

Solr部署:Docker容器化部署完整指南

Docker容器化技术为Apache Solr提供了便捷、可扩展、易管理的部署方式。本文将全面介绍如何在Docker环境中部署和管理Solr,从简单的单机部署到复杂的生产级集群配置。

Docker镜像概述

支持版本

以下说明适用于solr:8.0.0及更高版本。完整的标签和架构列表请参考Docker Hub页面

可用镜像类型

每个Solr版本发布时都提供两种Docker镜像,分别对应完整版和精简版的二进制发行包:

镜像类型 镜像标签 特点
完整版 solr:<version> 包含所有功能和依赖,适合开发和功能完整的生产环境
精简版 solr:<version>-slim 体积较小,移除了某些可选组件,适合资源受限的环境

有关每种发行版的详细信息,请参考可用Solr包部分。

快速入门

主机挂载目录运行Solr

通常用户首先希望在容器中运行单个独立的Solr服务器,使用单个核心存储数据,同时将数据存储在本地目录中。这是开发人员的便利机制,也可用于单服务器生产主机。

1
2
3
4
5
# 创建数据目录
mkdir solrdata

# 启动Solr容器并创建核心
docker run -d -v "$PWD/solrdata:/var/solr" -p 8983:8983 --name my_solr solr solr-precreate gettingstarted

通过Web浏览器访问http://localhost:8983/查看Solr的管理界面(根据您的Docker主机调整主机名)。在界面中,点击”Core Admin”应该能看到”gettingstarted”核心。

加载示例数据

加载容器中包含的一些示例数据:

1
docker exec -it my_solr solr post -c gettingstarted example/exampledocs/manufacturers.xml

在管理界面中,找到”Core selector”弹出菜单并选择”gettingstarted”核心,然后选择”Query”菜单项。这将为您提供默认的*:*搜索,返回所有文档。点击”Execute Query”按钮,您应该看到包含数据的几个文档。

单命令演示

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

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

Docker Compose配置

单机服务配置

您可以使用Docker Compose运行单个独立服务器或多节点集群,也可以使用Docker卷而不是主机挂载目录。

docker-compose.yml示例:

1
2
3
4
5
6
7
8
9
10
11
12
services:
solr:
image: solr
ports:
- "8983:8983"
volumes:
- data:/var/solr
command:
- solr-precreate
- gettingstarted
volumes:
data:

运行命令:

1
docker compose up -d

SolrCloud集群配置

以下是启动带有ZooKeeper的SolrCloud集群的compose文件示例。通过创建Docker网络,Solr可以通过内部名称zoo访问ZooKeeper容器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
solr:
image: solr:9-slim
ports:
- "8983:8983"
networks: [search]
environment:
ZK_HOST: "zoo:2181"
depends_on: [zoo]

zoo:
image: zookeeper:3.9
networks: [search]
environment:
ZOO_4LW_COMMANDS_WHITELIST: "mntr,conf,ruok"

networks:
search:
driver: bridge

多节点SolrCloud集群

对于生产环境,通常需要多个Solr节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
services:
zoo:
image: zookeeper:3.9
environment:
ZOO_4LW_COMMANDS_WHITELIST: "mntr,conf,ruok"
networks: [search]

solr1:
image: solr:9-slim
ports:
- "8983:8983"
environment:
ZK_HOST: "zoo:2181"
networks: [search]
depends_on: [zoo]
volumes:
- solr1_data:/var/solr

solr2:
image: solr:9-slim
ports:
- "8984:8983"
environment:
ZK_HOST: "zoo:2181"
networks: [search]
depends_on: [zoo]
volumes:
- solr2_data:/var/solr

solr3:
image: solr:9-slim
ports:
- "8985:8983"
environment:
ZK_HOST: "zoo:2181"
networks: [search]
depends_on: [zoo]
volumes:
- solr3_data:/var/solr

volumes:
solr1_data:
solr2_data:
solr3_data:

networks:
search:
driver: bridge

镜像工作原理

目录结构

容器包含由服务安装脚本安装的Solr安装。存储结构如下:

  • Solr发行版位置/opt/solr
  • 数据和日志目录/var/solr
  • 配置文件/etc/default/solr

数据持久化

如果要持久化数据,请在/var/solr上挂载卷或目录。Solr在/var/solr中需要一些文件和目录;如果使用自己的目录或卷,可以预先填充它们,或让Solr Docker为您复制它们。

自定义配置

如果要使用自定义配置,请将其挂载到适当的位置。

Docker脚本

Solr Docker发行版在/opt/solr/docker/scripts中添加了脚本,使其在Docker下更易于使用,例如在容器启动时创建核心。

集合管理

SolrCloud集合创建

在”SolrCloud”集群中,您创建”集合”来存储数据。有多种创建集合的方法:

方法1:管理界面

  1. 访问Solr管理界面
  2. 从左侧导航菜单选择”Collections”
  3. 按”Add Collection”按钮
  4. 输入名称,选择_default配置集
  5. 按”Add Collection”按钮

方法2:控制脚本

1
docker exec solr1 solr create -c gettingstarted2

方法3:独立容器

1
docker run -e SOLR_HOST=solr1 --network docs_solr solr solr create -c gettingstarted3 -p 8983

方法4:远程API

1
curl 'http://localhost:8983/solr/admin/collections?action=CREATE&name=gettingstarted3&numShards=1&collection.configName=_default'

自定义配置集

如果要为集合使用自定义配置,首先需要上传它,然后在创建集合时按名称引用它。可以使用bin/solr zk命令或Configsets API。

核心管理

独立模式核心创建

当Solr在独立模式下运行时,您创建”核心”来存储数据。有多种创建方法:

方法1:手动创建

1
2
3
4
5
# 启动容器
docker run -d -p 8983:8983 --name my_solr solr

# 手动创建核心
docker exec -it my_solr solr create_core -c gettingstarted

这种方法不太方便,并且使转换为Docker Compose和Kubernetes等编排工具的配置变得更困难。

方法2:使用solr-precreate命令(推荐)

1
docker run -d -p 8983:8983 --name my_solr solr solr-precreate gettingstarted

solr-precreate命令可以接受可选的额外参数来指定/opt/solr/server/solr/configsets/下的配置集目录,或者可以指定容器内自定义配置集的完整路径:

1
2
3
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

注意:指定配置集的完整路径时,实际核心配置应位于该目录内的conf目录中。

方法3:使用solr-create命令

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

此命令在容器中后台运行Solr,然后使用Solr控制脚本创建核心,接着停止Solr服务器并在前台重新启动它。这种方法较不受欢迎,因为双重Solr运行可能会令人困惑。

方法4:自定义设置脚本

1
2
3
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"

数据加载

使用独立容器加载数据

最常见的首次部署是在工作站或服务器上独立运行Solr(不在集群中),您有本地数据希望加载。一种方法是使用单独的容器,挂载包含数据的卷,使用主机网络连接到映射端口:

1
2
3
4
5
6
7
8
9
10
# 启动Solr,监听localhost:8983
docker run --name my_solr -p 8983:8983 solr solr-precreate books

# 获取数据
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 solr post -c books /mydata/books.csv

在集群网络中加载数据

对于Docker Compose集群,可以在同一网络中启动加载容器:

1
2
3
4
5
6
7
# 创建集合
docker run -e SOLR_HOST=solr1 --network=mycluster_solr \
solr solr create -c books -p 8983

# 加载数据
docker run --rm -v "$PWD/mydata:/mydata" --network=mycluster_solr \
solr solr post -c books /mydata/books.csv --host solr1

启动时数据加载

或者,您可以在Solr启动时通过卷使数据可用,然后从docker exec或自定义启动脚本加载它。

配置管理

solr.in.sh配置

在Solr中,通常在solr.in.sh中配置设置。Docker镜像中的solr.in.sh文件位于/etc/default

1
2
# 查看默认配置
docker run solr cat /etc/default/solr.in.sh

环境变量覆盖

可以在运行容器时覆盖配置值:

1
docker run -d -p 8983:8983 -e SOLR_HEAP=800m solr

挂载自定义配置文件

也可以挂载自己的配置文件,但不要修改文件末尾设置的值:

1
2
3
docker run -d -p 8983:8983 \
-v $PWD/custom-solr.in.sh:/etc/default/solr.in.sh \
solr

扩展镜像

扩展机制

Solr Docker镜像具有扩展机制。在运行时,在启动Solr之前,容器将执行/docker-entrypoint-initdb.d/目录中的脚本。

添加自定义脚本

您可以通过挂载卷或使用自定义Dockerfile在那里添加自己的脚本:

1
2
3
#!/bin/bash
set -e
echo "this is running inside the container before Solr starts"

运行示例:

1
2
docker run --name solr_custom1 -d \
-v $PWD/custom.sh:/docker-entrypoint-initdb.d/custom.sh solr

调试选项

要查看docker-entrypoint.sh脚本执行的shell命令,可以设置环境变量:

1
docker run -e VERBOSE=yes solr

自定义Docker镜像

其他扩展镜像的方法是创建从此镜像继承的自定义Docker镜像:

1
2
3
4
5
6
7
8
9
10
FROM solr:9-slim

# 添加自定义配置
COPY custom-config/ /opt/solr/server/solr/configsets/mycustomconfig/

# 添加初始化脚本
COPY init-script.sh /docker-entrypoint-initdb.d/

# 设置环境变量
ENV SOLR_HEAP=2g

调试和故障排除

使用jattach进行调试

jcmdjmapjstack工具对于调试容器内的Solr很有用。这些工具不包含在JRE中,但此镜像包含jattach实用程序,可让您完成大部分相同的工作。

jattach使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
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

查找Solr进程ID

1
ps -ef | grep java

调试命令示例

1
2
3
4
5
# 线程转储
jattach 10 threaddump

# 堆信息
jattach 10 jcmd GC.heap_info

日志查看

1
2
3
4
5
6
7
8
# 查看容器日志
docker logs my_solr

# 实时跟踪日志
docker logs -f my_solr

# 查看Solr应用日志
docker exec my_solr tail -f /var/solr/logs/solr.log

进程管理

tini进程管理器

Solr Docker镜像在tini下运行Solr,以使信号处理工作更好;特别是,这允许您kill -9 JVM。

tini配置选项

  1. 使用Docker的initdocker run --init
  2. Docker Compose配置init: true
  3. 禁用tini:设置TINI=no环境变量

内存不足处理

Docker镜像不再具有OOM的自定义逻辑。有关更多信息,请参考生产环境部署指南中的内存不足处理部分。

生产环境最佳实践

1. 资源配置

内存配置

1
2
3
4
5
# 设置JVM堆内存
docker run -e SOLR_HEAP=4g solr

# 设置容器内存限制
docker run --memory=8g --memory-swap=8g solr

CPU配置

1
2
3
4
5
# 设置CPU限制
docker run --cpus=2.0 solr

# 设置CPU亲和性
docker run --cpuset-cpus="0,1" solr

2. 存储配置

数据持久化

1
2
3
4
5
6
7
8
9
10
11
12
services:
solr:
image: solr:9-slim
volumes:
- solr_data:/var/solr
- solr_logs:/var/solr/logs

volumes:
solr_data:
driver: local
solr_logs:
driver: local

性能存储

1
2
3
4
5
6
7
volumes:
solr_data:
driver: local
driver_opts:
type: none
o: bind
device: /fast-ssd/solr-data

3. 网络配置

端口映射

1
2
3
4
5
services:
solr1:
ports:
- "8983:8983" # HTTP端口
- "7983:7983" # 停止端口

服务发现

1
2
3
4
5
6
7
8
9
10
11
services:
solr:
networks:
- solr_network
environment:
SOLR_HOST: ${HOSTNAME}

networks:
solr_network:
driver: overlay
attachable: true

4. 安全配置

SSL/TLS配置

1
2
3
4
5
6
7
8
services:
solr:
environment:
SOLR_SSL_ENABLED: "true"
SOLR_SSL_KEY_STORE: "/var/solr/ssl/solr-ssl.keystore.p12"
SOLR_SSL_KEY_STORE_PASSWORD: "secret"
volumes:
- ./ssl:/var/solr/ssl:ro

访问控制

1
2
3
4
services:
solr:
environment:
SOLR_IP_ALLOWLIST: "10.0.0.0/8,192.168.0.0/16"

5. 监控配置

健康检查

1
2
3
4
5
6
7
8
services:
solr:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8983/solr/admin/info/system"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s

指标导出

1
2
3
4
5
6
services:
solr:
environment:
ENABLE_REMOTE_JMX_OPTS: "true"
ports:
- "18983:18983" # JMX端口

6. 备份策略

自动备份

1
2
3
#!/bin/bash
# backup-script.sh
docker exec solr1 solr post -c collection1 -params "action=BACKUP&name=backup_$(date +%Y%m%d_%H%M%S)&location=/var/solr/backups"

备份卷配置

1
2
3
4
5
6
7
8
9
10
11
12
services:
solr:
volumes:
- backup_storage:/var/solr/backups

volumes:
backup_storage:
driver: local
driver_opts:
type: nfs
o: addr=backup-server,rw
device: :/backup/solr

7. 升级策略

滚动更新

1
2
3
4
5
6
7
8
9
10
11
services:
solr:
image: solr:${SOLR_VERSION:-9-slim}
deploy:
update_config:
parallelism: 1
delay: 30s
failure_action: rollback
rollback_config:
parallelism: 1
delay: 30s

故障排除指南

常见问题

1. 容器启动失败

1
2
3
4
5
6
7
8
# 检查日志
docker logs container_name

# 检查资源使用
docker stats container_name

# 检查文件权限
docker exec container_name ls -la /var/solr

2. 内存问题

1
2
3
4
5
# 查看JVM内存配置
docker exec solr_container cat /proc/meminfo

# 查看Solr堆使用
docker exec solr_container jattach 1 jcmd GC.heap_info

3. 网络连接问题

1
2
3
4
5
6
# 检查端口绑定
docker port container_name

# 检查网络配置
docker network ls
docker network inspect network_name

性能调优

JVM参数优化

1
2
3
4
5
# 垃圾收集器配置
docker run -e GC_TUNE="-XX:+UseG1GC -XX:MaxGCPauseMillis=200" solr

# JVM启动参数
docker run -e SOLR_OPTS="-Dsolr.autoSoftCommit.maxTime=10000" solr

系统参数调优

1
2
3
4
5
# 文件句柄限制
docker run --ulimit nofile=65536:65536 solr

# 内存映射限制
sysctl vm.max_map_count=262144

历史和发展

Docker-Solr项目由Martijn Koster在2015年在docker-solr仓库中启动。2019年维护权和版权转移给Apache Lucene/Solr项目,2020年项目迁移到Solr项目内。感谢Martijn多年来的贡献!

通过本指南,您应该能够成功地在Docker环境中部署和管理Apache Solr,从简单的开发环境到复杂的生产级集群。记住根据您的具体需求调整配置,并始终遵循安全和性能最佳实践。

© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero