如何从 Docker 容器访问主机上的 API?

How do I access an API on my host machine from a Docker container?

我有一个 docker-compose 可以启动 2 个 Docker 容器。一个是应用程序(port:8090),另一个是数据库(port:5432)。我还有一个 Windows 应用程序,它有一个 API 可通过 localhost:8002 访问。我想使用装有应用程序的容器从 localhost:8002 API 读取数据,然后将该数据移动到我另一个 Docker 容器中的数据库。

对于docker-compose,我分别为数据库和应用程序容器映射了port 5432:5432port 8090:8090。我已经测试了我的应用程序 non-dockerized 我调用 Windows API 然后将其写入 port:5432 并且它正常工作。

但是,在 Docker 化我的应用程序之后,localhost:8002 现在不再是我的 Docker 化应用程序的本地主机,现在无法访问。我想知道如何到达我的主机 localhost:8002,点击 API,然后将该数据移动到我的另一个容器。

经过 16 个小时的鲜血、汗水和泪水。主要是眼泪,这是未来可能使用它的人的答案。

TL;DR 通过以下方式将您的本地 nat 网络暴露给 docker-compose 中的 docker 容器:

networks:
  default:
    external: true
    name: nat

请注意,在 Windows 上,运行宁一个 docker network ls 应该给出如下内容:

NETWORK ID     NAME             DRIVER    SCOPE
6b30a7dcf6e0   Default Switch   ics       local
26305680ad62   WSL              ics       local
b52f5e497eba   nat              nat       local
4a4fd550398f   none             null      local

docker-compose 只是将 docker 网络连接到您的主机网络(计算机重启后 auto-restart 容器也需要,但 off-topic)。

之后,我不得不 运行 一个 ipconfig 来找到与我的 nat 端口相对应的 IPv4 端口。在这里,可以有很多IPv4个IP地址,找到那个Ethernet adapter vEthernet (nat).

然后,使用对应于 nat 网络的 IPv4 Address 用于本地机器上的任何应用程序 运行ning。

例如,我的申请 运行 localhost:8002。在这里,我将主机更改为 http://172.31.160.1:8002 并且它起作用了。