如何调试:无法从 Docker 容器内连接到数据库

How to debug: Unable to connect to database from inside a Docker container

我是个菜鸟w.r.t。我正在处理的系统中有许多活动部件,所以请原谅我在某些地方缺乏理解。我这里的问题更多的是询问调试策略,而不是询问解决问题的方法,因为我现在是空白。

当前设置

我正在 运行在 EC2 实例上安装一个 Docker 容器。我公司 VPC 中的所有实例 运行。我需要连接到位于本地工作站上的 Postgres 数据库。 Docker 容器使用 Dokku 自动启动和关闭,这是一种开源 Heroku 替代方案,我终于弄清楚了如何在 EC2 上进行设置。

我将在 post:

中使用的一些变量

什么有效

当我使用 dokku enter APPNAME 进入 APPCONTAINER 时,我可以 ping DBSERVER 并返回响应:

(environment_name) [root@APPCONTAINER project]# ping DBSERVER
PING DBSERVER (DB_SERVER_IP) 56(84) bytes of data.
64 bytes from DBSERVER (DB_SERVER_IP): icmp_seq=1 ttl=117 time=95.9 ms
64 bytes from DBSERVER (DB_SERVER_IP): icmp_seq=2 ttl=117 time=96.2 ms
64 bytes from DBSERVER (DB_SERVER_IP): icmp_seq=3 ttl=117 time=95.7 ms

什么不起作用

但是,当我尝试使用 pgcli 连接时,我发现无法连接:

(environment_name) [root@APPCONTAINER project]# pgcli -h $DB_SERVER -p $DB_PORT -U $DB_USER -d $DB_NAME
could not send SSL negotiation packet: Resource temporarily unavailable

此外,在我的 Python 应用程序中,我们同时使用了 psycopg2sqlalchemy(在代码库的不同部分),我发现我们无法连接到数据库。另一方面,从我的本地计算机(即我的笔记本电脑或其他本地工作站)连接没有问题。

我的主要问题是 Python 应用程序需要通过 psycopg2sqlalchemy 连接到数据库,但这不起作用。

当前假设

总而言之,关于如何调试,我在这里画了一个空白,所以我要求提供调试策略(即我应该看什么),希望有一些关于如何调试的文档指针。 (确切的命令 - 如果指向文档页面,我很乐意查找它们。)我想到但不确定如何查看的东西是:

我已经完成的事情是:

还有其他我可能错过的调试策略吗?我很想开导他们!

我相信这个问题得到了回答 on twitter,但问题是用户没有在他们的 AWS 账户上创建正确的安全组规则来允许从服务器到数据库的流量。