如何从主机连接到Docker容器的链接别名

4
我有一个Docker化应用的3个独立部分:
  • nodeapp:运行一个expressjs应用程序的node:latest Docker容器,当从/api访问时返回JSON对象。该服务器也可以根据this site启用CORS。
  • nginxserver:一个nginx:latest静态服务器,简单地托管一个index.html文件,允许用户单击按钮,向上面的节点服务器发出XMLHttpRequest。
  • 我的主机机器
node:latest通过3000:80将其端口暴露给主机。 nginx:latest 通过8080:80将其端口暴露给主机。
主机我可以单独访问nodeappnginxserver:我可以使用命令行中的curl发出请求并查看从节点服务器返回的JSON对象,当我点击localhost:8080时,屏幕上会显示按钮(index.html)。

然而,当我尝试点击该按钮时,对XMLHttpRequest('GET', 'http://nodeapp/api', true)的调用失败,似乎没有触及nodeapp服务器(没有日志)。 我认为这是因为主机不理解http://nodeapp/api

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

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

这里是一个示例存储库的链接

编辑:我注意到当使用堆栈时,单击按钮会从我的nginx容器中发送响应。 我不明白为什么它要通过该服务器进行路由,因为nodeapp在我的hosts文件中,所以它应该能够识别相关性?


你是正确的,你的主机不理解nodeapp,你可以使用nginx重定向功能来指向nginx。 - Larry Cai
1个回答

1
问题:
在内部网络中存在nodeapp,只有您的nginxserver可以访问它。您可以通过输入nginxserver来检查此情况。
docker exec -it nginxserver bash 
# cat /etc/hosts

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

host (client) -> nginxserver -> nodeapp

简单粗暴的解决方案:

如果您真的非常希望您的客户端(主机)可以访问内部应用程序nodeapp,那么您只需更改下面的代码

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

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

在您的docker-compose.yml文件中,nodeapp服务端口80在家庭网络中以3000的形式暴露,可以直接访问。

更好的解决方案

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接