尝试连接数据库和 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 <container> /bin/bash
在容器内部进行连接。然后尝试通过服务名称或 IP ping 另一个容器。您可能需要在容器中单独安装 ping 包。以上是关于尝试连接数据库和 Web 容器时 SQLAlchemy 连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
使用go webservice在docker中连接到mysql时连接被拒绝