【问题标题】:How to connect to docker container's link alias from host如何从主机连接到 docker 容器的链接别名
【发布时间】:2016-03-13 17:56:26
【问题描述】:

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

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

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

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

host 我可以同时访问 nodeappnginxserver 单独:我可以提出请求并查看从命令行使用curl 从节点服务器返回的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

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

【问题讨论】:

  • 你是正确的,你的主机不理解 nodeapp,你可以使用 nginx 重定向功能始终指向 nginx

标签: node.js nginx docker


【解决方案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.ymlnodeapp服务端口80在家庭网络中暴露为3000,可以直接访问。

更好的解决方案

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2016-05-29
    相关资源
    最近更新 更多