python 如何在Docker中从VS Code dev Container连接到Postgres(Windows 11)

toiithl6  于 2023-09-29  发布在  Python
关注(0)|答案(2)|浏览(116)

我正在尝试从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:5432Map)。现在我可以通过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中有什么东西导致了这些问题,但我甚至不知道从哪里开始。顺便说一句,确实关闭了病毒和防火墙,但无济于事。
如有任何帮助,我们将不胜感激。

ds97pgxw

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文件中:

"runArgs": ["--add-host=host.docker.internal:host-gateway"]

通过这种方式,您为开发容器提供了一种方法,只需使用主机名host.docker.internal就可以访问主机地址

y4ekin9u

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)。

相关问题