Tah*_*raf 2 java docker vue.js dockerfile docker-compose
我仍然在码头世界中找到自己的脚。我正在尝试 dockerize 我的小宠物项目。前端是一个 vue-cli 应用程序,它与包含 Spring Boot 制作的宁静 API 的后端通信。
所以我的方法是为后端和前端声明两个单独的 dockerfile,并通过一个 docker compose 文件将它们组合起来。所以文件夹结构是 -
backend/
- Dockerfile
frontend/
- Dockerfile
docker-compose.yml
Run Code Online (Sandbox Code Playgroud)
由于前端需要能够调用后端服务,我创建了一个桥接网络并在它们之间共享网络。这是我的 docker compose 文件 -
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
Run Code Online (Sandbox Code Playgroud)
我在后端公开了一个名为/api/findAll. 现在,如果前端服务通过http://localhost:8098:/api/findAll(主机网络)调用 API ,我可以从我的浏览器(http://localhost:8812)查看它,一切正常。
但是如果前端使用backend:8098/api/findAll;调用相同的 API 利用桥接网络 - 它在我的浏览器中出错 -
如果我docker exec在前端做 a并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
Run Code Online (Sandbox Code Playgroud)
后端 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"]
Run Code Online (Sandbox Code Playgroud)
此设置的重要一点是您的实际前端代码不是在 Docker 中运行,而是在您的浏览器中运行。这意味着它不了解 Docker 网络、容器或其他任何东西;您提供的 URL 必须是到达主机上已发布端口的 URL。这就是为什么localhost在这里工作(如果浏览器和容器在同一主机上运行)但backend没有。
一种典型的方法是设置某种反向代理,既可以托管前端应用程序代码,又可以代理后端应用程序。(例如,将 Nginx 设置为它的/apiroute proxy_pass http://backend:8098,它的/route 要么是try_files一个预构建的 Javascript 应用程序,要么是proxy_pass http://frontend:8080。)
如果你这样做,那么从浏览器的角度来看,eg http://localhost:8900是前端,http://localhost:8900/api是后端。这避免了@coedycode 在他们的回答中提示的 CORS 问题;但这也意味着前端代码可以使用相对 URL /api(没有主机名)并避免整个问题。
+-------------+ | Docker > / +----------+
+-------------+ | /------> | frontend |
| | localhost:8900 | +-------+ | +----------+
| Browser | ---------------> | -> | nginx | -> +
| | | +-------+ | /api +----------+
| | | \------> | backend |
+-------------+ | +----------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1326 次 |
| 最近记录: |