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 容器背后的理念是“一个容器,一个进程”。这个范例经常被忽略,但您不应该在容器中提供反向代理,容器本身可以充当 Web 服务器。

答案2

我们需要将 node JS 和 nginx 进程分离到单独的容器中。它们都可以在同一个网络上驻留并相互通信,容器通过名称相互通信。您可以在 nginx 反向代理上接收数据包,然后将其转发到 nodeJS 应用程序。在 nodeJS 应用程序中,您的 npm 从主进程启动,而在 nginx 应用程序中,您的 nginx 服务守护进程应该是主进程。容器始终处于活动状态,直到主进程启动并运行,因此在世界容器中,我们将每个单独的功能分离并将它们部署为容器。在您的情况下,nodeJS 应用程序应该是一个单独的容器,nginx 也应该是一个单独的容器。只有对于 nginx 容器,您才会公开端口以进行外部连接。

相关内容