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