尝试连接数据库和 Web 容器时 SQLAlchemy 连接被拒绝

Posted

技术标签:

【中文标题】尝试连接数据库和 Web 容器时 SQLAlchemy 连接被拒绝【英文标题】:SQL Alchemy connection refused when trying to connect db and web containers 【发布时间】:2021-04-26 00:33:24 【问题描述】:

我在使用 django/postgres 应用程序(使用 sqlalchemy)运行 docker-compose up 时遇到问题。

在本地运行它时一切都很好,但是当我尝试对它进行竞争时(使用 Docker)我遇到了一个错误:

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

由于某种原因,应用没有连接到数据库。

我的docker-compose.yml

version: "3.9"

services:
  db:
    image: postgres:9.6
    environment:
      - POSTGRES_DB=my database
      - POSTGRES_USER=my user
      - POSTGRES_PASSWORD=my password
  web:
    build: .
    command: python3 manage.py runserver 127.0.0.1:8080
    volumes:
      - .:/code
    ports:
      - "8080:8080"
    depends_on:
      - db

我的 Dockerfile:

FROM python:3

ENV PYTHONUNBUFFERED=1

WORKDIR /code

COPY requirements.txt /code/

RUN pip3 install --trusted-host pypi.python.org -r requirements.txt

COPY . /code/

我的引擎:

engine = create_engine("postgresql://my user:my password@127.0.0.1:5432/my database")

Django 设置.py:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'my database',
        'USER': 'my user',
        'PASSWORD': 'my password',
        'HOST': '127.0.0.1',
        'PORT': 5432,
    

谁能告诉我我在哪里犯错了?

编辑

我尝试了 Max 的解决方案,但没有任何改变。我在错误引用中发现显示了我使用引擎的行。那么我也应该以某种方式修改我的引擎吗?

【问题讨论】:

您应该在网络中连接您的容器。 See here 或许你还得调整数据库 url 以匹配容器名称或 ip 【参考方案1】:

我无法再次编辑我的评论。

所以首先你需要将你的容器组合到一个 docker 网络中,see here。 docker-compose 示例如下所示:

version: "3.9"

services:
  db:
    image: postgres:9.6
    environment:
      - POSTGRES_DB=my database
      - POSTGRES_USER=my user
      - POSTGRES_PASSWORD=my password
    networks:
      - backend

  web:
    build: .
    command: python3 manage.py runserver 127.0.0.1:8080
    volumes:
      - .:/code
    ports:
      - "8080:8080"
    depends_on:
      - db
    networks:
      - backend


networks:
  backend:
    driver: bridge
    name: backend

然后你需要编辑你的 django 设置:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'my database',
        'USER': 'my user',
        'PASSWORD': 'my password',
        'HOST': '<your-service-name should be "db">',
        'PORT': 5432,
    

在您当前的设置中,django 尝试连接到在同一容器中运行的数据库,但实际情况并非如此。

【讨论】:

我在 settings.py "HOST": "db" 中重新创建了您的所有建议,清除了所有图像并重新开始,不幸的是没有任何改变,仍然出现相同的错误。 我尝试了您的建议,但由于返回了相同的错误,它没有奏效。我认为这可能是引擎出了问题。我应该在那里更改网址以实现它吗? engine = create_engine("postgresql://mu 用户:我的密码@db:5432/我的数据库") 我不熟悉create_engine的字符串,mu的部分for是什么? 抱歉打错了应该是 好的,要检查是否可以从 python 容器访问 docker-container 数据库,请尝试使用docker exec -it &lt;container&gt; /bin/bash 在容器内部进行连接。然后尝试通过服务名称或 IP ping 另一个容器。您可能需要在容器中单独安装 ping 包。

以上是关于尝试连接数据库和 Web 容器时 SQLAlchemy 连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

尝试从Docker容器内部连接到DB时,“连接被拒绝”

使用go webservice在docker中连接到mysql时连接被拒绝

如何使用ssl设置Docker redis容器

dotnet core docker web api没有连接

web容器(01):Apache配置监控

Docker Desktop Windows 和 *** - 容器内没有网络连接