gpt4 book ai didi

node.js - 如何从主机连接到 docker 容器的链接别名

转载 作者:搜寻专家 更新时间:2023-10-31 23:24:30 27 4
gpt4 key购买 nike

我的 dockerized 应用程序有 3 个独立的部分:

  • nodeapp:一个 node:latest docker 容器运行一个 expressjs 应用程序,当从 /api< 访问时返回一个 JSON 对象。此服务器还根据 this site 启用了 COR .
  • nginxserver:一个 nginx:latest 静态服务器,仅托管一个 index.html 文件,允许用户单击一个按钮,该按钮会将 XMLHttpRequest 发送到上面的 Node 服务器。
  • 我的主机机器

node:latest 的端口通过 3000:80 暴露给主机。

nginx:latest 的端口通过 8080:80 暴露给主机。

host 我可以访问 nodeappnginxserver 单独:我可以发出请求并查看从命令行使用 curl 从 Node 服务器返回的 JSON 对象,当我点击 localhost:8080 时,按钮 (index.html) 在屏幕上可见。

但是,当我尝试单击按钮时,对 XMLHttpRequest('GET', 'http://nodeapp/api', true) 的调用失败了,似乎没有点击 nodeapp 服务器(不存在日志)。我假设这是因为 host 不理解 http://nodeapp/api

有没有办法告诉 docker 在容器运行时将其容器链接别名添加到我的主机文件?

我不知道我的问题是否是我问题的正确解决方案。看起来好像我收到了 CORs 错误返回,但我认为它从未影响过我的服务器。这与从我的主机访问应用程序有关吗?

Here is a link to an example repo

编辑:我注意到在使用堆栈时单击按钮会发送来 self 的 nginx 容器的响应。我很困惑为什么它通过该服务器路由,因为 nodeapp 在我的 hosts 文件中,所以它应该识别那里的相关性?

最佳答案

问题:

nodeapp存在于内网,只有你的nginxserver可见,你可以输入nginxserver

查看
docker exec -it nginxserver bash 
# cat /etc/hosts

最重要的是,您的服务设置不正确,nginxserver 应作为nodeapp 前面的反向代理

host (client) -> nginxserver -> nodeapp

肮脏的快速解决方案:

如果你真的想让你的客户端(host)访问内部应用程序nodeapp,那么你只需更改下面的代码

XMLHttpRequest('GET', 'http://nodeapp/api', true)

XMLHttpRequest('GET', 'http://localhost:3000/api', true)

由于在您的 docker-compose.yml 中,nodeapp 服务端口 80 在家庭网络中公开为 3000,可以直接访问。

更好的解决方案

您需要重新设计您的服务堆栈,使 nginxserver 作为前端 Node ,参见一个示例 http://schempy.com/2015/08/25/docker_nginx_nodejs/

关于node.js - 如何从主机连接到 docker 容器的链接别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34162231/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com