nginx는 수동으로 실행하여 시작하지 않는 한 docker에서 시작되지 않습니다.

nginx는 수동으로 실행하여 시작하지 않는 한 docker에서 시작되지 않습니다.

나는 도커를 처음 접했습니다. 노드 익스프레스 서버와 Nginx를 역방향 프록시로 시작하는 Docker 파일을 작성해야 합니다. 하지만 문제는 노드 서버가 시작되지만 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를 사용하여 Nginx용 컨테이너와 nodejs용 컨테이너 2개를 실행하여 이를 달성할 수 있지만 둘 다 하나의 컨테이너에서 실행하고 싶습니다.

답변1

귀하의 질문을 다시 읽은 후에 왜 역방향 프록시가 필요한지 궁금합니다. 노드 애플리케이션 자체가 포트 80을 제공하도록 패치해야 합니다.

Docker 컨테이너의 기본 개념은 어쨌든 "하나의 컨테이너, 하나의 프로세스"입니다. 이 패러다임은 많이 무시되지만 컨테이너 자체에서 웹 서버 역할을 할 수 있는 역방향 프록시를 제공해서는 안 됩니다.

답변2

노드 JS와 nginx 프로세스를 별도의 컨테이너로 분리해야 합니다. 둘 다 동일한 네트워크에 위치하여 서로 대화할 수 있으며, 컨테이너는 이름으로 서로 대화합니다. nginx 역방향 프록시에서 패킷을 수신한 다음 이를 nodeJS 애플리케이션으로 전달할 수 있습니다. nodeJS 애플리케이션에서 npm은 기본 프로세스로 시작하고 nginx 애플리케이션에서는 nginx의 서비스 데몬이 기본 프로세스여야 합니다. 컨테이너는 기본 프로세스가 실행될 때까지 항상 살아 있으므로 각 개별 기능을 분리하여 컨테이너로 배포하므로 월드 컨테이너에서도 마찬가지입니다. 이 경우 nodeJS 애플리케이션은 별도의 컨테이너여야 하고 nginx는 별도의 컨테이너여야 합니다. nginx 컨테이너의 경우에만 외부 연결을 위해 포트를 노출합니다.

관련 정보