我有一個 create-react-app 應用程式,使用以下Dockerfile進行容器化。
FROM node:10-alpine as build
WORKDIR /app
COPY package.json .
RUN npm install --production
COPY . .
RUN npm run build
FROM nginx:1.21.5-alpine
RUN rm -rf /etc/nginx/conf.d
COPY conf /etc/nginx
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Nginx 的 conf.d
upstream api {
server api:5000;
}
server {
listen 80;
location / {
root /usr/share/nginx/html;
}
}
server {
listen 5000;
location / {
proxy_pass http://api;
}
}
我有一個 expressjs 應用程式,使用以下Dockerfile進行容器化。
FROM node:10-alpine
WORKDIR /app
COPY package.json /app
RUN npm install --production
COPY . /app
CMD node index.js
EXPOSE 5000
我為每個應用程式構建 docker 鏡像,所以我必須 docker 鏡像:
- NginxImage(ReactJS 應用程式)
- NodeJsImage
我嘗試使用帶有以下docker-compose的 docker 運行這兩個影像:
version: "3.4"
services:
app:
image: NginxImage
hostname: app
ports:
- "3001:80"
networks:
- local_deploy
api:
image: NodeJsImage
hostname: api
ports:
- "5001:5000"
networks:
- local_deploy
networks:
local_deploy:
driver: bridge
但是當我嘗試在瀏覽器中打開 reactjs 應用程式時,當 reactjs 應用程式呼叫http://api:5000時出現錯誤ERR_NAME_NOT_RESOLVED
我嘗試訪問容器內的 api
docker exec -it app /bin/sh
我可以從 api 得到回應
# curl api:5000
我的反向代理是否配置不正確?
uj5u.com熱心網友回復:
感謝@David 、@Beppe和@Yusuf的提示。就我而言,我只是將 API 端點更改為它自己的應用程式地址。
應用程式運行時的示例
localhost:3001
然后我將 api 端點設定為
localhost:3001/api
在 nginx 配置中,我在服務器塊中添加了另一個具有重寫條件的位置
upstream api {
server api:5000;
}
server {
listen 80;
location / {
root /usr/share/nginx/html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://api
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/415427.html
標籤:
