Docker- django 在连接到 postgres 时抛出错误:psycopg2.OperationalError:无法连接到服务器:连接被拒绝

Posted

技术标签:

【中文标题】Docker- django 在连接到 postgres 时抛出错误:psycopg2.OperationalError:无法连接到服务器:连接被拒绝【英文标题】:Docker- django throws error while connecting to postgres: psycopg2.OperationalError: could not connect to server: Connection refused 【发布时间】:2020-01-24 04:55:31 【问题描述】:

我正在尝试 dockerize 我的 Django-postgres 应用程序。 我的 Dockerfile 是:

FROM python:3

ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

我的 docker-compose.yml 是:

version: '3'

services:
  web:
    build: .
    command: python app/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
  db:
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: password

我的设置 .py 有以下数据库代码:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': '0.0.0.0',
        'PORT': '5432',
    

我的 db 和 web 容器已启动,但是当我运行时: docker-compose 运行 web python manage.py migrate 我收到错误消息:

psycopg2.OperationalError:无法连接到服务器:连接被拒绝 服务器是否在主机“0.0.0.0”上运行并接受 端口 5432 上的 TCP/IP 连接?

如何让我的容器进行通信?

【问题讨论】:

【参考方案1】:

HOST 更改为:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': '5432',
    

0.0.0.0 不是有效的IP,此外您需要使用service 名称进行连接,因为compose 会为您解决问题

【讨论】:

如果我想连接到db,我可以在我的python代码中使用服务名称吗?它在上面的场景中有效,但在其他地方失败了。 当我运行时:con = psycopg2.connect("host=db dbname=postgres user=postgres password=password") 我收到错误:无法将主机名“db”转换为地址:未知主机 如果它在 compose 的两个容器之一中运行,那么应该可以。 当我从容器中运行它时它起作用了。非常感谢@LinPy! 如果你想在容器外使用它,只需使用:localhost:5432

以上是关于Docker- django 在连接到 postgres 时抛出错误:psycopg2.OperationalError:无法连接到服务器:连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

cookie-cutter django nginx connect() 在连接到上游时失败(111:连接被拒绝),

在单个 docker 容器中运行两个进程还是在连接到同一个数据库的两个容器中运行?

Cloudfront 在连接到 ELB/Elastic Beanstalk 时抛出 504

节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM

Django 不会连接到 Redis Docker 容器

连接到 docker-compose mysql 容器会拒绝访问,但运行相同映像的 docker 不会