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
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:
|
运行命令:
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:管理界面
- 访问Solr管理界面
- 从左侧导航菜单选择”Collections”
- 按”Add Collection”按钮
- 输入名称,选择
_default
配置集
- 按”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
| 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进行调试
jcmd
、jmap
、jstack
工具对于调试容器内的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 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
docker exec my_solr tail -f /var/solr/logs/solr.log
|
进程管理
tini进程管理器
Solr Docker镜像在tini
下运行Solr,以使信号处理工作更好;特别是,这允许您kill -9
JVM。
tini配置选项
- 使用Docker的init:
docker run --init
- Docker Compose配置:
init: true
- 禁用tini:设置
TINI=no
环境变量
内存不足处理
Docker镜像不再具有OOM的自定义逻辑。有关更多信息,请参考生产环境部署指南中的内存不足处理部分。
生产环境最佳实践
1. 资源配置
内存配置
1 2 3 4 5
| docker run -e SOLR_HEAP=4g solr
docker run --memory=8g --memory-swap=8g solr
|
CPU配置
1 2 3 4 5
| docker run --cpus=2.0 solr
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" - "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"
|
6. 备份策略
自动备份
1 2 3
| #!/bin/bash
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
| docker exec solr_container cat /proc/meminfo
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
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,从简单的开发环境到复杂的生产级集群。记住根据您的具体需求调整配置,并始终遵循安全和性能最佳实践。