nginxはdockerでは起動しません。手動で実行して起動しない限りは

nginxはdockerでは起動しません。手動で実行して起動しない限りは

私は Docker の初心者です。Node Express サーバーと Nginx をリバース プロキシとして起動する Docker ファイルを作成する必要があります。しかし、問題は、Node サーバーは起動しますが、Nginx が起動しないことです。手動でコンテナーを実行し、「nginx」と入力して Enter キーを押すと、コンテナーが起動し、コンテナーがポート 80 を listen し、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 を使用して、Nginx 用と nodejs 用の 2 つのコンテナーを実行することでこれを実現できますが、両方を 1 つのコンテナーで実行したいと考えています。

答え1

あなたの質問をもう一度読んでみると、リバース プロキシがなぜ必要なのか疑問に思います。ノード アプリケーションにパッチを適用して、ノード アプリケーション自体がポート 80 を提供するようにする必要があります。

とにかく、Docker コンテナの背後にある考え方は「1 つのコンテナ、1 つのプロセス」です。このパラダイムは無視されることが多々ありますが、コンテナ自体が Web サーバーとして機能する可能性があるので、コンテナ内でリバース プロキシを提供すべきではありません。

答え2

Node.js プロセスと nginx プロセスを別々のコンテナに分離する必要があります。 両方とも同じネットワーク上に存在し、互いに通信でき、コンテナは名前で互いに通信します。 nginx リバース プロキシでパケットを受信し、それを node.js アプリケーションに転送できます。 node.js アプリケーションでは、npm がプライマリ プロセスで開始され、nginx アプリケーションでは、nginx のサービス デーモンがプライマリ プロセスになります。 コンテナは、プライマリ プロセスが起動して実行されるまで常にアクティブであるため、ワールド コンテナでは、個々の機能をそれぞれ分離してコンテナとして展開します。 この場合、node.js アプリケーションは別のコンテナである必要があり、nginx は別のコンテナである必要があります。 nginx コンテナの場合のみ、外部接続用のポートを公開します。

関連情報