mongodbdockerdocker-composepymongomongokit

Cannot connect to mongodb instance from docker: Connection refused


I am using docker-compose to create a multi-container environment where I have one mongodb instance and two python applications. The problem is, the first application is able to establish a connection to mongodb whereas the second application fails with the following error:

File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py", 
            line 377, in __init__ notification_1   | 
            raise ConnectionFailure(str(e)) notification_1   | 
            pymongo.errors.ConnectionFailure: [Errno -2] Name or service not known

My project structure:

.
├── docker-compose.yml
├── form
│   ├── app.py
│   ├── Dockerfile
│   ├── requirements.txt
│   ├── static
│   └── templates
│       ├── form_action.html
│       └── form_sumbit.html
├── notify
│   ├── app.py
│   ├── Dockerfile
│   ├── requirements.txt
└── README

Here is my [updated] docker-compose.yml file:

version: '3'

services:
  db:
    image: mongo:3.0.2
    container_name: mongo
    networks:
      db_net:
        ipv4_address: 172.16.1.1


  web:
    build: form
    command: python -u app.py
    ports:
      - "5000:5000"
    volumes:
      - form:/form
    environment:
      MONGODB_HOST: 172.16.1.1
    networks:
      db_net:
        ipv4_address: 172.16.1.2

  notification:
    build: notify
    command: python -u app.py
    volumes:
      - notify:/notify
    environment:
      MONGODB_HOST: 172.16.1.1
    networks:
      db_net:
        ipv4_address: 172.16.1.3

networks:
  db_net:
    external: true

volumes:
  form:   
  notify:

The first application is based on Flask and uses mongokit to connect to the database. Here is the code to establish the connection:

MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR']
MONGODB_PORT = 27017

app = Flask(__name__)
app.config.from_object(__name__)

# connect to the database
try:
    connection = Connection(app.config['MONGODB_HOST'], app.config['MONGODB_PORT'])
except ConnectionFailure:
    print("Connection to db failed. Start MongoDB instance.")
    sys.exit(1)

The second app is a simple python application. The code for conection is as follows:

MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR']
MONGODB_PORT = 27017
connection = Connection(MONGODB_HOST, MONGODB_PORT)

Solution

  • Is there a reason why you're explicitly specifying IP addresses for all the services, plus the container name for the db service? I'd suggest dropping them and using the service names to connect between containers on the same network.

    version: '3'
    
    services:
      db:
        image: mongo:3.0.2
        networks:
          - db_net
    
      web:
        build: form
        command: python -u app.py
        ports:
          - "5000:5000"
        volumes:
          - form:/form
        environment:
          MONGODB_HOST: db
        networks:
          - db_net
    
      notification:
        build: notify
        command: python -u app.py
        volumes:
          - notify:/notify
        environment:
          MONGODB_HOST: db
        networks:
          - db_net
    
    networks:
      db_net:
    
    volumes:
      form:   
      notify: