imhans4305
imhans4305

Reputation: 697

Connection refused to mongodb in docker container

I am using mongoengine to connect to mongo db from flask application and it gives me the following error message

 raise ServerSelectionTimeoutError(
flask    | pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 6236fe25f46467df46971801, topology_type: Unknown, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused')

The code for flask is as

main.py

from flask import Flask
from decouple import config as con
from app.instance import config
from app.instance.exts import db

def create_app(config_class=config.Config):
    app = Flask(__name__)
    app.config.from_object(config.Config)
    app.secret_key = con('flask_secret_key')

    db.init_app(app)

    from app.routes.test_route import test_api
    app.register_blueprint(test_api)
    return app

app = create_app()

if __name__ == "__main__":
    # Only for debugging while developing
    app.run(host="0.0.0.0", debug=True, port=80)

COnfiguration file is

instance/config.py

import os
from decouple import config


class Config:
    MONGODB_SETTINGS = {"host":"mongodb://testuser:testuser@localhost:27017/ml-db"}

Extensions are

instance/exts.py

from flask_mongoengine import MongoEngine
db = MongoEngine()

Models view is

models/model.py

from app.instance.exts import db

class User(db.Document):
    name = db.StringField()
    email = db.StringField()

Route api view is

routes/test_route.py

from flask import Flask, render_template, Blueprint, jsonify
from app.models.model import User

test_api = Blueprint('test_api', __name__)

@test_api.route('/')
def testfn():
    print("Request received")
    User(name='laura', email='[email protected]').save()
    return jsonify({"test":"success"})

docker-compose.yml

version: '3.8'
services:
  web:
    container_name: "flask"
    build: ./
    volumes:
      - ./app:/app
    ports:
      - "8000:8000"
    environment:
      - DEPLOYMENT_TYPE=production
      - FLASK_APP=app/main.py
      - FLASK_DEBUG=1
      - MONGODB_DATABASE=ml-db
      - MONGODB_USERNAME=testuser
      - MONGODB_PASSWORD=testuser
      - MONGODB_HOSTNAME=mongo
    command: gunicorn app.main:app --workers 4 --name main -b 0.0.0.0:8000
    depends_on:
      - mongo
    links:
      - mongo

  nginx:
    container_name: "nginx"
    restart: always
    image: nginx
    volumes:
      - ./app/nginx/conf.d:/etc/nginx/conf.d
    ports:
      - 80:80
      - 443:443
    links:
      - web
      
  mongo:
    container_name: "mongo"
    image: mongo:5-focal
    restart: always
    ports:
      - '27017:27017'
    environment:
      MONGO_INITDB_ROOT_USERNAME: testuser
      MONGO_INITDB_ROOT_PASSWORD: testuser
      MONGO_INITDB_DATABASE: testdb
    volumes:
      - mongo-data:/data/db
      - mongo-configdb:/data/configdb
volumes:
  mongo-data:
  mongo-configdb:

When I tried with a simple flask python program given below, Collection is created and document is inserted into the collection of mongo docker.

from flask import Flask
from flask_mongoengine import MongoEngine

app = Flask(__name__)

app.config['MONGODB_SETTINGS'] = {
    'db': 'ml-db',
    'username':'testuser',
    'password':'testuser',
    'host': 'localhost',
    'port': 27017
}
db = MongoEngine()
db.init_app(app)

class User(db.Document):
    name = db.StringField()
    email = db.StringField()

User(name='laura', email='[email protected]').save()

if __name__ == "__main__":
    app.run(debug=True)

Upvotes: 0

Views: 19

Answers (0)

Related Questions