【问题标题】:Dockerized Angular/nginx app not talking to rest apiDockerized Angular/nginx 应用程序不与 rest api 交谈
【发布时间】:2018-09-19 19:20:42
【问题描述】:

我的前端有一个角度应用程序,我有一个在端口 3001 上侦听的 rest api(dockerized rails 后端)。

我正在使用以下命令运行我的 Angular 应用程序:

ng serve --proxy-config proxy.conf.json

并带有以下 proxy.conf.json 文件:

{
   "/server": {
     "target": "http://localhost:3001",
     "secure": false,
     "pathRewrite": {"^/server" : ""}
   },
   "/api": {
      "target": "http://localhost:3001",
      "secure": false
   },
   "/base": {
      "target": "http://localhost:3001",
      "secure": false
   },
   "/users": {
      "target": "http://localhost:3001",
      "secure": false
   }
}

这工作得很好——我的 Angular 应用程序在端口 4200 上运行,并与我的 dockerized 后端正常通信。

我现在也想使用 nginx 对前端进行 docker 化。

这是我的 dockerfile:

FROM node:8.9 as node

WORKDIR /app

COPY package.json /app/

RUN npm install
COPY ./ /app/

ARG env=prod

RUN npm run build -- --prod --environment $env

FROM nginx:1.13

COPY --from=node /app/dist/ /usr/share/nginx/html

COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

我的 nginx-custom.conf 看起来像这样:

server {
  listen 80;
  server_name  localhost;
  root   /usr/share/nginx/html;
  index  index.html index.htm;

  location /server {
      proxy_pass http://localhost:3001;
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      proxy_buffering off;
      proxy_set_header Accept-Encoding "";
  }
  location /api {
      proxy_pass http://localhost:3001;
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      proxy_buffering off;
      proxy_set_header Accept-Encoding "";
  }
  location /base {
      proxy_pass http://localhost:3001;
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      proxy_buffering off;
      proxy_set_header Accept-Encoding "";
  }
  location / {
    try_files $uri $uri/ /index.html =404;
  }
}

我通过应用构建:

docker build -t client:prod .

然后我开始我的应用程序:

docker run -p 80:80 client:prod

我的 Angular 应用程序正在端口 80 上运行,我看到了我的第一个屏幕,如预期的那样。但它不与我的休息 api 对话。在我的浏览器中,我看到我的 Angular 应用程序向 4200 发送 html 请求。我不确定这是正确的,根本原因是什么?由于我在端口 80 上使用 nginx - 我的 Angular 应用程序的请求现在不应该转到端口 80 吗?

我更改了我的 nginx 配置以侦听端口 4200,并使用端口 4200:4200 启动了我的 dockerized 应用程序,但这也不起作用。

知道这里有什么问题吗?

谢谢, 迈克尔

【问题讨论】:

  • 你找到答案了吗?

标签: angular docker nginx


【解决方案1】:

制作一个 docker-compose 文件。这将自动为您创建网络。同一网络上的容器可以互相访问。

也代替 localhost:3001 在你的 Nginx 配置中。使用 api:3001。 “api”是在 docker-compose 文件中定义的名称。 Docker 会将其解析为容器 IP 地址。

如果这能解决您的问题或需要更多信息,请告诉我。

【讨论】:

  • 你能看看this question吗?!我非常感谢有关docker-compose 文件的一些帮助。非常感谢!
  • @celb 看起来您已经对您在该页面上提出的问题得到了一些很好的答案。如果这不起作用,请告诉我,我可以提供帮助。
【解决方案2】:

我认为问题是容器没有链接..所以他们看不到对方..

尝试使用 --link 参数运行(已弃用但仍然有效)或尝试为您的容器定义网络..

类似:

docker run -p 80:80 client:prod --link nomeofyourrailsbackendcontainer

或:

docker network create my-net

然后:

 docker network connect my-net client:prod

docker network connect my-net backendconatiner

希望对你有帮助!!

【讨论】:

  • 在测试时,我没有使用 docker 作为后端——我直接从控制台启动了 rails,它也没有工作。所以我认为它不应该是缺少的容器链接?我的 dockerized 前端是否应该能够访问其端口上的任何后端 - 无论后端是否 dockerized?
  • mm 我很确定你可以从你的主机做相反的访问容器暴露应用程序..所以4个例子如果你的前端站点在你的机器上的 localhost:4200 上运行它可以访问一个 dockeraized应用暴露到特定端口.. 不确定相反
  • 可能是角度容器内的本地主机与我机器上的本地主机不同?如果是 - 知道如何解决这个问题吗?
  • 嗯,我认为它不一样......容器是孤立的......但也许我错了。 .我现在才开始使用 docker
  • 您好,在容器内访问 localhost 肯定是行不通的。我现在将所有端口都更改为 4200,并且我正在使用我的机器 IP 地址进行代理设置。但我仍然从网关和以下消息中得到一个超时:
猜你喜欢
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2017-06-14
相关资源
最近更新 更多