使用 docker 部署 Vue 前端和 .net 后端,前端未解析后端容器名称
Using docker to deploy Vue frontend and .net backend, frontend not resolving backend container name
我正在尝试在前端部署 Vue 应用程序,在后端部署 .net 核心 api。使用 docker-compose 文件,我已经能够启动网络和容器,但我很难让它们进行通信。我对 docker 还很陌生,请理解 Vue 应用程序 docker 文件使用 Nginx 基础来提供网络应用程序,但它似乎可能会影响网络通信,因为前端容器无法解析后端容器名称虽然应该,因为它们与默认网桥驱动程序位于同一虚拟专用网络中。在前端容器中执行 bash shell 并对后端容器执行 curl 时,我确实得到了正确的响应。
我确实尝试将后端容器暴露给主机,然后使用服务器 IP 从前端访问它,但确实有效,我希望不必以这种方式暴露我的 api并希望尽可能通过 docker 虚拟专用网络运行。
示例url 我在前端尝试遇到名称未解析错误:littlepiggy-api/api 或 littlepiggy-api:5000/api
前端Docker文件
FROM node:14.18-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY ./ .
RUN npm run build
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
后端Docker文件
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5000
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["LittlePiggy.Api/LittlePiggy.Api.csproj", "LittlePiggy.Api/"]
RUN dotnet restore "LittlePiggy.Api/LittlePiggy.Api.csproj"
COPY . .
WORKDIR "/src/LittlePiggy.Api"
RUN dotnet build "LittlePiggy.Api.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "LittlePiggy.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "LittlePiggy.Api.dll"]
Docker-编写文件
version: '3'
services:
front:
container_name: littlepiggy-front
image: josh898/angie-app-front:latest
ports:
- 80:80
networks:
- littlepiggy
depends_on:
- api
api:
container_name: littlepiggy-api
image: josh898/angie-app-backend:latest
networks:
- littlepiggy
networks:
littlepiggy:
driver: bridge
您需要配置 Nginx 以将与 /api 路由匹配的请求传递到后端服务。
如果你像这样创建一个名为 nginx.conf 的 nginx 配置文件,并将其放在你的前端目录中
server {
listen 80;
location / {
index index.html;
root /usr/share/nginx/html;
try_files $uri $uri/ $uri.html =404;
}
location /api/ {
proxy_pass http://littlepiggy-api/;
}
}
然后通过将前端 Dockerfile 更改为
将其复制到前端容器中
FROM node:14.18-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY ./ .
RUN npm run build
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
然后对 http:///localhost/api/xxxx 的请求应该传递到后端,对 http:///localhost/index 的请求应该由 Nginx 容器直接提供服务。
我正在尝试在前端部署 Vue 应用程序,在后端部署 .net 核心 api。使用 docker-compose 文件,我已经能够启动网络和容器,但我很难让它们进行通信。我对 docker 还很陌生,请理解 Vue 应用程序 docker 文件使用 Nginx 基础来提供网络应用程序,但它似乎可能会影响网络通信,因为前端容器无法解析后端容器名称虽然应该,因为它们与默认网桥驱动程序位于同一虚拟专用网络中。在前端容器中执行 bash shell 并对后端容器执行 curl 时,我确实得到了正确的响应。
我确实尝试将后端容器暴露给主机,然后使用服务器 IP 从前端访问它,但确实有效,我希望不必以这种方式暴露我的 api并希望尽可能通过 docker 虚拟专用网络运行。
示例url 我在前端尝试遇到名称未解析错误:littlepiggy-api/api 或 littlepiggy-api:5000/api
前端Docker文件
FROM node:14.18-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY ./ .
RUN npm run build
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
后端Docker文件
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5000
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["LittlePiggy.Api/LittlePiggy.Api.csproj", "LittlePiggy.Api/"]
RUN dotnet restore "LittlePiggy.Api/LittlePiggy.Api.csproj"
COPY . .
WORKDIR "/src/LittlePiggy.Api"
RUN dotnet build "LittlePiggy.Api.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "LittlePiggy.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "LittlePiggy.Api.dll"]
Docker-编写文件
version: '3'
services:
front:
container_name: littlepiggy-front
image: josh898/angie-app-front:latest
ports:
- 80:80
networks:
- littlepiggy
depends_on:
- api
api:
container_name: littlepiggy-api
image: josh898/angie-app-backend:latest
networks:
- littlepiggy
networks:
littlepiggy:
driver: bridge
您需要配置 Nginx 以将与 /api 路由匹配的请求传递到后端服务。
如果你像这样创建一个名为 nginx.conf 的 nginx 配置文件,并将其放在你的前端目录中
server {
listen 80;
location / {
index index.html;
root /usr/share/nginx/html;
try_files $uri $uri/ $uri.html =404;
}
location /api/ {
proxy_pass http://littlepiggy-api/;
}
}
然后通过将前端 Dockerfile 更改为
将其复制到前端容器中FROM node:14.18-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY ./ .
RUN npm run build
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
然后对 http:///localhost/api/xxxx 的请求应该传递到后端,对 http:///localhost/index 的请求应该由 Nginx 容器直接提供服务。