Docker容器连接到Postgres数据库

时间:2018-12-10 19:12:13

标签: postgresql docker dockerfile

将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 ->托管所有0.0.0.0/0 md5

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

2 个答案:

答案 0 :(得分:1)

您似乎正在尝试连接到0.10.x。您的Postgres数据库未在与django应用程序相同的容器中运行,因此您将无法在localhost上找到它。您需要将您的应用程序指向Postgres容器的地址。

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

container networking上的文档是一个很好的起点。

更新

您在主机上运行Postgres的事实并不能从根本上改变答案:您仍然需要将Web应用指向Postgres服务器的地址,而不是localhost

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

在Linux上,只需将您的Web应用程序指向localhost界面的IP地址即可。这是主机的一个地址,由于已将Postgres配置为在所有接口上进行侦听,因此应该可以正常工作。

如果您使用的是Mac或Windows,则有一个特殊的“魔术主机名”,它指代主机上的服务。例如,在MacOS下,请阅读this了解详细信息。在这两种情况下,您都可以将Web应用程序指向docker0

答案 1 :(得分:0)

  1. 确保已完成

    postgresql.conf-> listen_addresses ='*'

    pg_hba.conf->托管所有0.0.0.0/0 md5

  2. brew服务启动postgresql(在MAC中,重新加载postgres Service)。

  3. 获取系统IP。
  4. 在数据库连接中使用系统IP地址而不是localhost。