pymongo.errors.ServerSelectionTimeoutError:localhost:27017:[Errno 111]连接被拒绝

时间:2018-03-26 19:45:47

标签: python mongodb docker django-rest-framework docker-compose

我正在尝试使用我的django-rest应用程序使用docker-compose。 当我自己运行它python manage.py runserver时效果很好。

如果我尝试使用docker-compose sudo docker-compose up,它也会运行服务器但是当我在浏览器中打开页面时出现错误。

pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused

我已经有了db,所以我只是在settings.py

中使用这些行
MONGODB_DATABASES = {
    "default": {
        "name": 'api',
        "host": 'localhost',
       "port": 27017
    },
}

这是我的Dockerfile:

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY . /code
RUN pip install -r requirements.txt

我的docker-compose.yml:

version: '3.0'
services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
  mongo:
    image: mongo

已经尝试过这个:

Pymongo keeps refusing the connection at 27017

4 个答案:

答案 0 :(得分:1)

  

默认情况下,Compose会为您的应用设置单个网络。每   服务容器加入默认网络,两者都是   该网络上的其他容器可以访问,并且可以被发现   它们的主机名与容器名相同。

根据docker-compose.yaml文件,mongo容器可从mongo:27017容器web访问,因此settings.py应更改为:

MONGODB_DATABASES = {
    "default": {
        "name": 'api',
        "host": 'mongo',
       "port": 27017
    },
}

答案 1 :(得分:0)

对我有用的是简单列出所有容器

docker ps -a

CONTAINER ID        
q624462b055d        
f9324d078256        
r0888c63d21d        
tf5a32702bee        
e68d1ae9b74c

并使用其ID删除与mongodb相关的内容

docker rm q624462b055d f9324d078256

并使用

更改docker-compose文件中的主机和端口
DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'NAME': 'mongo,',
        'HOST': 'mongo',
        'PORT': 27017,
    }
}

答案 2 :(得分:0)

如其他答案中所述,问题与mongo文件中的docker-compose.yml容器名称有关,因此必须更改Django设置才能找到正确的数据库主机。

在更高版本中,Djongo更改了DATABASE中的settings.py选项。这将产生以下新的settings.py部分:

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'NAME': 'api',
        'CLIENT': {
            'host': 'mongo',
            'port': 27017,
        }
    }
}

请注意,hostport现在是CLIENT的子代。

更多信息可在Djongo documentation中找到。

答案 3 :(得分:-1)

我有同样的问题。

问题是我使用了错误的端口转发,并且有一个旧的容器,该容器已停止但未被移除。

我重新启动了旧容器。现在一切正常。