首页 > 解决方案 > 如何处理更改 docker compose 容器的 ips?

问题描述

我已经设置了一个应用程序,其中 nodejs 后端必须通过反应前端与 rasa 聊天机器人后端进行通信。所有服务都通过同一个 docker-compose 运行。作为 docker 初学者,有些事情我不确定:

主机和容器之间的通信是使用容器的 ip 完成的

然而,两个 docker 容器之间的通信完成的是容器的名称:

我的问题是,当我需要从我的反应前端联系 rasa 后端时,我需要放置 rasa docker 容器的 ip,它(有时)会在 docker-compose 重新初始化时发生变化。要解决此问题,我会docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app_rasa_1获取 ip 并将其手动更改为 react 前端。

有没有办法避免一起更改 ip 并使用容器名称(或别名/链接),或者有什么方法可以在反应前端自动更改容器的 ip(是否通过脚本更新环境变量是一个选项?)

标签: dockerdocker-compose

解决方案


完全忽略容器专用 IP 地址。它们是具有几个实际问题的实现细节,包括(如您所见)它们在重新创建容器时发生变化。(它们在非 Linux 主机上也无法访问,或者如果浏览器与容器不在同一主机上。)

您在问题中显示了正确的模式。对于容器之间的调用,使用容器名称作为主机名(此设置在 Compose 中的网络中有更多描述。对于来自外部容器的调用,包括来自基于浏览器的应用程序,使用主机的 DNS 名称或 IP 地址以及来自ports:你发布。

如果浏览器应用程序需要联系后端服务器,它需要一个路径来执行此操作。这可以通过发布ports:,或者您的其他组件之一可以将请求代理到服务(可能使用express-http-proxy中间件)。

仅代理到其他后端服务的专用容器也是一种有用的模式(Docker Nginx 代理:如何使用路径而不是主机名将流量路由到不同的容器包括一些示例),特别是因为这将允许您使用仅路径 URL,例如/api/rasa在您的浏览器应用程序中。如果 React 应用程序是从 提供的http://localhost:8080/,而主后端是http://localhost:8080/api,那么您可以只向 发出 HTTP 请求/api,它们将相对于页面的 URL 进行解释。这完全避免了主机名问题,只要您的反向代理具有到您需要直接联系的每个容器的基于路径的路由。


推荐阅读