docker - 如何处理更改 docker compose 容器的 ips?
问题描述
我已经设置了一个应用程序,其中 nodejs 后端必须通过反应前端与 rasa 聊天机器人后端进行通信。所有服务都通过同一个 docker-compose 运行。作为 docker 初学者,有些事情我不确定:
主机和容器之间的通信是使用容器的 ip 完成的
- 浏览器打开正在运行的本地反应服务器
localhost:3000
或172.22.0.1:3000
- 浏览器向快速后端发送请求
localhost:4000
172.22.0.2:4000
然而,两个 docker 容器之间的通信完成的是容器的名称:
- rasa 服务器通过以下方式与 rasa 自定义操作服务器通信
http://action_server:5055/webhooks
- rasa 自定义操作服务器通过
http://backend_name:4000/users/
我的问题是,当我需要从我的反应前端联系 rasa 后端时,我需要放置 rasa docker 容器的 ip,它(有时)会在 docker-compose 重新初始化时发生变化。要解决此问题,我会docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app_rasa_1
获取 ip 并将其手动更改为 react 前端。
有没有办法避免一起更改 ip 并使用容器名称(或别名/链接),或者有什么方法可以在反应前端自动更改容器的 ip(是否通过脚本更新环境变量是一个选项?)
解决方案
完全忽略容器专用 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 进行解释。这完全避免了主机名问题,只要您的反向代理具有到您需要直接联系的每个容器的基于路径的路由。
推荐阅读
- javascript - 如何使下拉切换与 Javascript 一起使用?
- node.js - 如何使用 Nodejs、Angular 和 MongoDB 为费用管理应用程序构建构建适当的数据库?
- datepicker - Flatpickr 同一页面中的多个日期选择器
- pdf - 不同的pdf对应不同的cmap,如何制作一个全局的cmap,以便处理多个具有相同fontmap的pdf到/toUnicodemap
- python - 如何根据某些条件修改数据框并选择最后 3 行
- elasticsearch - Ambari 沙箱:elasticsearch 端口 9200 无法访问
- save - 在闪亮树中保存和恢复选择
- r - r data.table 过滤器基于满足条件的行数
- python - MEDIAN IF S 使用 Python Pandas 的 groupby
- html - 修复了正文溢出的 CSSGrid 导航栏