fbpx

Neo4j Docker版を動かしてみました #neo4j

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

Neo4j Docker版を動かしてみました。Neo4j On Dockerは、コミュニティ版とエンタープライズ版がありますが、ここではコミュニティ版のNeo4j On Dockerを利用して起動方法などを簡略に紹介します。

事前準備

LinuxサーバーにDockerをインストールしてください。ここでは、AWSを使っています。

  • CentOS 7.2
  • Small
  • Docker 1.12.2
  • Neo4j Community 3.0.6

ホストにDockerをインストールしましょう。

$ yum update -y

$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

$ yum install docker-engine -y

$ systemctl enable docker.service

$ systemctl start docker

$ sudo usermod -a -G docker ec2-user

$ docker info

ec2-user、あるいは他のユーザーでdockerコマンドを使用するためには、ログインし直す必要があります。

[参考サイト]
https://docs.docker.com/engine/installation/linux/centos

Neo4j Docker版のインストール

今回、Neo4jのデータベース及びログ、環境ファイルの格納ストレージは、ホスト上のユーザディレクトリをマッピングして使っています。

$ docker run \
--detach \
--publish=7474:7474 --publish=7473:7473 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
--volume=$HOME/neo4j/logs:/logs \
--volume=$HOME/neo4j/conf:/conf \
--ulimit=nofile=40000:40000 \
neo4j:3.0

コンテナーを確認してみましょう。

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9dea4d26be98 neo4j:3.0 "/docker-entrypoint.s" 3 minutes ago Up 3 minutes 0.0.0.0:7473-7474->7473-7474/tcp, 0.0.0.0:7687->7687/tcp condescending_goldstine

ポートは、次の通りです。

ポート プロトコル
7474 HTTP
7473 HTTPS
7687 Boltドライバー

 

ボリュームマッピングの中身を確認してみましょう。
$HOME配下に、Neo4jの構成ディレクトリが作られているはずです。

# ls $HOME
neo4j

# ls $HOME/neo4j/
conf data logs

インストールの確認

では、仕上げとしてWebブラウザーから接続してみましょう。
Public IPは、DockerをインストールしているホストのPublic IPです。

http://Public IP:7474 or https://Public IP:7473

login-on-docker-1

パスワードを初期化し、次に進んでいくと、Webインターフェースの初期画面が表示されるはずです。
ここまで表示できたら、インストールは成功です。

login-on-docker-2

Note

この検証の間、次のような不可解なことを経験しています。HTTPとHTTPSとちらも、ブラウザーから接続すると、「このサイトにアクセスできません。「123.123.123.123 で接続が拒否されました。」と言われました。しかし、しばらく経ってから接続すると、問題なく接続できました(時間的には数十秒?)。皆様の環境で再現するかどうか分かりませんが、もし、似たような境遇にあったら、即断せず、しばらく待ってから接続を試みてください。今のところ、原因の解明はできておりません。明らかになったら追記しておきます。

パラメ―タ設定及び変更

Neo4jは、運用環境を最適化するための多数のパラメータをもっており、運用状況に応じてパラメータの値は変更する必要があります。パラメータの変更には、次の3つの方法が使えます。

  • 起動時の環境変数として設定
  • conf/配下にコンフィグレーションファイルをデプロイ
  • 新しいイメージを作成

起動時の環境変数として設定

この方法は、起動時のオプションとして「--env=NEO4J_<パラメータ名>」のように環境変数としてパラメータを引き渡す方法です。

$ docker run \
--detach \
--publish=7474:7474 --publish=7473:7473 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
--volume=$HOME/neo4j/logs:/logs \
--volume=$HOME/neo4j/conf:/conf \
--ulimit=nofile=40000:40000 \
--env=NEO4J_dbms_memory_pagecache_size=4G \
neo4j:3.0

conf/neo4j.confの初期値から変更したいパラメータは、すべて環境変数として設定する必要があります。

conf/配下にコンフィグレーションファイルをデプロイ

この方法は、ホスト上のconf/の配下にNeo4jの環境ファイルをデプロイしておいて、コンテナー起動時にマウントする方法です。もちろん、conf/neo4j.conf及びconf/neo4j-wrapper.confを適切に設定しておく必要があります。
この方法の注意点は、ホスト上のNeo4jの初期環境にコンフィグレーションファイルが存在しないことです。

# ls $HOME/neo4j/conf/

Neo4jのコンフィグレーションファイルは、次のようにダンプして使います。
ただ、一般のNeo4jのコンフィグレーションファイルと同じなので、同様なNeo4j環境からコピーして利用しても構いません。

# docker run --rm \
--volume=$HOME/neo4j/conf:/conf \
neo4j:3.0 dump-config

# ls $HOME/neo4j/conf
neo4j.conf neo4j-wrapper.conf

中身を確認してみましょう。
このファイルの中身は、Dockerのイメージファイルに埋め込まれているconf/neo4j.conf及びconf/neo4j-wrapper.confであり、Neo4jの初期値のままです。起動時に環境変数として引き渡したパラメータは反映されていません。

# cat $HOME/neo4j/conf/neo4j.conf
#*****************************************************************
# Neo4j configuration
#*****************************************************************
#dbms.active_database=graph.db
#dbms.directories.data=data
#dbms.directories.plugins=plugins
#dbms.directories.certificates=certificates
#dbms.directories.logs=logs
dbms.directories.import=import
#dbms.security.auth_enabled=false
#dbms.allow_format_migration=true
#dbms.memory.pagecache.size=10g

#*****************************************************************
# Network connector configuration
#*****************************************************************
dbms.connector.bolt.type=BOLT
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=OPTIONAL
# To have Bolt accept non-local connections, uncomment this line
# dbms.connector.bolt.address=0.0.0.0:7687

dbms.connector.http.type=HTTP
dbms.connector.http.enabled=true
# To accept non-local HTTP connections, uncomment this line
#dbms.connector.http.address=0.0.0.0:7474

dbms.connector.https.type=HTTP
dbms.connector.https.enabled=true
dbms.connector.https.encryption=TLS
# To accept non-local HTTPS connection, change 'localhost' to '0.0.0.0'
dbms.connector.https.address=localhost:7473

# Number of Neo4j worker threads.
#dbms.threads.worker_count=

#*****************************************************************
# Logging configuration
#*****************************************************************
#dbms.logs.http.enabled=true
#dbms.logs.http.rotation.keep_number=5
#dbms.logs.http.rotation.size=20m
#dbms.logs.gc.enabled=true
#dbms.logs.gc.options=-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution
#dbms.logs.gc.rotation.keep_number=5
#dbms.logs.gc.rotation.size=20m
#dbms.logs.debug.rotation.size=20m
#dbms.logs.debug.rotation.keep_number=7

#*****************************************************************
# Miscellaneous configuration
#*****************************************************************
#cypher.default_language_version=3.0
#dbms.security.allow_csv_import_from_file_urls=true
#dbms.tx_log.rotation.retention_policy=7 days
#dbms.shell.enabled=true
#dbms.shell.host=127.0.0.1
#dbms.shell.port=1337
#dbms.read_only=false
http://localhost:7474/examples/unmanaged/helloworld/{nodeId}
#dbms.unmanaged_extension_classes=org.neo4j.examples.server.unmanaged=/examples/unmanaged

ホスト上にNeo4jのコンフィグレーションファイルが存在している状態でNeo4jのコンテナーを起動すると、コンテナー上のコンフィグレーションファイルは、ホスト上のコンフィグレーションファイルの内容にオーバライドされます。もちろん、Neo4jの環境構成も設定値のとおりに構成されます。

例えば、遠隔地からHTTP/HTTPS/BOLTの動作確認をする場合、関連の初期設定を次のように編集します。

#*****************************************************************
# Network connector configuration
#*****************************************************************
dbms.connector.bolt.type=BOLT
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=OPTIONAL
# To have Bolt accept non-local connections, uncomment this line
dbms.connector.bolt.address=0.0.0.0:7687

dbms.connector.http.type=HTTP
dbms.connector.http.enabled=true
# To accept non-local HTTP connections, uncomment this line
dbms.connector.http.address=0.0.0.0:7474

dbms.connector.https.type=HTTP
dbms.connector.https.enabled=true
dbms.connector.https.encryption=TLS
# To accept non-local HTTPS connection, change 'localhost' to '0.0.0.0'
dbms.connector.https.address=0.0.0.0:7473

ちなみに、コンテナーの中のconf/neo4j.confは、次のようなdockerコマンドで確認できます。

$ docker exec <コンテナーID> ls conf/

$ docker exec <コンテナーID> cat conf/neo4j.conf

新しいイメージ作成

この方法は、自前でDockerfileを書いてNeo4jのDockerイメージを作る方法です。ここで紹介している内容では物足りないと感じる方は、ぜひ、試してみてください。

Dockerfile

FROM neo4j:3.0

Neo4jコンテナーの再起動

設定ファイルの変更など、Neo4jのコンテナーを再起動する際には、コンテナーを完全に削除してから起動(RUN)すれば良いです。

$ docker ps
$ docker sotp
$ docker ps -a
$ docker rm <コンテナーID>

まとめ

Neo4j Docker版を使いこなすためには、Dockerコマンドの知識も少々必要になりそうですね。ただ、いくつかの基本的なコマンドさえ理解すれば、まずまず動かしてみるのには全然問題なさそうです。もっと興味ある方は、以下のサイトを参照してください。

[参考サイト]
Neo4j with Docker [英語]
Neo4j公式ドキュメント(Neo4j3.0 Docker page) [英語]

Author

モダンアーキテクチャー基盤のソリューションアーキテクトとして活動しています。

[著書]
・Amazon Cloudテクニカルガイド―EC2/S3からVPCまで徹底解析
・Amazon Elastic MapReduceテクニカルガイド ―クラウド型Hadoopで実現する大規模分散処理
・Cypherクエリー言語の事例で学ぶグラフデータベースNeo4j
・Neo4jを使うグラフ型データベース入門(共著)
・RDB技術者のためのNoSQLガイド(共著)

leeの記事一覧

新規CTA