source

도커 컨테이너 내에서 Nginx를 중단하지 않고 실행하는 방법?

nicesource 2023. 10. 1. 19:32
반응형

도커 컨테이너 내에서 Nginx를 중단하지 않고 실행하는 방법?

Nginx를 Docker 컨테이너에 설치하여 다음과 같이 실행하려고 합니다.

docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx

문제는 Nginx가 작동하는 방식은 초기 프로세스가 마스터 Nginx 프로세스와 일부 작업자를 즉시 생성한 후 종료한다는 것입니다.도커는 원래 명령의 PID만 주시하고 있으므로 컨테이너는 정지합니다.

어떻게 하면 용기가 멈추는 것을 방지할 수 있습니까?첫번째 자식 프로세스에 바인딩하거나 Nginx의 초기 프로세스가 종료되지 않도록 할 수 있어야 합니다.

찰스 더피의 답변을 확대하기 위해, Nginx는 다음을 사용합니다.daemon off포그라운드로 실행하라는 지시입니다.구성 파일에 이것을 넣는 것이 불편하다면 명령 줄에 직접 지정할 수 있습니다.이를 통해 디버그 모드(포그라운드)에서 쉽게 실행할 수 있으며 명령줄 아르그를 변경하여 프로덕션 모드(백그라운드)에서 실행으로 직접 전환할 수 있습니다.

전경에서 실행하는 방법:

nginx -g 'daemon off;'

백그라운드에서 실행하는 방법:

nginx

nginx, 모든 잘 behaved된 프로그램과 마찬가지로 자체 daemon화되지 않도록 구성할 수 있습니다.

사용.daemon offhttp://wiki.nginx.org/CoreModule 에 설명되어 있습니다.

John의 답변을 확대하려면 다음을 사용할 수도 있습니다.Dockerfile CMD다음과 같이 명령합니다(추가적인 args 없이 자체 시작을 원하는 경우).

CMD ["nginx", "-g", "daemon off;"]

참고로 오늘(2019년 10월 22일) 현재 공식 Nginx 도커 이미지에는 모두 라인이 있습니다.

CMD ["nginx", "-g", "daemon off;"]

예: https://github.com/nginxinc/docker-nginx/blob/23a990403d6dbe102bf2c72ab2f6a239e940e3c3/mainline/alpine/Dockerfile#L117

이 명령을 Docker 파일에 추가하면 다음을 사용할 수 없습니다.

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

토머와 찰스의 대답을 덧붙이자면,

엔트리포인트를 사용하여 도커 컨테이너의 forground에서 nginx를 실행하는 구문:

ENTRYPOINT nginx -g 'daemon off;' 

직접적인 관련은 없지만 엔트리포인트를 사용하여 여러 명령을 실행할 수 있습니다.

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 

여기 nginx를 실행하는 도커 파일의 예가 있습니다.찰스가 언급한 바와 같이, 그것은daemon off구성:

https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17

도커 컨테이너에서 깅스 이미지를 실행하려고 여기 오는 모든 사람들을 위해, 그것은 서비스로 실행될 것입니다.

도커 파일 전체가 없기 때문에 여기 제 전체가 있습니다.Dockerfile문제의 해결

수고 많으셨습니다.최종 nginx 문제를 해결하기 위해 여기 모든 답변에 감사드립니다.

FROM ubuntu:18.04
MAINTAINER stackoverfloguy "stackoverfloguy@foo.com"
RUN apt-get update -y
RUN apt-get install net-tools nginx ufw sudo -y
RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER docker
RUN sudo ufw default allow incoming
RUN sudo rm /etc/nginx/nginx.conf
RUN sudo rm /etc/nginx/sites-available/default
RUN sudo rm /var/www/html/index.nginx-debian.html
VOLUME /var/log
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx
VOLUME /var/run
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY content/* /var/www/html/
COPY Dockerfile /var/www/html
COPY start.sh /etc/nginx/start.sh
RUN sudo chmod +x /etc/nginx/start.sh
RUN sudo chmod -R 777 /var/www/html
EXPOSE 80
EXPOSE 443
ENTRYPOINT sudo nginx -c /etc/nginx/nginx.conf -g 'daemon off;'

다음을 사용하여 실행합니다.

docker run -p 80:80 -p 443:443 -dit

서비스 관리를 위해 슈퍼바이저를 사용하거나 [1]을 운영하는 것도 좋습니다.

[1] https://github.com/phusion/baseimage-docker

도커허브의 공식 NGINX 이미지 공식 노트에는 다음과 같이 명시되어 있습니다.

Docker 정의 CMD 를를 포함해야 .-g daemon off;Nginx가 전경에 머물 수 있도록 CMD에서 Docker가 공정을 제대로 추적할 수 있도록 합니다(그렇지 않으면 컨테이너가 시동 후 즉시 정지됩니다)!

CMD []를 제거하면 이 문제가 처음부터 발생하는 것을 막을 수 있습니까?

공용 컨테이너의 새 버전에서는 스크립트가 기본값이므로 명령/엔트리포인트를 추가할 필요가 없습니다.

참고 항목: https://stackoverflow.com/a/64991442/1736679

언급URL : https://stackoverflow.com/questions/18861300/how-to-run-nginx-within-a-docker-container-without-halting

반응형