DockerでのSolr
Dockerイメージの使用開始
以下の手順はsolr:8.0.0
以降に適用されます。
利用可能なタグとアーキテクチャの完全なリストについては、Docker Hubページを参照してください。
利用可能なイメージ
各リリースに対して、fullとslimの2つのDockerイメージが提供されます。これらは、各Solrリリース用に生成される2つのバイナリディストリビューションに対応しています。これらのディストリビューションのDockerイメージは、次の場所にあります。
Fullディストリビューション |
|
Slimディストリビューション |
|
各ディストリビューションの詳細については、利用可能なSolrパッケージセクションを参照してください。
ホストマウントされたディレクトリでSolrを実行する
通常、ユーザーは最初に、ローカルディレクトリにデータを保存しながら、データ用の単一のコアを持つコンテナ内で単一のスタンドアロンSolrサーバーを実行することを望みます。これは開発者にとって便利なメカニズムであり、シングルサーバーの本番ホストにも使用できます。
mkdir solrdata
docker run -d -v "$PWD/solrdata:/var/solr" -p 8983:8983 --name my_solr solr solr-precreate gettingstarted
次に、Webブラウザでhttps://:8983/
にアクセスして、Solrの管理UIを表示します(Dockerホストのホスト名を調整します)。UIで、[コア管理]をクリックすると、[gettingstarted]コアが表示されるはずです。
次に、コンテナに含まれているサンプルデータの一部をロードします。
docker exec -it my_solr post -c gettingstarted example/exampledocs/manufacturers.xml
UIで、[コアセレクター]ポップアップメニューを見つけて、[gettingstarted]コアを選択し、[クエリ]メニュー項目を選択します。これにより、すべてのドキュメントを返す:
のデフォルト検索が表示されます。[クエリの実行]ボタンを押すと、いくつかのデータを含むドキュメントが表示されるはずです。おめでとうございます!
Docker Compose
Docker Composeを使用すると、単一のスタンドアロンサーバーまたはマルチノードクラスターを実行できます。また、ホストマウントされたディレクトリの代わりにDockerボリュームを使用することもできます。たとえば、次の内容を含むdocker-compose.yml
を使用します。
version: '3'
services:
solr:
image: solr
ports:
- "8983:8983"
volumes:
- data:/var/solr
command:
- solr-precreate
- gettingstarted
volumes:
data:
実行するだけです。
docker-compose up -d
イメージの仕組み
コンテナには、サービスインストールスクリプトでインストールされたSolrのインストールが含まれています。これは、Solrディストリビューションを/opt/solr
に保存し、/etc/default/solr
ファイルを使用してSolrが/var/solr
を使用してデータとログを保存するように構成します。データを永続化する場合は、/var/solr
にボリュームまたはディレクトリをマウントします。Solrは/var/solr
にいくつかのファイルとディレクトリがあることを想定しています。独自のディレクトリまたはボリュームを使用する場合は、それらを事前に設定するか、Solr Dockerにコピーさせることができます。カスタム構成を使用する場合は、適切な場所にマウントします。例については、以下を参照してください。
SolrのDockerディストリビューションでは、コンテナ起動時にコアを作成するなど、Dockerでの使用を容易にするためのスクリプトが/opt/solr/docker/scripts
に追加されています。
コアの作成
Solrがスタンドアロンモードで実行されている場合、データを格納するための「コア」を作成します。Dockerを使用しないSolrでは、サーバーをバックグラウンドで実行し、Solrコントロールスクリプトを使用してコアを作成し、データをロードします。Solr Dockerでは、さまざまなオプションがあります。
手動
1つ目の方法はまったく同じです。コンテナ内でSolrを実行し、同じコンテナ内でコントロールスクリプトを手動で実行します。
docker run -d -p 8983:8983 --name my_solr solr
docker exec -it my_solr solr create_core -c gettingstarted
これはユーザーにとってあまり便利ではなく、Docker ComposeやKubernetesのようなオーケストレーションツール用の構成に変換するのが難しくなります。
solr-precreateコマンドの使用
そのため、通常はsolr-precreate
コマンドを使用して、指定されたコアを準備してからSolrを実行します。
docker run -d -p 8983:8983 --name my_solr solr solr-precreate gettingstarted
solr-precreate
コマンドは、オプションで/opt/solr/server/solr/configsets/
以下のconfigsetディレクトリを指定する追加の引数を受け取ることができます。または、コンテナ内のカスタムconfigsetへのフルパスを指定することもできます。
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
注意: configsetへのフルパスを指定する場合、実際のコア構成は、そのディレクトリ内のconf
ディレクトリに配置する必要があります。詳細については、Configsetsを参照してください。
コレクションの作成
「SolrCloud」クラスターでは、データを格納するための「コレクション」を作成します。ここでも、コアを作成するためのいくつかのオプションがあります。
これらの例では、docker composeクラスターを実行していることを前提としています。
コレクションを作成する最初の方法は、Solr管理UIに移動し、左側のナビゲーションメニューから「コレクション」を選択し、「コレクションを追加」ボタンを押して名前を付け、_default
構成セットを選択し、「コレクションを追加」ボタンを押すことです。
2つ目の方法は、いずれかのコンテナのSolrコントロールスクリプトを使用することです。
docker exec solr1 solr create -c gettingstarted2
3つ目の方法は、別のコンテナを使用することです。
docker run -e SOLR_HOST=solr1 --network docs_solr solr solr create_collection -c gettingstarted3 -p 8983
4つ目の方法は、ホストまたはコンテナのいずれかから、または同じネットワーク上の新しいコンテナからリモートAPIを使用することです(ホスト名を適宜調整してください)。
curl 'https://:8983/solr/admin/collections?action=CREATE&name=gettingstarted3&numShards=1&collection.configName=_default'
コレクションにカスタム構成を使用する場合は、最初にそれをアップロードしてから、コレクションを作成するときに名前で参照する必要があります。bin/solr zk
コマンドまたはConfigsets APIを使用できます。
独自のデータのロード
データをロードする方法はいくつかあります。最も一般的な方法を見てみましょう。
最も一般的な最初のデプロイメントは、ワークステーションまたはサーバー上でSolrをスタンドアロン(クラスターではない)で実行することです。ここでは、ロードしたいローカルデータがあります。その方法の1つは、データを格納したマウントボリュームを使用して、別のコンテナを使用し、マップされたポートに接続できるようにホストネットワークを使用することです。
# start Solr. Listens on localhost:8983
docker run --name my_solr -p 8983:8983 solr solr-precreate books
# get data
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 post -c books /mydata/books.csv
docker composeクラスターの例を使用する場合も同じように動作します。または、同じネットワークでロードコンテナを起動することもできます。
docker run -e SOLR_HOST=solr1 --network=mycluster_solr solr solr create_collection -c books -p 8983
docker run --rm -v "$PWD/mydata:/mydata" --network=mycluster_solr solr post -c books /mydata/books.csv -host solr1
あるいは、Solrの起動時にボリュームでデータを利用可能にしてから、docker exec
またはカスタム起動スクリプトからロードすることもできます。
solr.in.sh構成
Solrでは、solr.in.shで設定を構成するのが一般的です。環境変数による設定のオーバーライドと include ファイルセクションで説明されています。
solr.in.sh
ファイルは、/etc/default
にあります。
docker run solr cat /etc/default/solr.in.sh
コンテナの実行時にオーバーライドできる、コメントアウトされたさまざまな値があります。
docker run -d -p 8983:8983 -e SOLR_HEAP=800m solr
独自の構成ファイルをマウントすることもできます。ファイルの最後に設定されている値は変更しないでください。
イメージの拡張
Solr Dockerイメージには、拡張メカニズムがあります。実行時に、Solrを起動する前に、コンテナは/docker-entrypoint-initdb.d/
ディレクトリ内のスクリプトを実行します。マウントされたボリュームを使用するか、カスタムDockerfileを使用して、独自のスクリプトを追加できます。これらのスクリプトでは、たとえば、継続的インテグレーションテスト用の事前ロードされたデータを含むコアディレクトリをコピーしたり、Solr構成を変更したりできます。
簡単な例を次に示します。次のようなcustom.sh
スクリプトを使用します。
#!/bin/bash
set -e
echo "this is running inside the container before Solr starts"
次のように実行できます。
$ docker run --name solr_custom1 -d -v $PWD/custom.sh:/docker-entrypoint-initdb.d/custom.sh solr
$ sleep 5
$ docker logs solr_custom1 | head
/opt/docker-solr/scripts/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/set-heap.sh
this is running inside the container before Solr starts
Starting Solr on port 8983 from /opt/solr/server
この拡張メカニズムを使用すると、Dockerログでdocker-entrypoint.sh
スクリプトによって実行されているシェルコマンドを確認すると便利です。そのためには、Dockerの-e VERBOSE=yes
を使用して環境変数を設定します。
このメカニズムを使用する代わりに、セットアップを実行してからsolr-foreground
を呼び出す独自のスクリプトを作成し、そのスクリプトをコンテナにマウントして、コンテナの実行時にコマンドとして実行することもできます。
イメージを拡張するその他の方法としては、このイメージを継承したカスタムDockerイメージを作成することがあります。
jattachを使用したデバッグ
jcmd
、jmap
、jstack
ツールは、コンテナ内のSolrをデバッグするのに役立ちます。これらのツールはJREには含まれていませんが、このイメージには、同じようなことを多く実行できるjattachユーティリティが含まれています。
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
PID 10
のスレッドダンプを実行してヒープ情報を取得するコマンドの例を次に示します。
jattach 10 threaddump
jattach 10 jcmd GC.heap_info
Solr 5-7から8以降への更新
Solr 8では、Solr Dockerイメージは、Solr tarを単に抽出するだけでなく、サービスインストールスクリプトを使用するように切り替えました。これは、Solr Ref Guideによる推奨事項に沿って、ボリュームのマウントを容易にするなど、さまざまな理由で行われました。
これは後方互換性のない変更であり、古いバージョンからアップグレードする場合は、おそらくいくつかの変更を行う必要があることを意味します。現時点でアップグレードしたくない場合は、コンテナイメージとしてsolr:7
を指定してください。solr:8
を使用すると、新しいスタイルが使用されます。solr
のみを使用すると、後方互換性のない変更によってつまずくリスクがあります。常に少なくともメジャーバージョンを指定してください。
変更点
-
Solrデータは、
/opt/solr/server/solr
ではなく/var/solr/data
に保存されるようになりました。/opt/solr/server/solr/mycores
はもう存在しません。 -
新しい場所ではさまざまなスクリプトが依存しているため、カスタムの
SOLR_HOME
は使用できなくなりました。その結果、INIT_SOLR_HOME
もサポートされなくなりました。
tini下での実行
Solr Dockerイメージは、tiniの下でSolrを実行し、シグナル処理をより適切に機能させます。特に、これによりJVMをkill -9
できます。docker run --init
を実行するか、docker-compose.yml
でinit: true
を使用するか、dockerd
に--init
を追加した場合、dockerはそのtini
を起動し、docker-solrはPID 1ではないことに気づき、Solrをexec
するだけです。--init
を実行しない場合、dockerエントリポイントスクリプトはPID 1として実行されていることを検出し、docker-solrイメージに存在するtini
を起動し、その下でSolrを実行します。本当にtini
を実行したくない場合は、代わりにSolrをPID 1として実行する場合は、TINI=no
環境変数を設定できます。
メモリ不足の処理
詳細については、メモリ不足の処理セクションを参照してください。Dockerイメージには、OOM用のカスタムロジックはなくなりました。
履歴
Docker-Solrプロジェクトは、2015年にMartijn Kosterによってdocker-solrリポジトリで開始されました。2019年に、保守管理と著作権がApache Lucene/Solrプロジェクトに移管され、2020年にプロジェクトはSolrプロジェクト内でライブに移行しました。長年にわたるすべての貢献にMartijnに感謝します!