首页 > 解决方案 > 连接到 Postgres 数据库的 Docker 容器

问题描述

将 Django docker 容器连接到 Postgres 数据库时,我收到以下错误。

    File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 
    130, in connect conn = _connect(dsn, 
    connection_factory=connection_factory, **kwasync)
    django.db.utils.OperationalError: could not connect to server: 
    Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?
    could not connect to server: Cannot assign requested address
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?

下面是我运行容器的 Dockerfile

   FROM python:3.6

    MAINTAINER c15523957

    RUN apt-get -y update
    RUN apt-get -y upgrade

    RUN apt-get -y install libgdal-dev

    RUN mkdir -p /usr/src/app

    COPY requirements.txt /usr/src/app/
    COPY . /usr/src/app

    WORKDIR /usr/src/app

    RUN pip install --upgrade pip
    RUN pip install --no-cache-dir -r requirements.txt

   EXPOSE 8000
   CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

这是我的 Django 代码的 settings.py 文件中的代码

    DATABASES = {
        'default': {
           'ENGINE': 'django.contrib.gis.db.backends.postgis',
           'NAME': 'place_loc_db',
           'USER': 'place_loc_user',
          'PASSWORD': 'abc123',
          'HOST': 'localhost',
          'PORT': 5432,
  }

}

注意:我没有将 postgres 数据库作为容器运行,而是在本地计算机上运行

注意:以下详细信息包含在我的 pg_hba.conf 和 postgresql.conf 文件中

postgresql.conf- >listen_addresses = '*'

pg_hba.conf -> host all all 0.0.0.0/0 md5

我已经阅读了上面打开数据库连接的以下详细信息。

标签: postgresqldockerdockerfile

解决方案


您似乎正在尝试连接到localhost. 您的 Postgres 数据库与您的 django 应用程序不在同一个容器内运行,因此您无法在localhost. 您需要将您的应用程序指向 Postgres 容器的地址。

如果您在用户定义的网络中运行容器(使用docker-compose会自动为您执行此操作),那么您可以使用容器名称作为主机名。

关于容器网络的文档是一个很好的起点。

更新

您在主机上运行 Postgres 的事实并没有显着改变答案:您仍然需要将您的 webapp 指向 Postgres 服务器的地址,而不是localhost.

最简单的方法取决于您是在 Linux 上本地运行 Docker,还是在运行 Docker-For-X,其中 X 是 MacOS 或 Windows。

在 Linux 上,只需将您的 webapp 指向docker0接口的 IP 地址。这是您主机地址,并且由于您已将 Postgres 配置为侦听所有接口,因此应该可以正常工作。

如果您使用的是 Mac 或 Windows,则有一个特殊的“魔术主机名”,它指的是您主机上的服务。例如,在 MacOS 下阅读此内容以获取详细信息。在这两种情况下,您都可以将您的 webapp 指向host.docker.internal.


推荐阅读