Docker 如何将端口反向公开给容器?

Docker 如何将端口反向公开给容器?,docker,networking,port,Docker,Networking,Port,我是Docker的新手,我可能没有在文档中查找正确的位置,因为我找不到一种方法来执行我称之为“反向公开”的操作 例如,我有一个web应用程序,EXPOSE 80。同一个应用程序正在使用postgresql数据库。当我在本地开发应用程序时,它工作正常,因为我连接到localhost:5432,但当我将应用程序容器化时,它会显示类似“拒绝连接”的内容。我认为Docker的理念是尽可能多地进行集装箱运输,并使这些集装箱通过Docker网络相互通信。但我很好奇,是否可以说我的容器中的localhost:

我是Docker的新手,我可能没有在文档中查找正确的位置,因为我找不到一种方法来执行我称之为“反向公开”的操作


例如,我有一个web应用程序,
EXPOSE 80
。同一个应用程序正在使用postgresql数据库。当我在本地开发应用程序时,它工作正常,因为我连接到
localhost:5432
,但当我将应用程序容器化时,它会显示类似“拒绝连接”的内容。我认为Docker的理念是尽可能多地进行集装箱运输,并使这些集装箱通过Docker网络相互通信。但我很好奇,是否可以说我的容器中的
localhost:5432
实际上是指托管我的容器的实际机器上的端口5432。

当应用程序在容器中运行时,你应该使用主机的
IP:5432
例如
192.168.99.100:5432
,而不是
localhost


在容器中使用
localhost
时,它指的是容器的
localhost(127.0.0.1)
,而不是主机的。

容器中的localhost不是docker主机,它是容器中的命名空间网络。因此,如果您尝试在容器内与localhost或127.0.0.1通信,它只会与该容器内运行的其他应用程序通信


相反,您应该使用主机的可路由IP,以便请求可以从容器中出来并返回docker主机接口,以到达容器外运行的应用程序。

downvoter解释您自己是的,我知道,但是如果docker主机没有公共IP怎么办?docker主机不需要公共IP。只需使用docker主机的ip(
docker machine ip
)docker正在设置一个环境变量,这样我就可以在容器中动态获取主机ip的值。如果我在代码中写入ip并将容器移动到另一台机器上,它可能会指向一个死位置。Docker不会注入这样的环境变量(这可能会被用作信息泄漏和潜在的安全漏洞载体)。您需要自己指定环境变量。@BMitch感谢这是非常有用的信息,我成功地将此信息保存在容器中,并成功连接到docker主机的postgresql进程。