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

5
我使用以下命令创建了一个带有Postgres的Docker镜像:
docker pull postgres docker run --name test-db -e POSTGRES_PASSWORD=my_secret_password -d postgres
然后我创建了一个名为test的表并在几行中插入了一些随机数据。现在,我正在尝试通过Python中的psycopg2连接到此数据库表。我使用命令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: could not connect to server: Connection refused (0x0000274D/10061)”。
一切看起来都没问题,我不知道为什么会被拒绝连接。根据此Postgres镜像的文档(在https://hub.docker.com/_/postgres/),该镜像包含EXPOSE 5432(Postgres端口),默认用户名为postgres。
我还尝试使用docker inspect test-db | grep IPAddress | awk 'print{$2}' | tr -d '",'获取镜像本身的IP地址,这是我在一个稍微相关的文章中找到的方法,但是那个IP地址也不能用。

您尝试过使用另一个客户端(例如psql)进行连接吗? - Chris
1个回答

7
EXPOSE指令可能不会按照您的期望工作。它用于Docker网络内的链接和容器间通信。当从Docker桥接网络的外部连接到容器时,您需要使用-p将端口发布到外部。尝试在docker run命令中添加-p 5432:5432,使其看起来像这样:
docker run --name test-db -e POSTGRES_PASSWORD=my_secret_password -d -p 5432:5432 postgres

以下是发布端口和暴露端口之间区别的解释:https://dev59.com/AmEh5IYBdhLWcg3wtFX4#22150099。希望这可以帮助你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接