java - Web容器无法从docker compose调用后端容器

标签 java docker vue.js docker-compose dockerfile

我仍在 docker 世界中找到自己的立足点。我正在尝试将我的小宠物项目 Docker 化。前端是一个 vue-cli 应用程序,它与包含 spring boot 制作的 Restful API 的后端进行通信。

所以我的方法是为后端和前端声明两个单独的 dockerfile,并通过一个 docker compose 文件将它们组合起来。所以文件夹结构是 -

backend/
       - Dockerfile
frontend/
       - Dockerfile
docker-compose.yml

由于前端需要能够调用后端服务,我创建了一个桥接网络并在它们之间共享网络。这是我的 docker 撰写文件 -

version: "2"
services:
  backend:
    build: backend/.
    networks:
      - movie-network
    ports:
      - "8098:8098"
  frontend:
    build: frontend/.
    ports:
      - "8812:8080"
    networks:
      - movie-network

networks:
  movie-network:
    driver: bridge

我在后端公开了一个名为 /api/findAll 的端点。现在,如果前端服务通过 http://localhost:8098:/api/findAll (主机网络)调用 API,我可以从浏览器( http://localhost:8812 )查看它,一切正常。

但是如果前端使用 backend:8098/api/findAll 调用相同的 API;使用桥接网络 - 它在我的浏览器中出现错误 -

error

如果我在前端执行 docker exec 并 ping 后端,则 ping 成功

那么,为什么我的浏览器出现错误( http://localhost:8812 )?我在概念上做错了什么吗?寻求建议。

前端 Dockerfile -

FROM node:lts-alpine

# install simple http server for serving static content
RUN npm install -g http-server

# make the 'app' folder the current working directory
WORKDIR /app

# copy both 'package.json' and 'package-lock.json' (if available)
COPY package*.json ./

# install project dependencies
RUN npm install

# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY . .

# build app for production with minification
RUN npm run build

EXPOSE 8080

后端 Dockerfile -

FROM openjdk:11-jre-slim
# Creating app directory
WORKDIR /usr/src/movies
# Copying Jar (didn't use FROM maven to save some time)
COPY target/movies*.jar movies.jar

RUN pwd

RUN ls -la
# Exposing Port
EXPOSE 8098
# Running App
ENTRYPOINT ["java","-jar","/usr/src/movies/movies.jar"]

最佳答案

此设置的重要一点是,您的实际前端代码不是在 Docker 中运行,而是在您的浏览器中运行。这意味着它不了解 Docker 网络、容器或其他任何东西;您提供的 URL 必须能够到达主机上已发布的端口。这就是为什么localhost在这里工作(如果浏览器和容器在同一主机上运行)但是 backend没有。

典型的方法是设置某种反向代理,既可以托管前端应用程序代码,又可以代理后端应用程序。 (例如,设置 Nginx,其 /api 路由 proxy_pass http://backend:8098 ,其 / 路由 try_files 预构建的 Javascript 应用程序或 proxy_pass http://frontend:8080 。)

如果您这样做,那么例如 http://localhost:8900是前端,http://localhost:8900/api从浏览器的角度来看,是后端。这避免了 @coedycode 在 their answer 中暗示的 CORS 问题。 ;但这也意味着前端代码可以使用相对URL /api (没有主机名)并回避整个问题。

+-------------+                  | Docker >           /     +----------+
+-------------+                  |                 /------> | frontend |
|             |  localhost:8900  |    +-------+    |        +----------+
|   Browser   | ---------------> | -> | nginx | -> +
|             |                  |    +-------+    | /api   +----------+
|             |                  |                 \------> | backend  |
+-------------+                  |                          +----------+

关于java - Web容器无法从docker compose调用后端容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60986908/

相关文章:

angular - 从Linux创建ASP.NET Core 3.0 Angular Web应用程序镜像

vue.js - Vue : orderBy multiple fields

java - 确保没有随机序列无限重复

docker - Windows docker 容器中的 jfrog-cli - x509 : certificate signed by unknown authority

java - cc 内的 UIInput 值 :insertChildren are not redisplayed after validation failure

docker - Gitlab ci 不能运行超过 2 个 ssh 命令

javascript - 将 Vue 与 Vuex 结合使用时清除输入字段

php - Laravel - Axois 请求上不存在方法 [orderBy]

java - 在 Java 中使用函数指针作为简单的命令行解释器

Java REGEX .replaceall() 不适用于特定 JSON 对象(转换为字符串)