我正在尝试从Python连接到一个dockerized Postgres。然而,我还没有设法使它以我认为它应该工作的方式工作。由于我只是Docker的初学者,我首先使用了awesome-compose github中的postgres-pgadmin yaml,如下所示:
version: '3.1'
services:
postgres:
image: postgres:16.0
container_name: postgresdb
restart: always
ports:
- "5432:5432"
environment:
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- d:/DB/dev:/var/lib/postgresql/data
pgadmin:
container_name: pgadmin
image: dpage/pgadmin4:latest
environment:
- [email protected]
- PGADMIN_DEFAULT_PASSWORD=pass
ports:
- "5050:80"
restart: always
这样,我就可以使用localhost:5050访问pgadmin,并且我看到postgres已经启动并运行,没有错误。
现在,在pgadmin中设置postgres服务器的唯一方法是使用postgresdb作为主机。使用127.0.0.1、localhost或inspect中显示的IP不起作用。另外,无论我怎么尝试,我都无法从python连接。下面是Python代码:
import psycopg2
connection = psycopg2.connect(database="postgres", user='postgres', password='postgres', host='127.0.0.1', port=5432)
我还检查了端口5432是否正在使用netstat -ad
进行侦听,我可以看到两者
0.0.0.0:5050
0.0.0.0:5432
当我取下容器时,这两个条目没有显示出来,因此我强烈认为它们来自postgre和pgadmin。所以,我不明白为什么我不能通过python连接到postgres。
然后我想docker compose会有一些“奇怪”(至少从初学者的Angular 来看),所以我在postgres镜像上旋转了另一个容器(直接使用docker桌面,而不是docker compose)。这最初也不起作用,直到我将主机端口更改为5433(即使用5433:5432
Map)。现在我可以通过python连接到服务器,但必须使用“docker”IP,即。类似172.17.0.3
的东西,它只适用于端口5432,尽管Map到5433。
我本来希望我可以使用像127.0.0.1:5433
这样的东西来连接,但这不起作用。
至于系统,我在Windows 11上使用WSL 2和Docker Desktop 4.23.0。我怀疑Windows 11中有什么东西导致了这些问题,但我甚至不知道从哪里开始。顺便说一句,确实关闭了病毒和防火墙,但无济于事。
如有任何帮助,我们将不胜感激。
2条答案
按热度按时间ds97pgxw1#
这就解释了问题所在
我正在使用VS Code dev Container来运行Python。
在
VS Code dev Container
中,默认情况下,您会看到容器的隔离Docker网络。您需要在主机上访问网络。您需要来自Docker in Docker setup with VSCode Dev Containers: How to access running docker containers on the host machine的答案之一
试试这个
你可以将这一行添加到你的.devcontainer/devcontainer.json文件中:
通过这种方式,您为开发容器提供了一种方法,只需使用主机名host.docker.internal就可以访问主机地址
y4ekin9u2#
对于任何感兴趣的人来说,实际上有一个非常简单的解决原始问题的方法:
在python脚本中不使用
127.0.0.1
(或localhost
),而应该使用主机的IP地址(对我来说,它类似于192.168.0.60)。对devcontainer.json
的更改是不必要的。解释是,loopback地址127.0.0.1引用回docker容器(python dev容器)作为主机,而不是Windows主机,即。本地机器本身。
在Ryabchenko的解决方案中,
host.docker.internal
地址实际上解析为Windows主机地址(192.168.0.60)。