nginx 不會在 docker 中啟動,除非手動執行並啟動

nginx 不會在 docker 中啟動,除非手動執行並啟動

我對 docker 還很陌生。我必須建立一個 docker 檔案來啟動 Node Express 伺服器和 Nginx 作為反向代理。但問題是節點伺服器啟動但Nginx沒有啟動。當我手動執行到容器中並透過輸入「nginx」啟動它,然後按 Enter 鍵啟動時,容器偵聽連接埠 80,Nginx 以這種方式工作。但我希望它在容器啟動後立即啟動。

這是我的 Dockerfile:

FROM alpine
RUN apk add --update nodejs nodejs-npm
RUN apk add nginx
WORKDIR /usr/
COPY package*.json ./
RUN npm install
COPY . .
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
RUN nginx #<-- this does not work!!
CMD npm run start
EXPOSE 80

這是一個監聽 8080 的 API 伺服器,因此 Nginx 將反向代理並將其提供給外部世界的 80 連接埠。我可以透過使用 docker-compose 運行 2 個容器(一個用於 Nginx,一個用於 Nodejs)來實現這一目標,但我想在一個容器中運行這兩個容器。

答案1

再次閱讀您的問題後,我想知道為什麼您需要反向代理?您應該修補您的節點應用程序,以便它本身為連接埠 80 提供服務。

無論如何,Docker 容器背後的理念是「一個容器,一個流程」。這種範例經常被忽視,但是您不應該在容器中提供反向代理,容器本身可以充當網頁伺服器。

答案2

我們需要將 Node JS 和 nginx 進程分離到單獨的容器中。它們都可以在同一個網路上相互通信,容器透過名稱相互通信。您可以在 nginx 反向代理程式上接收資料包,然後將其轉送到 NodeJS 應用程式。在nodeJS應用程式中,您的npm從主進程開始,而在nginx應用程式中,您的nginx服務惡魔應該是主進程。容器始終處於活動狀態,直到主進程啟動並運行為止,因此在容器世界中,我們將每個單獨的功能分開並將它們部署為容器。在您的情況下,nodeJS 應用程式應該是一個單獨的容器,而 nginx 應該是一個單獨的容器。僅對於 nginx 容器,您才會公開連接埠以進行外部連線。

相關內容