programing

Docker CMD를 여러 번 사용하여 여러 서비스를 실행할 수 없는 이유는 무엇입니까?

elecom 2023. 8. 31. 23:38
반응형

Docker CMD를 여러 번 사용하여 여러 서비스를 실행할 수 없는 이유는 무엇입니까?

저는 도커 파일에서 centos+ssh라는 기본 이미지를 구축했습니다.centos+ssh의 Docker 파일에서 나는 cmd를 사용하여 ssh 서비스를 실행합니다.

그런 다음 이미지 실행 다른 서비스인 rabbitmq를 빌드하고 싶습니다. 도커 파일:

FROM centos+ssh
EXPOSE 22
EXPOSE 4149
CMD /opt/mq/sbin/rabbitmq-server start

rabbitmq 컨테이너 실행을 시작하려면:

docker run -d -p 222:22 -p 4149:4149 rabbitmq

그러나 ssh 서비스가 작동하지 않습니다. rabbitmq의 Dockerfile CMD가 Centos의 CMD를 재정의하는 것을 감지합니다.

  1. 도커 이미지 내부에서 CMD는 어떻게 작동합니까?
  2. 여러 서비스를 실행하려면 어떻게 해야 합니까?감독관을 사용하시겠습니까?

두은 맞다니 파일을 . 두번도파다덮파다니어씁일을음일이커습째▁you다▁will니덮.CMD제1진의 지휘권도커는 항상 하나의 명령을 실행합니다. 그 이상은 실행하지 않습니다.따라서 Docker 파일의 끝에서 실행할 명령 하나를 지정할 수 있습니다.그 이상은 아닙니다.

그러나 두 명령을 모두 한 줄로 실행할 수 있습니다.

FROM centos+ssh
EXPOSE 22
EXPOSE 4149
CMD service sshd start && /opt/mq/sbin/rabbitmq-server start

또한 Docker 파일을 조금 더 깨끗하게 만들기 위해 CMD 명령을 추가 파일에 추가할 수 있습니다.

FROM centos+ssh
EXPOSE 22
EXPOSE 4149
CMD sh /home/centos/all_your_commands.sh

다음과 같은 파일:

service sshd start &
/opt/mq/sbin/rabbitmq-server start

CMD는 Docker 파일에 기록되어 있지만 실제로는 런타임 정보입니다.EXPLEX와 마찬가지로 RUN 및 ADD와 반대입니다.즉, 나중에 확장 도커 파일에서 또는 실행 명령에서 간단하게 오버라이드할 수 있습니다.항상 CMD는 하나만 있을 수 있습니다.

만약 당신이 여러 서비스를 운영하고 싶다면, 저는 정말로 감독관을 사용하겠습니다.한 후 " " " 를 사용하여 할 수 .supervisord -c /etc/supervisor 서비스를 파일을 가리키기 위해 합니다.

[supervisord]
nodaemon=true

[include]
files = /etc/supervisor/conf.d/*.conf

더 자세한 내용을 알고 싶으시다면, 저는 여기에 이 주제에 대한 블로그를 썼습니다.

이 문제를 해결할 수 있는 방법을 설명하는 qkrijger의 답변을 존중하지만, 여기서 무슨 일이 일어나고 있는지에 대해 배울 수 있는 것이 더 많다고 생각합니다.

""에 대한 당신의 질문에 대답하기 위해서는...제 생각에 당신이 어떻게 이해하는 것이 도움이 될 것 같습니다.docker stop명령은 작동하며 모든 프로세스를 다시 시작할 때 문제를 방지하기 위해 모든 프로세스를 완전히 종료해야 합니다(파일 손상 등).

문제:도커가 자신의 명령에서 SSH를 시작하고 도커 파일에서 RabbitMQ를 시작했다면 어땠을까요?"도커 중지 명령은 실행 중인 컨테이너를 먼저 중지시키기 위해 컨테이너의 루트 프로세스(PID 1)에 SIGTERM 신호를 보냅니다."SIGTERM을 얻을 PID 1로 도커 추적하는 프로세스는 무엇입니까? SSH입니까, Rabbit입니까?"Unix 프로세스 모델에 따르면 init 프로세스인 PID 1은 모든 고아 자식 프로세스를 상속하고 이를 거둬들여야 합니다. 대부분의 도커 컨테이너는 이를 올바르게 수행하는 init 프로세스가 없으므로 시간이 지남에 따라 컨테이너가 좀비 프로세스로 채워집니다."

답변: Docker는 PID 1을 사용하여 루트 프로세스로 시작하고 SIGTERM을 얻을 마지막 CMD를 단순히 사용합니다.docker stop.

제안 솔루션:둘 이상의 서비스를 실행하기 위해 특별히 제작된 기본 이미지(예: 휴즈/기본 이미지)를 사용하거나 만들어야 합니다.

이러한 이유로 정확히 tini가 존재한다는 것을 주목해야 하며, Docker 1.13 이후로, Tini는 공식적으로 Docker의 일부이며, 이는 Docker에서 두 개 이상의 프로세스를 실행하는 것이 유효하다는 것을 알려줍니다. 그래서 누군가가 Docker에 대해 더 숙련되었다고 주장하고, 이것을 생각하는 것에 대해 터무니없다고 주장하더라도, 당신은 그렇지 않다는 것을 알고 있습니다.그렇게 하는 데는 완벽하게 타당한 상황이 있습니다.

알아두면 좋은 것:

컨테이너에서 여러 서비스 실행에 대한 공식 도커 답변입니다.

init 시스템(systemd, sysvinit, upstart), 스크립트(CMD ./my_wrapper_script.sh) 또는 감독관 같은 사람.supervisord.

&&해결 방법은 백그라운드에서 시작하거나(자막) 상호 작용 없이 빠르게 실행되고 프롬프트를 릴리스하는 서비스에 대해서만 작동할 수 있습니다.프롬프트를 유지하는 대화형 서비스로 이 작업을 수행하면 첫 번째 서비스만 시작됩니다.

CMD가 컨테이너당 하나의 서비스만 실행하도록 설계된 이유를 설명하기 위해 동일한 컨테이너에서 실행되는 보조 서버가 사소한/보조 서버가 아니라 "주요 서버"(예: 프런트엔드 앱에 번들로 제공되는 스토리지)인 경우 어떤 일이 발생하는지 알아보겠습니다.우선 수평(자동) 확장 및 노드 간 재스케일링과 같은 몇 가지 중요한 컨테이너화 기능을 분석할 것이며, 이 두 기능 모두 컨테이너당 하나의 애플리케이션(CPU 로드 소스)만 있다고 가정합니다.또한 취약성 문제도 있습니다. 컨테이너에 서버가 많이 노출되면 CVE의 패치가 더 자주 적용됩니다.

그것은 ) 이 모범 서는 안 ( - 는 도커(Kubernetes/Openshift)를 가지고 있습니다.) 도커(Kubernetes/Openshift)를 가지고 있습니다.docker exec / kubectl exec / oc rsh이를 대체하도록 설계됨)

  • 추가 정보

https://devops.stackexchange.com/questions/447/why-it-is-recommended-to-run-only-one-process-in-a-container

언급URL : https://stackoverflow.com/questions/23692470/why-cant-i-use-docker-cmd-multiple-times-to-run-multiple-services

반응형