Docker Django无法连接服务器:连接被拒绝。

12

我对Docker还很陌生,正在尝试使用docker-compose和docker-machine将我的Django REST API与Nginx、Gunicorn和Postgres放入容器中。我遵循了这个教程:https://realpython.com/blog/python/django-development-with-docker-compose-and-machine/

我的大部分代码与教程相同(https://github.com/realpython/dockerizing-django),只有一些名称变化。

以下是我的docker-compose.yml文件(为了调试目的,我将gunicorn命令改为runserver)

web:
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
    - redis:redis
  volumes:
    - /usr/src/app
    - /usr/src/app/static
  env_file: .env
  environment:
    DEBUG: 'true'
  command: /usr/local/bin/python manage.py runserver

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  volumes:
    - /www/static
  volumes_from:
    - web
  links:
    - web:web

postgres:
  restart: always
  image: postgres:latest
  ports:
    - "5432:5432"
  volumes:
    - pgdata:/var/lib/postgresql/data/

redis:
  restart: always
  image: redis:latest
  ports:
    - "6379:6379"
  volumes:
    - redisdata:/data

这是我的Django的settings.py文件中的内容:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'postgres',
        'PORT': '5432',
    }
}
Nginx和Postgres(以及Redis)已经启动并运行,但我的Django服务器无法启动,并显示以下错误:
web_1       | django.db.utils.OperationalError: could not connect to server: Connection refused
web_1       |   Is the server running on host "localhost" (::1) and accepting
web_1       |   TCP/IP connections on port 5432?
web_1       | could not connect to server: Connection refused
web_1       |   Is the server running on host "localhost" (127.0.0.1) and accepting
web_1       |   TCP/IP connections on port 5432?

我已经谷歌了很多并且验证了postgres正在运行,端口为5432,我可以使用psql命令连接到它。

我很迷茫,我的错误在哪里?

编辑:看起来它没有使用我的settings.py文件或其他东西,因为它正在询问服务器是否在本地主机上运行,而设置应该正在寻找postgres。

3个回答

15

如果您遇到此问题,请检查您的settings.py文件:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbname',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'db'
    }
}

如果您想将HOST:'db'docker-compose文件中的数据库名称改名,确保它们相同。同时请在docker-compose文件和setting.py中进行修改。

db:
  restart: always
  image: postgres:latest
  ports:
    - "5432:5432"
  volumes:
    - pgdata:/var/lib/postgresql/data/

1
这个回答对我很有帮助。谢谢! - X-MUK-625
1
谢谢,伙计!终于在花费了将近一整天的时间后,我让它工作了。 - rangarajan

1

检查你的 manage.py 文件,应该有一行

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

如果没有这样的行,请添加它。
根据PYTHONPATH设置您的DJANGO_SETTINGS_MODULE。
UPD 我克隆了您的存储库,并通过更改docker-compose.yml中的命令启动了Web服务。
-  command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000
+  command: python manage.py runserver 0.0.0.0:8000

我确定 DJANGO_SETTINGS_MODULE 是正确的。


谢谢回复,但是那一行代码已经在那里了!本地一切正常。 - Robert Broersma
您的更新是正确的。我提到的存储库对我来说可以直接使用 :). 我已经成功让它工作了,但是我不确定具体是如何做到的。 - Robert Broersma

0

我正面临着同样的问题,当我在 AWS EC2 实例上使用 Docker 运行我的 Django 应用程序时。

我注意到这个错误只会在第一次构建 Docker 镜像时发生,所以为了解决它,我只需运行:

CTRL + C 然后再次运行 docker-compose up,然后一切都正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接