djangoneo4jdocker-composeboltneomodel

Docker-compose: db connection from web container to neo4j container using bolt


I'm working on django project with neo4j db using neomodel and django-neomodel. I'm trying to containerize it using docker-compose. when I build the images everything seems fine, but any connection from web container to db using bolt is refused. although I can access the neo4j db from the browser on http, and even from local machine on bolt. this is the error I get:

neo4j.exceptions.ServiceUnavailable: Failed to establish connection to ('127.0.0.1', 7688) (reason 111)

I'm using the following configs:

<pre>Django == 3.1.1
neo4j==4.1.0
neomodel==3.3.0
neobolt==1.7.17 </pre>

this is my docker-compose file:

version: '3'

services:
  backend:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - neo4j_db
    networks:
      - mynetwork
    links:
      - neo4j_db


  neo4j_db:
    image: neo4j:3.5.17-enterprise
    ports:
      - "7474:7474"
      - "7688:7687"
    expose:
      - 7474
      - 7687
    volumes:
      - ./db/dbms:/data/dbms
    environment:
      - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
      - dbms.connector.bolt.listen_address=:7688
      - dbms.connector.bolt.advertised_address=:7688
    networks:
      - mynetwork
networks:
  mynetwork:
    driver: bridge

and here's connection configs in django settings:

NEOMODEL_NEO4J_BOLT_URL = os.environ.get('NEO4J_BOLT_URL', 'bolt://neo4j:pass@123@127.0.0.1:7688')

Thanks in advance..


Solution

    1. To connect from one container to another one (inside the same docker-compose project) you should use container name of the target container instead of the localhost (or 127.0.0.1). In your case it would be neo4j_db.

    2. When connecting from other container you should use the internal port, in your case 7687.

    3. In the neo4j service, the bolt.listen_address should be 7687 instead of 7688 (honestly, I'm not sure why you are changing the default port).

    To wrap up, the connection url should be:

    bolt://neo4j:pass@neo4j_db:7687