【问题标题】:Linking my Django docker container to a postgres container将我的 Django docker 容器链接到 postgres 容器
【发布时间】:2025-12-26 23:55:07
【问题描述】:

我创建了一个 django docker 应用程序映像。 在我的 django 应用程序中,settings.py DATABASE 条目是:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'cath_local',
    'USER': 'postgres',
    'PASSWORD': 'mypass',
    'HOST': 'postgres',
    'PORT': '5432',
    'OPTIONS': {
        'client_encoding': 'UTF8',
    },
}
}

好吧,此时我使用docker build 命令创建我的docker 映像;全做完了。 在运行我的 django 应用程序 docker 映像之前,我运行:

docker run -it postgres

图像已下载,容器正确启动

但是当我运行我的 django 应用程序时

docker run -it cath2019/cathedral_studio:latest

但是当 python manage.py runserver 命令进入我的 Dockerfile 启动时,我得到了这个错误:

conn = _connect(dsn, connection_factory=connection_factory, **kwasync) django.db.utils.OperationalError:无法将主机名“postgres”转换为地址:名称无法解析

这里是我的应用程序 Dockerfile:

FROM python:3.6-alpine
RUN apk add --no-cache make linux-headers libffi-dev jpeg-dev zlib-dev
RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev
#RUN apk update && apk add build-essential libssl-dev libffi-dev
RUN mkdir /Code
WORKDIR /Code
COPY ./requirements.txt .

RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ENV PYTHONUNBUFFERED 1

COPY . /Code/

ENTRYPOINT python /Code/core/manage.py runserver 0.0.0.0:8000

如何连接到我的 django 设置数据库以运行 postgres 容器?

提前非常感谢

【问题讨论】:

  • 您可以将其设置为10.0.2.2,但在运行 postgres 时您也必须映射端口,我建议保持原样并仅使用 docker-compose 文件
  • 最好用docker-compose将两个容器一起启动,放在同一个网络上。

标签: python django postgresql docker


【解决方案1】:

你可以使用两种方法来解决这个问题:

1.用户定义的网络

默认桥接网络存在于所有 Docker 主机上。如果你这样做 不指定不同的网络,新的容器会自动 连接到默认的桥接网络。

Link

您可以使用docker network inspect bridge 获取容器的 IP 地址。 然后您可以使用容器属性中的 IP 地址。

不建议这样做,因为容器中的更改可能会更改 ip 地址。

Docker 不支持自动服务发现 默认桥接网络。如果您希望容器能够解析 容器名称的 IP 地址,您应该使用用户定义的网络 反而。您可以使用旧的 docker run --link 选项将两个容器链接在一起,但在大多数情况下不建议这样做。

创建网络运行docker network create --driver bridge django_network

然后将两个容器连接到同一个网络 docker run -it postgres --network=django_networkdocker run -it cath2019/cathedral_studio:latest --network=django_network.

现在您可以使用主机名从您的 django 应用程序连接到 postgres 数据库。

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'cath_local',
    'USER': 'postgres',
    'PASSWORD': 'mypass',
    'HOST': 'postgres',
    'PORT': '5432',
    'OPTIONS': {
      'client_encoding': 'UTF8',
    },
}

}

2。 Docker-compose

查看官方文档Link 以对 django 应用进行 dockerize。

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

【讨论】:

    【解决方案2】:

    仅使用 Docker

    您需要使用以下方式链接 Django 容器:--link postgres:postgres

    结帐this answer

    使用 Docker Compose

    version: '3'
    
    services:
      db:
        image: postgres
      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    

    来源:https://docs.docker.com/compose/django/

    【讨论】: