nginx startet nicht im Docker, es sei denn, es wird manuell ausgeführt und gestartet

nginx startet nicht im Docker, es sei denn, es wird manuell ausgeführt und gestartet

Ich bin ziemlich neu bei Docker. Ich muss eine Docker-Datei erstellen, die den Node-Express-Server und Nginx als Reverse-Proxy startet. Das Problem ist jedoch, dass der Node-Server startet, Nginx jedoch nicht. Wenn ich manuell in den Container eintrete und ihn starte, indem ich „nginx“ eingebe und dann die Eingabetaste drücke, startet er und der Container lauscht auf Port 80 und Nginx funktioniert auf diese Weise. Aber ich möchte, dass es startet, sobald der Container startet.

Hier ist mein 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

Dies ist ein API-Server, der auf 8080 lauscht, sodass Nginx einen Reverse-Proxy verwendet und ihn der Außenwelt auf Port 80 zur Verfügung stellt. Ich kann dies erreichen, indem ich 2 Container ausführe, einen für Nginx und einen für NodeJS mit Docker-Compose, aber ich möchte beide in einem Container ausführen.

Antwort1

Nachdem ich Ihre Frage noch einmal gelesen habe, frage ich mich, warum Sie überhaupt einen Reverse-Proxy benötigen. Sie sollten Ihre Node-Anwendung so patchen, dass sie selbst Port 80 bedient.

Die Idee hinter Docker-Containern ist ohnehin „Ein Container, ein Prozess“. Dieses Paradigma wird oft ignoriert, aber Sie sollten keinen Reverse-Proxy in einem Container bereitstellen, der selbst als Webserver dienen kann.

Antwort2

Wir müssen die NodeJS- und Nginx-Prozesse in separate Container aufteilen. Sie können beide im selben Netzwerk liegen und miteinander kommunizieren, Container kommunizieren über ihren Namen miteinander. Sie können Pakete auf dem Nginx-Reverseproxy empfangen und diese dann an die NodeJS-Anwendung weiterleiten. In der NodeJS-Anwendung beginnt Ihr NPM mit dem primären Prozess und in der Nginx-Anwendung sollte Ihr Service-Dämon von Nginx der primäre Prozess sein. Der Container ist immer aktiv, bis der primäre Prozess läuft, also trennen wir in der Containerwelt jede der einzelnen Funktionen und stellen sie als Container bereit. In Ihrem Fall sollte die NodeJS-Anwendung ein separater Container sein und Nginx sollte ein separater Container sein. Nur für den Nginx-Container würden Sie den Port für externe Konnektivität freigeben.

verwandte Informationen