一般說明
你好。我正在嘗試為以下問題提出解決方案。我有一臺運行 docker 的主機,它應該為多個獨立的 Web 應用程式提供服務。每個應用程式都有一個前端(在 angular 中)和后端(在 NodeJS 中)。我在同一臺主機上運行 nginx(它可以訪問 SSL 證書等)。
請參閱下圖,描述我正在努力實作的目標。當用戶請求app1.example.com 時,應提供前端檔案。當app1.example.com/api/*被呼叫時,nginx 將請求傳遞給NodeJS后端。

我在網上找到的大多數文章都使用容器化的 nginx 和單個撰寫檔案。我想擁有單獨的撰寫檔案以進行簡單和獨立的更新 - 我只是在 .yml 檔案中增加 web 和 API 影像的版本號,然后使用 docker-compose 重新啟動兩個容器。它不會影響其他正在運行的容器或 nginx 本身。
我的問題的核心
我在如何為靜態站點提供服務方面遇到了問題。一個明顯的解決方案是在每個 Web 容器(圖中的 Dockerfile.web)中包含另一個 nginx,并以這種方式從容器中提供靜態檔案。我發現在主機上已經有一個 nginx 實體時運行更多的 nginx 實體有點浪費。
我想到的另一種方法是在容器啟動時將靜態檔案從容器掛載或復制到主機(例如到/var/www)。
理想的解決方案是,如果容器正在運行,則主機 nginx 可以訪問靜態檔案。當容器停止時,靜態檔案變得不可訪問,nginx 可以回傳 404 或“維護頁面”。
你認為我以正確的方式接近這個嗎?我不想最終設計一些非標準的利基解決方案,但由于上述原因,我仍然希望使用 docker-compose 運行主機的 nginx 和獨立更新。
Dockerfiles
Dockerfile.api
# build stage
FROM node:14-alpine AS build
...
RUN yarn build
# run stage
FROM node:14-alpine
WORKDIR /app
COPY --from=build ...
RUN yarn install --prod
CMD ["node", "main.js"]
Dockerfile.web
# build stage
FROM node:14-alpine AS build
...
RUN yarn build
# run stage
FROM alpine
WORKDIR /app
COPY --from=build ...
# TODO: the files should be served here (or copied/mounted to the host)
uj5u.com熱心網友回復:
謝謝大衛的建議。我解決了使用 thttpd per-application 而不是 nginx 的解決方案(受本文啟發)。
為我的靜態站點提供服務的結果影像大約為 5MB,這很好。其他一切仍然按照我原來的圖表。API 由 NodeJS 提供,靜態站點由 thttpd 提供,最重要的是一個執行所有請求路由的 nginx 實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/365427.html
