【问题标题】:Docker + nginx + angular +Spring BootDocker + nginx + 角度 +Spring Boot
【发布时间】:2021-04-27 19:07:44
【问题描述】:

我正在尝试一个使用 docker compose 的带有 spring boot 后端的简单 angular 应用程序。但是我的前端在调用时似乎找不到后端 api。以下是相关文件。

用于后端的 Docker 文件

#
# Build
#
FROM maven:3.6.0-jdk-11-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package

#
# Package stage
#
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"]

前端角度的 Docker 文件

FROM node:alpine AS builder

WORKDIR /app

COPY . .

RUN npm install && \
    npm run build

FROM nginx:alpine

COPY --from=builder /app/dist/* /usr/share/nginx/html/
COPY /nginx.conf /etc/nginx/conf.d/default.conf

使用的 NGINX 配置文件

server {
    include /etc/nginx/extra-conf.d/*.conf;
    
    listen 80;
    server_name frontend;
    
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri $uri/ /index.html =404;
    }
    
    location /api/ { 
        proxy_http_version 1.1;
        #proxy_pass http://<ContainerName>:<PortNumber>; 
        # In our case Container name is as we setup in docker-compose `beservice` and port 8080
        proxy_pass http://backend:8080/api/;   
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_cache_bypass $http_upgrade;
    } 
}

Docker 编写 Yml

version: "3.9"

services:
    backend:
        image: demo
        container_name: demo
        build:
            context: ./demo
        ports:
            - 8080:8080
    frontend:
        image: demo-ui
        container_name: demo-ui
        build:
            context: ./my-demo-ui
        ports:
            - 80:80
        depends_on:
            - backend
        links: 
            - backend

前端应用程序出现了,但是当我点击后端应用程序(通过 angular/nginx)时,它给出了 502 Bad Gateway Error。

我还看到这些打印在 docker 的 NGINX 控制台中

 [error] 30#30: *1 connect() failed (110: Operation timed out) while connecting to upstream, client: 172.18.0.1, server: , request: "GET /api/demoMethod HTTP/1.1", upstream: "http://172.17.0.2:8080/api/demoMethod", host: "localhost", referrer: "http://localhost/home"

【问题讨论】:

  • 在 Compose 日志中,当您收到此错误时,backend 容器是否已启动并正在运行?可以直接从主机连接到http://localhost:8080吗?是否有任何代码或配置可以在后端设置网络侦听器?
  • 我可以看到后端确实出现了。没有可以在后端设置网络侦听器的特定代码。我也试过 localhost:8080 并且它确实有效。
  • 您是否正确设置了 CORS 配置?由于前端和后端运行在不同的端口上,请求默认会被后端阻塞。
  • 是的。 Cors 设置正确。
  • 请提供minimal reproducible example。重现您的问题以进行分析很有帮助。

标签: java angular docker nginx


【解决方案1】:

这里你缺少 Docker-compose 文件中的网络配置,你需要链接你的两个容器,以便它们可以互相看到。

【讨论】:

  • 这对于 Docker Composer 来说不是必需的。这是创建桥接网络的默认配置,并且还设置了链接。
【解决方案2】:

在你的 docker-compose 文件中

container_name: demo

但在 nginx 配置中,您使用的是名称 backend。您必须在 nginx 配置中使用容器名称 demo。服务名backend只能在docker-compose文件中使用。

另外:

警告

--link 标志是 Docker 的遗留功能。它最终可能会被删除。除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不是使用 --link。

用户定义的网络不支持的一个特性,你可以使用 --link 来实现,那就是在容器之间共享环境变量。但是,您可以使用卷等其他机制以更可控的方式在容器之间共享环境变量。

Docker Composer doc

【讨论】:

  • 我尝试使用容器名称。但没有运气。我在 docker 控制台中看到的这个错误 - demo-ui | 2021/01/24 03:14:57 [error] 30#30: *2 connect() failed (110: Operation timed out) while connecting to upstream, client: 172.18.0.1, server: , request: "GET /api/demoMethod HTTP/1.1", upstream: "http://172.17.0.2:8080/api/demoMethod", host: "localhost", referrer: "http://localhost/home"
猜你喜欢
  • 2018-06-08
  • 2022-11-09
  • 2018-05-08
  • 2019-05-08
  • 1970-01-01
  • 2020-01-09
  • 2018-12-15
  • 2018-01-23
  • 2021-05-04
相关资源
最近更新 更多