DEV Community

Rohit Farmer
Rohit Farmer

Posted on • Originally published at rohitfarmer.github.io on

How to use docker to run multiple neo4j servers simultaneously

Neo4J graph database server can only mount one database at a time. To run more than one instances of the neo4j server with different databases mounted on them one of the efficient methods is to use neo4j docker image. The key to using more than one neo4j servers simultaneously is to use different ports for http, https and bolt connections which is relatively easy to do with the docker image. For my purpose, I also had to configure neo4j in such a way that it can access the database from a non-default location.

Step 1: Installing the neo4j docker image.

Presuming that you already have docker installed and also that you are working in Linux environment:

docker pull neo4j
Enter fullscreen mode Exit fullscreen mode

Step 2: Running neo4j docker image.

By default, the neo4j docker image mounts the following folders:

home: /var/lib/neo4j
config: /var/lib/neo4j/conf
logs: /var/lib/neo4j/logs
plugins: /var/lib/neo4j/plugins
import: /import
data: /var/lib/neo4j/data
certificates: /var/lib/neo4j/certificates
run: /var/lib/neo4j/run
Enter fullscreen mode Exit fullscreen mode

These directories may correspond to the already existing directories on your system. In my case, I already had a neo4j community server running on my machine so all these locations were there and were being used by the server. Therefore, I had to provide a custom location that would provide the same information. These locations would not be there in your computer if you have not installed the server version and only intending to use the docker image. To my knowledge the most import of the above-mentioned folders are data this is where your actual database will be created/stored, import to put for example CSV files for import, conf to put neo4j.conf file.

The command below is going to run the neo4j docker image taking care of running the server on non-default ports and also creating or mounting the required folders from the desired location.

docker run --detach --name=my-neo4j --rm --env=NEO4J_AUTH=none \
--publish=7475:7474 --publish=7476:7473 --publish=7688:7687 \
--volume=$HOME/neo4j/data:/data \
--volume=$HOME/neo4j/import:/import \
--volume=$HOME/neo4j/conf:/conf \
neo4j
Enter fullscreen mode Exit fullscreen mode

Breaking down the above-mentioned command.

docker run …… neo4j is to run the neo4j docker image.

–detach to run the container in the background and return the prompt.

–name=my-neo4j to give the desired name to the docker instance otherwise docker will choose a random name which might not be very easy to remember if we want to refer to this session in future for some reason.

–rm is to delete the docker instance from the list upon session termination. This is useful if we want to reuse the same name.

–env=NEO4J_AUTH=none to set up the environment for no password login to the neo4j database.

–publish=7475:7474 –publish=7476:7473 –publish=7688:7687 to publish/forward the default http, https and bolt ports to the desired ports. In this case, the http, https and bolt ports will be forwarded to the desired 7475, 7476 and 7687 respectively.

–volume=$HOME/neo4j/data:/data \

–volume=$HOME/neo4j/import:/import \

–volume=$HOME/neo4j/conf:/conf \

to mount the desired locations for the database creation or access.

Note: If you are running this command for the first time, it will create the folders mentioned in –volume tag. Otherwise, it will mount the existing folders to the neo4j docker defaults.

If no error is returned then your neo4j server is running and should have been mapped to the desired ports and folders.

Step 3. Check the docker and neo4j server running status.

To check the current running docker session(s).

docker ps
Enter fullscreen mode Exit fullscreen mode

This should give you an output something like this:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1afa157d9caa neo4j "/sbin/tini -g -- ..." 36 minutes ago Up 36 minutes 7473/tcp, 0.0.0.0:7475->7474/tcp, 0.0.0.0:7688->7687/tcp my-neo4j
Enter fullscreen mode Exit fullscreen mode

To terminate this session:

docker kill my-neo4j
Enter fullscreen mode Exit fullscreen mode

To check neo4j running status: open a web browser and then navigate to

http://localhost:7475 (or the port that you have used for forwarding in step 2)

It should render you a page like the one below:

Neo4j Login Page

Change the bolt port to 7688 (or the port that you have used for forwarding in step 2), leave the password field empty (as we have asked for no authentication in step 2) and click connect.

It should connect you to your default graph.db database which should look something like below.

Neo4j Connection Established

Top comments (3)

Collapse
 
canbax profile image
yusuf

Hi I trying to manage 2 separate databases on 1 machine. I did exactly what you said. One of my databases is empty and other contains some data.

When I goto URL localhost:7474 it is fine it shows me non-empty database.

When I goto URL localhost:7475 it opens up but shows me the SAME DATABASE. It should have been empty ?

When I open them the header of webpage redirects to the same bolt port WHY is that ?

thepracticaldev.s3.amazonaws.com/i...

Collapse
 
rohitfarmer profile image
Rohit Farmer

Hi Yusu,
Sorry for the late reply. Have you already found your answer, or you still need help? I did not encounter the problem that you are facing. Therefore, I do not have a ready answer. I will have to re-create your error to find a solution. Why don't you try to populate both of your databases and see if it's still connecting to the same database?

Collapse
 
canbax profile image
yusuf

Hi Rohit

It's not too late ;)

I noticed that although 2 DBs are running at the same time at the same machine, somehow you can only browse only one of them through browser.

here more details stackoverflow.com/questions/585535...