programing

서비스를 시작한 후 도커 컨테이너를 계속 실행하는 방법은 무엇입니까?

lastmoon 2023. 8. 30. 21:59
반응형

서비스를 시작한 후 도커 컨테이너를 계속 실행하는 방법은 무엇입니까?

제가 하려고 하는 것과 동일한 작업을 수행하는 것처럼 보이는 튜토리얼을 여러 번 보았지만, 어떤 이유에서인지 도커 컨테이너가 종료됩니다.기본적으로, 저는 도커 컨테이너 안에 웹 서버와 몇 개의 데몬을 설치하고 있습니다.을 bash bash를 bash라고 합니다.run-all.shDocker 파일에서 CMD를 실행합니다.run-all.sh다음과 같이 표시됩니다.

service supervisor start
service nginx start

그리고 다음과 같이 Docker 파일 내에서 시작합니다.

CMD ["sh", "/root/credentialize_and_run.sh"]

수동으로 작업을 실행할 때(예: -i -t /bin/bash로 이미지에 액세스할 때) 서비스가 모두 올바르게 시작되고 이미지를 실행할 때 모든 것이 올바르게 실행되는 것처럼 보이지만 프로세스 시작이 완료되면 종료됩니다.프로세스가 무한정 실행되기를 바라며, 제가 알기로는 컨테이너가 계속 실행되어야 합니다.그럼에도 불구하고, 내가 달릴 때docker ps -a알겠습니다.

➜  docker_test  docker ps -a
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS                      PORTS               NAMES
c7706edc4189        some_name/some_repo:blah   "sh /root/run-all.sh   8 minutes ago       Exited (0) 8 minutes ago                        grave_jones

왜 그러고 있어?왜 나가는 거지?bash 스크립트의 끝에 잠시 루프를 붙여 계속 유지할 수 있다는 것을 알지만, 종료되지 않도록 하는 올바른 방법은 무엇입니까?

도커 파일을 사용하는 경우 다음을 시도합니다.

ENTRYPOINT ["tail", "-f", "/dev/null"]

(분명히 이것은 개발 목적으로만 사용되며, nginx와 같은 프로세스를 실행하지 않는 한 컨테이너를 활성 상태로 유지할 필요가 없습니다.)

이 컨테이너를 를 사용하고 있다는 것을 .-t그리고.-d플래그, 계속 달립니다.

docker run -td <image>

이 하는.docker run --help):

-d, --detach=false         Run container in background and print container ID
-t, --tty=false            Allocate a pseudo-TTY

은 가장중것은한입니다.-t 깃발-d컨테이너를 백그라운드에서 실행할 수 있습니다.

이것은 도커 컨테이너를 설계하는 방법이 아닙니다.

도커 컨테이너를 설계할 때 프로세스가 하나만 실행되도록 빌드해야 합니다(즉, Nginx용 컨테이너 하나와 슈퍼바이저 또는 실행 중인 앱용 컨테이너 하나). 또한 해당 프로세스는 포그라운드에서 실행되어야 합니다.

프로세스 자체가 종료되면 컨테이너가 "종료"됩니다(사용자의 경우 해당 프로세스가 bash 스크립트임).


그러나 Docker 컨테이너에서 여러 서비스를 실행해야 하는 경우에는 다음을 사용하는 "Docker Base Image"부터 시작하는 것이 좋습니다.runit으로서 (pseudo-init processrunitNginx 및 Supervisor가 실행되는 동안 온라인 상태를 유지합니다). 이는 다른 프로세스가 수행하는 동안 포그라운드 상태를 유지합니다.

그들은 상당한 문서를 가지고 있기 때문에 당신은 당신이 하려는 것을 합리적으로 쉽게 이룰 수 있어야 합니다.

종료되는 이유는 셸 스크립트가 PID 1로 먼저 실행되고 완료되면 PID 1은 사라지고 도커는 PID 1이 실행되는 동안만 실행되기 때문입니다.

슈퍼바이저를 사용하여 모든 작업을 수행할 수 있습니다. "-n" 플래그를 사용하여 실행하면 데몬화하지 않도록 지시되므로 첫 번째 프로세스로 유지됩니다.

CMD ["/usr/bin/supervisord", "-n"]

그리고 당신의 supervisor.conf:

[supervisord]
nodaemon=true

[program:startup]
priority=1
command=/root/credentialize_and_run.sh
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
autorestart=false
startsecs=0

[program:nginx]
priority=10
command=nginx -g "daemon off;"
stdout_logfile=/var/log/supervisor/nginx.log
stderr_logfile=/var/log/supervisor/nginx.log
autorestart=true

그러면 원하는 만큼의 다른 프로세스를 사용할 수 있으며 필요한 경우 재시작을 감독자가 처리합니다.

그렇게 하면 nginx와 php5-fpm이 필요할 수 있고 그것들을 분리하는 것이 별로 의미가 없는 경우에 감독관을 사용할 수 있습니다.

당신은 쉽게 할 수 있습니다.catbro 작동하도록 하기 위한 [입력을 것 않음] (을 함)bro @Sa'ad 급가한언것처럼무아런실쟁논작유동록하지도가너테이이없순히컨제기것단다는리로행함외을을수작업한플동입에그러인일도사는는력아자용무하것않도지음▁dock실▁without▁@jen▁as▁working▁@▁simply▁bro

동기:

도커 컨테이너 내부에서 여러 프로세스를 실행하는 데 문제가 없습니다.도커를 가벼운 VM으로 사용하는 것을 좋아한다면 그렇게 하십시오.다른 사람들은 애플리케이션을 마이크로 서비스로 분할하는 것을 좋아합니다.제 생각엔 하나의 용기에 LAMP 스택이 들어있을까요?좋습니다.

정답:

인두염 베이스 이미지처럼 좋은 베이스 이미지를 유지합니다.다른 사람들이 있을 수도 있습니다.댓글 달아주세요.

그리고 이것은 감독관에 대한 또 다른 탄원일 뿐입니다.왜냐하면 휴즈 기반 이미지는 cron 및 로케일 설정과 같은 몇 가지 다른 것들 외에도 감독자를 제공하기 때문입니다.이러한 경량 VM을 실행할 때 설정하고자 하는 항목입니다.가치가 있는 것은 컨테이너에 SSH 연결도 제공합니다.

다음과 같은 기본 도커 실행 명령문을 발행하면 휴즈 이미지 자체가 시작되고 계속 실행됩니다.

moin@stretchDEV:~$ docker run -d phusion/baseimage
521e8a12f6ff844fb142d0e2587ed33cdc82b70aa64cce07ed6c0226d857b367
moin@stretchDEV:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
521e8a12f6ff        phusion/baseimage   "/sbin/my_init"     12 seconds ago      Up 11 seconds

아니면 아주 단순합니다.

기본 이미지가 아닌 경우...빠른 CMD가 계속 실행되도록 하려면 bash를 다음과 같이 가정합니다.

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

또는 사용 중인 상자의 경우:

CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"

이것은 좋습니다, 왜냐하면 그것은 즉시 끝날 것이기 때문입니다.docker stop.

그냥 그냥 냥그범함평▁just함범평sleep또는cat도커에 의해 컨테이너가 강제로 살해될 때까지 몇 초가 걸립니다.

업데이트

하나의 컨테이너에서 여러 프로세스를 실행하는 것과 관련하여 Charles Desbiens에 대한 응답:

이것은 의견입니다.문서들은 이 방향을 가리키고 있습니다.인용문: "여러 프로세스를 사용하는 것은 괜찮지만 Docker를 최대한 활용하려면 하나의 컨테이너가 전체 애플리케이션의 여러 측면을 담당하지 않도록 하십시오."물론 복잡한 서비스를 여러 컨테이너로 분할하는 것이 훨씬 더 강력합니다.하지만 컨테이너 1개 노선으로 가는 것이 이득이 될 수 있는 상황이 있습니다.특히 가전제품의 경우.GitLab Docker 이미지는 다중 프로세스 컨테이너의 제가 가장 좋아하는 예입니다.이 복잡한 시스템을 쉽게 구축할 수 있습니다.구성이 잘못될 수는 없습니다.GitLab은 어플라이언스에 대한 모든 제어 권한을 유지합니다.윈윈.

추가해야 합니다.daemon off;yingx.conf로 실행하거나CMD ["nginx", "-g", "daemon off;"]공식 nginx 이미지에 따라

그런 다음 다음 다음을 사용하여 슈퍼바이저를 서비스로 실행하고 nginx를 포그라운드 프로세스로 실행하여 컨테이너가 나가는 것을 방지합니다.

service supervisor start && nginx

경우에 따라 컨테이너에 두 개 이상의 프로세스가 있어야 하므로 컨테이너에 프로세스를 하나만 지정해도 작동하지 않고 배포에 더 많은 문제가 발생할 수 있습니다.

따라서 트레이드오프를 이해하고 그에 따른 결정을 내려야 합니다.

도커 엔진 v1.25 이후로 다음과 같은 옵션이 있습니다.init.
Docker-compose는 다음 시점에서 이 명령을 포함했습니다.version 3.7.

따라서 무한대로 실행되어야 하는 컨테이너를 실행할 때 현재 CMD:

CMD ["sleep", "infinity"]

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

docker build
docker run --rm --init app

crf.: rm 문서 및 init 문서

변수(예: $NGNIX_PID)에서 ngnix 프로세스의 PID를 캡처하고 진입점 파일의 끝에서 다음을 수행합니다.

wait $NGNIX_PID 

그런 식으로 용기는 ngnix가 활성화될 때까지 실행되어야 합니다. ngnix가 중지되면 용기도 중지됩니다.

다음과 같은 것을 갖는 것과 함께:ENTRYPOINT ["tail", "-f", "/dev/null"]도커 파일에서 도커 컨테이너를 실행해야 합니다.-td선택.이 기능은 컨테이너가 원격 m/c에서 실행될 때 특히 유용합니다.이미지가 있는 원격 m/c에 ssh를 넣고 컨테이너를 시작한 것처럼 생각합니다.이 경우 ssh 세션을 종료하면 컨테이너가 다음으로 시작되지 않는 한 삭제됩니다.-td다음과 같습니다.docker run -td <any other additional options> <image name>

도커 버전에 적합합니다.20.10.2

개발 중에 아직 서비스가 없지만 시뮬레이션하여 컨테이너를 활성화하려는 경우가 있습니다.

실행 중인 서비스를 시뮬레이션하는 bash 자리 표시자를 작성하는 것은 매우 쉽습니다.

while true; do
  sleep 100
done

당신은 개발이 진행됨에 따라 이것을 더 심각한 것으로 대체합니다.

저도 비슷한 문제가 있었는데 추가해서 해결할 수 있었습니다./usr/bin/env bash내 bash 대본의 마지막에.

가능하다면 감독 형태의 서비스를 이용하는 것은 어떻습니까?

service YOUR_SERVICE 감독

슈퍼바이저가 성공적으로 실행되면 슈퍼바이저가 종료되거나 종료 요청을 받지 않는 한 종료되지 않습니다.

할성필을줄다니를 작성해야 합니다.supervisord.conf

언급URL : https://stackoverflow.com/questions/25775266/how-to-keep-docker-container-running-after-starting-services

반응형