从本地机器上的psycopg2连接到Docker上的PostgreSQL数据库

我已经使用下面的命令来创build一个运行Postgres的Docker镜像:

docker pull postgres docker run --name test-db -e POSTGRES_PASSWORD=my_secret_password -d postgres

然后我创build了一个名为test的表,并将一些随机数据插入到几行中。 我现在试图在本地机器上通过Python中的psycopg2连接到这个数据库表。 我使用命令docker-machine ip default查找docker-machine ip default的IP地址为192.168.99.100,并使用以下命令尝试连接:

 conn = psycopg2.connect("dbname='test-db' user='postgres' host='192.168.99.100' password='my_secret_password' port='5432'") 

这不是与“OperationalError:无法连接到服务器:连接被拒绝(0x0000274D / 10061)”的错误信息

。 。

一切似乎都是为了这个,所以我想不出为什么会被拒绝。 根据这个postgres镜像的文档( https://hub.docker.com/_/postgres/ ),这个镜像包含了EXPOSE 5432(postgres端口),默认的用户名是postgres。

我也尝试使用docker inspect test-db | grep IPAddress | awk 'print{$2}' | tr -d '",'获取映像本身的IP地址 docker inspect test-db | grep IPAddress | awk 'print{$2}' | tr -d '",' docker inspect test-db | grep IPAddress | awk 'print{$2}' | tr -d '",'我在SA上find一个稍微相关的文章,但是这个IP地址也不起作用。

EXPOSE指令可能不会达到您所期望的。 它用于Dockernetworking内的链接和容器间通信。 从Docker桥接networking外部连接到容器时,需要使用-p发布到端口。 尝试在您的docker run命令中添加-p 5432:5432 ,使其看起来像:

 docker run --name test-db -e POSTGRES_PASSWORD=my_secret_password -d -p 5432:5432 postgres 

下面是发布和公开端口之间差异的一个体面的解释: https : //stackoverflow.com/a/22150099/684908 。 希望这可以帮助!