我的 dockerized 应用程序有 3 个单独的部分:
nodeapp
:运行 expressjs 应用程序的 node:latest
docker 容器,从 /api
访问时返回 JSON 对象。该服务器还根据 this site 启用了 COR。 nginxserver
:一个 nginx:latest
静态服务器,它只托管一个 index.html
文件,允许用户单击一个按钮,使 XMLHttpRequest 发送到上面的 Node 服务器。 node:latest
的端口通过 3000:80
暴露给主机。nginx:latest
的端口通过 8080:80
暴露给主机。从 主机 我可以分别访问 nodeapp 和 nginxserver :我可以从命令行使用
curl
发出请求并查看从 Node 服务器返回的 JSON 对象,并且按钮 (index.html) 可见当我点击 localhost:8080
时在屏幕上。但是,当我尝试单击该按钮时,对
XMLHttpRequest('GET', 'http://nodeapp/api', true)
的调用失败了,但似乎并未命中 nodeapp
服务器(不存在日志)。我假设这是因为 主机 不理解 http://nodeapp/api
。有没有办法告诉 docker 在容器运行时将其容器链接别名添加到我的主机文件中?
我不知道我的问题是否是我问题的正确解决方案。看起来好像我收到了一个 CORs 错误返回,但我认为它从未击中我的服务器。这是否与从我的主机访问应用程序有关?
Here is a link to an example repo
编辑 :我注意到当使用堆栈时,单击按钮会从我的 nginx 容器 发送 响应。我很困惑为什么它通过该服务器路由,因为
nodeapp
在我的 hosts
文件中,所以它应该识别那里的相关性? 最佳答案
问题 :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
作为前端 Node ,请参阅示例 http://schempy.com/2015/08/25/docker_nginx_nodejs/