Solr Docker FAQ

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オプションも追加されました。これらを組み合わせて使用することで、静的アドレスを実装できます。詳細はDockerネットワークを使用したSolrとZooKeeperを参照してください。

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では、GC_TUNE環境変数によって設定された元の-XX:+UseLargePagesと、その下位にある上書き-XX:-UseLargePages引数の両方がJVM引数としてリスト表示されます。

Solrの異なる呼び出し方法について混乱しています。ヘルプをお願いします。

Solr Dockerイメージの異なる呼び出し方法は、イメージ名が「solr」で、Solrコマンドも「solr」であり、イメージがさまざまな引数を特別な方法で解釈するため、混乱を招く可能性があります。さまざまな呼び出し方法を説明しましょう。

イメージ内で任意のコマンドを実行するには

docker run -it solr date

ここで、「solr」はイメージの名前、「date」はコマンドです。これは、Solrの機能を呼び出しません。

Solrサーバーを実行するには

docker run -it solr

ここでは、「solr」はイメージの名前であり、特定のコマンドがないため、イメージはデフォルトで「solr」コマンドを「-f」と共に実行してフォアグラウンドで実行します。

追加の引数を使用してSolrサーバーを実行するには

docker run -it solr -h myhostname

これは前述のものと同じですが、追加の引数が渡されます。イメージは「solr」コマンドを「-f -h myhostname」と共に実行します。

任意のコマンドとしてsolrを実行するには

docker run -it solr solr zk --help

ここでは、最初の「solr」はイメージ名、2番目の「solr」は「solr」コマンドです。イメージは指定されたとおりにコマンドを実行します。「-f」は暗黙的に追加されません。コンテナはヘルプテキストを出力して終了します。

視覚的に分かりにくい場合は、より具体的なイメージタグと具体的なコマンドパスを使用すると役立つ場合があります。たとえば

docker run -it solr bin/solr -f -h myhostname

最後に、Solr Dockerイメージは、"solr-precreate"や"solr-demo"など、Solrサーバーを呼び出す前にいくつかの作業を行ういくつかのコマンドを提供しています。使用方法については、README.mdを参照してください。これらはdocker-entrypoint.shスクリプトによって実装されており、イメージへの最初の引数として渡す必要があります。たとえば

docker run -it solr solr-demo

ここで重要な実装の詳細があります。DockerfileはCMDとしてsolr-foregroundを使用しており、docker-entrypoint.shは「solr -f」を実行することでこれを実装しています。そのため、これら2つは同等です。

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を使用する場合は、他の2つの呼び出し方法のいずれかを使用する必要があります。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"