你如何与容器化的 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 容器都有自己的端口,默认情况下对主机和其他容器是关闭的,你应该用 network
或 expose
打开它们(我会描述它)。
不清楚你的 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 容器
- 带有一些数据库的容器
出于安全原因,您应该关闭 Droplet 上除 80 和 443 端口之外的所有端口。最好只打开您需要 public 的端口。 80 和 443 端口允许用户使用 HTTP/HTTPS.
连接到您的服务器
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
.
连接到数据库
好的,您将 FastApi 容器连接到 DB 容器并可以向 DB 发出请求。但是您想在主机(液滴)之外看到您的 fastApi 应用程序。然后,您应该打开端口。假设你 运行 你的 fastApi 应用在 8080 端口。您应该使用 --expose
选项 (https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose) 在容器中公开此端口。
仅添加带有端口的 --expose
选项是不够的。它只是在您的容器内打开端口,但您的主机(液滴)没有连接到它。您应该使用 --publish
选项将主机的某个端口映射到容器的公开端口(请参阅上面的最后一个 link)。
一开始我们关闭了除80和443之外的所有端口。您可以使用Nginx将所有请求代理到您关闭的端口。例如,您可以将来自 http://ip:80/api 的所有请求代理到您的 localhost:8080 以使其工作。
可选。如果您的 Droplet 中只有 DB 容器并且想要连接到 Droplet 和数据库。您可以公开数据库的端口并将其映射到某个液滴的端口。然后,您可以打开 Droplet 的端口并连接到它,但我不建议以不安全的方式进行连接。您还可以通过 SSL 从您的 API 连接到您的数据库(我认为至少您应该为它设置 SSH)。
我对这个过程有点模糊...
我有一个只允许 443 和 80 的 ufw 设置..它直接进入网络服务器(nginx 容器)
处理对我网站的任何请求。
我还有一个 fastapi 容器,它通过查看 digitalocean ip 地址 + postgres 容器端口连接到 postgres 容器。
它在 droplet 内部,所以它可以与共享相同 ip 的其他容器通信?无论如何..它有效。尽管我不明白如何,因为它没有在 nginx 中配置...
但是当我尝试从 fastapi 容器中请求某些东西时,确切的过程是什么?
如果我尝试从我的容器化应用程序中获取一些 json..使用 droplet ip + fastapi 端口号会导致超时..
有没有一种方法可以像连接到 postgres 容器一样连接到 fastapi 容器?
谢谢
一些理论:
您有一个 Droplet,它有自己的端口,可以在互联网上关闭或打开。 Droplet是docker的宿主。每个 docker 容器都有自己的端口,默认情况下对主机和其他容器是关闭的,你应该用 network
或 expose
打开它们(我会描述它)。
不清楚你的 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 容器
- 带有一些数据库的容器
出于安全原因,您应该关闭 Droplet 上除 80 和 443 端口之外的所有端口。最好只打开您需要 public 的端口。 80 和 443 端口允许用户使用 HTTP/HTTPS.
连接到您的服务器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
并将其连接到某个网络。因此,当我 运行 我的容器与具有相同网络的应用程序时,我应该使用 urlmongodb://mongo:27017
.好的,您将 FastApi 容器连接到 DB 容器并可以向 DB 发出请求。但是您想在主机(液滴)之外看到您的 fastApi 应用程序。然后,您应该打开端口。假设你 运行 你的 fastApi 应用在 8080 端口。您应该使用
--expose
选项 (https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose) 在容器中公开此端口。仅添加带有端口的
--expose
选项是不够的。它只是在您的容器内打开端口,但您的主机(液滴)没有连接到它。您应该使用--publish
选项将主机的某个端口映射到容器的公开端口(请参阅上面的最后一个 link)。一开始我们关闭了除80和443之外的所有端口。您可以使用Nginx将所有请求代理到您关闭的端口。例如,您可以将来自 http://ip:80/api 的所有请求代理到您的 localhost:8080 以使其工作。
可选。如果您的 Droplet 中只有 DB 容器并且想要连接到 Droplet 和数据库。您可以公开数据库的端口并将其映射到某个液滴的端口。然后,您可以打开 Droplet 的端口并连接到它,但我不建议以不安全的方式进行连接。您还可以通过 SSL 从您的 API 连接到您的数据库(我认为至少您应该为它设置 SSH)。