【问题标题】:how do you communicate with containerized apis你如何与容器化 api 通信
【发布时间】:2021-09-08 18:37:25
【问题描述】:

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

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

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

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

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

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

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

有没有办法像连接到 postgres 容器一样连接到 fastapi 容器?

谢谢

【问题讨论】:

  • 如果容器在同一个 docker 网络上,它们可以使用容器名称相互通信。这样您就可以依赖静态容器名称而不是 IP 地址。希望这会有所帮助!

标签: docker nginx fastapi


【解决方案1】:

一点理论:

你有一个拥有自己端口的 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 的 Internet 端口,因为它不安全,并且可能会在未来引起安全问题。 p>


更广泛的答案与 docker 文档的链接:

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

  • 一个数字海洋水滴
  • 带有您的应用的 fastApi 容器
  • 带有一些 DB 的容器
  1. 出于安全原因,您应该关闭 Droplet 上除 80 和 443 端口之外的所有端口。最好只打开需要公开的端口。 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> 选项来更改容器的名称。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多