你如何与容器化的 api 通信

how do you communicate with containerized apis

我对这个过程有点模糊...

我有一个只允许 443 和 80 的 ufw 设置..它直接进入网络服务器(nginx 容器)

处理对我网站的任何请求。

我还有一个 fastapi 容器,它通过查看 digitalocean ip 地址 + postgres 容器端口连接到 postgres 容器。

它在 droplet 内部,所以它可以与共享相同 ip 的其他容器通信?无论如何..它有效。尽管我不明白如何,因为它没有在 nginx 中配置...

但是当我尝试从 fastapi 容器中请求某些东西时,确切的过程是什么?

如果我尝试从我的容器化应用程序中获取一些 json..使用 droplet ip + fastapi 端口号会导致超时..

有没有一种方法可以像连接到 postgres 容器一样连接到 fastapi 容器?

谢谢

一些理论:

您有一个 Droplet,它有自己的端口,可以在互联网上关闭或打开。 Droplet是docker的宿主。每个 docker 容器都有自己的端口,默认情况下对主机和其他容器是关闭的,你应该用 networkexpose 打开它们(我会描述它)。


不清楚你的 fastApi 容器和 postgres 容器是否在同一个 droplet 上,所以我描述了常见的情况。

以下文字的小总结:

  • 要配置容器相互通信,请使用 docker 网络。

    您可以 运行 数据库:docker run --network <networkName> --network-alias <aliasName> <imageName>

    您的 API 容器:docker run --network <networkName> <imageName>

    然后,应用程序可以通过<protocol>://<aliasName>:<dbPort>连接到数据库。

  • 为了让您的主机连接到您的 docker 容器,您应该公开一些容器的端口并将其映射到一些主机的端口: docker run --expose <exposedPort> --publish <hostPort>:<exposedPort> <imageName>

  • 您可以在构建映像时公开端口,因此您不需要在 运行 命令中使用 --expose

  • 要打开你的互联网端口,你的 Droplet 应该保持端口打开,或者你可以使用 nginx 和代理打开端口到你的 <hostPort> 从上面的点

  • 我使用简单的 docker 命令作为描述想法的基础,但是您可以 运行 以上所有容器 docker compose

安全注意事项:如果你不明白你在做什么,我不建议你打开 DB 的互联网端口,因为它不安全并且会导致安全问题未来。


link 对 docker 文档的更广泛的回答:

那么,如果你有这样的工具:

  • 一个 digitalocean 液滴
  • 应用程序中的 fastApi 容器
  • 带有一些数据库的容器
  1. 出于安全原因,您应该关闭 Droplet 上除 80 和 443 端口之外的所有端口。最好只打开您需要 public 的端口。 80 和 443 端口允许用户使用 HTTP/HTTPS.

    连接到您的服务器
  2. Docker 允许容器使用网桥相互通信。您可以在此处阅读更多详细信息:https://docs.docker.com/engine/reference/commandline/network_create/

    为什么我们需要创建网络?当你 运行 docker 容器时,它们中的每一个都是隔离的,并且它的所有端口都是隐藏的。因此,您可以为 run 命令 (https://docs.docker.com/engine/reference/commandline/run/#connect-a-container-to-a-network---network) 添加选项 --network <networkName>。 所有连接到同一个 network-name 的容器都可以相互“通信”。您也可以使用 --network-alias <aliasName> 选项更改容器的名称。

    例如: 我最近 运行ned mongodb,所以 mongodb 默认情况下 运行ning 在容器内部的端口 27017 上。我设置别名 mongo 并将其连接到某个网络。因此,当我 运行 我的容器与具有相同网络的应用程序时,我应该使用 url mongodb://mongo:27017.

    连接到数据库
  3. 好的,您将 FastApi 容器连接到 DB 容器并可以向 DB 发出请求。但是您想在主机(液滴)之外看到您的 fastApi 应用程序。然后,您应该打开端口。假设你 运行 你的 fastApi 应用在 8080 端口。您应该使用 --expose 选项 (https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose) 在容器中公开此端口。

    仅添加带有端口的 --expose 选项是不够的。它只是在您的容器内打开端口,但您的主机(液滴)没有连接到它。您应该使用 --publish 选项将主机的某个端口映射到容器的公开端口(请参阅上面的最后一个 link)。

  4. 一开始我们关闭了除80和443之外的所有端口。您可以使用Nginx将所有请求代理到您关闭的端口。例如,您可以将来自 http://ip:80/api 的所有请求代理到您的 localhost:8080 以使其工作。

  5. 可选。如果您的 Droplet 中只有 DB 容器并且想要连接到 Droplet 和数据库。您可以公开数据库的端口并将其映射到某个液滴的端口。然后,您可以打开 Droplet 的端口并连接到它,但我不建议以不安全的方式进行连接。您还可以通过 SSL 从您的 API 连接到您的数据库(我认为至少您应该为它设置 SSH)。