我的 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/

    10-07 18:39