DockerでのSolr

Dockerイメージの使用開始

以下の手順はsolr:8.0.0以降に適用されます。

利用可能なタグとアーキテクチャの完全なリストについては、Docker Hubページを参照してください。

利用可能なイメージ

各リリースに対して、fullとslimの2つのDockerイメージが提供されます。これらは、各Solrリリース用に生成される2つのバイナリディストリビューションに対応しています。これらのディストリビューションのDockerイメージは、次の場所にあります。

Fullディストリビューション

solr:<バージョン>

Slimディストリビューション

solr:<バージョン>-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 Dockerのクイックデモでは、Solrを起動し、"demo"というコレクションを作成し、サンプルデータをロードする単一のコマンドがあります。

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

イメージの仕組み

コンテナには、サービスインストールスクリプトでインストールされた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を参照してください。

solr-createコマンドの使用

3つ目のオプションは、solr-createコマンドを使用することです。これにより、コンテナ内でSolrがバックグラウンドで実行され、Solrコントロールスクリプトを使用してコアが作成され、Solrサーバーが停止してからフォアグラウンドで再起動されます。この方法は、Solrの二重実行が混乱を招く可能性があるため、あまり一般的ではありません。

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

カスタムセットアップスクリプト

最後に、独自のコマンドラインを実行して、実行する内容を指定したり、マウントされたスクリプトを呼び出したりすることもできます。たとえば、次のようにします。

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"

コレクションの作成

「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を使用したデバッグ

jcmdjmapjstackツールは、コンテナ内の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.ymlinit: 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に感謝します!