`docker stop`과`docker kill`의 차이점은 무엇입니까?


116

차이 무엇 docker stopdocker kill?

Afaik, 둘 다 실행중인 컨테이너를 중지합니다. 그것은 즉 docker stop하면서, 올바른 방법으로 용기 내에서 실행 프로세스를 중지하려고 시도 docker kill킬 (kill) 신호를 보낼 것인가? 그렇다면 docker stop실행중인 프로세스를 올바르게 중지하는 방법을 어떻게 알 수 있습니까? (이것은 프로세스마다 다르므로)

답변:


112

docker stop은 컨테이너 내부에서 프로세스 실행을 올바른 방식으로 중지하려고 시도하는 반면, docker kill은 kill 신호를 전송합니까?

기본적으로 그렇습니다. 차이는 미묘하지만 커맨드 라인 참조에 요약되어 있습니다 .

  • docker stop : 실행중인 컨테이너를 중지합니다 ( SIGTERM을 보낸 다음 유예 기간 후 SIGKILL 전송 ) [...] 컨테이너 내부의 주요 프로세스는 SIGTERM을 받고 유예 기간 후 SIGKILL을받습니다. [강조 광산]
  • docker kill : 실행중인 컨테이너를 종료합니다 ( SIGKILL 전송 또는 지정된 신호 전송 ) [...] 컨테이너 내부의 주요 프로세스에는 SIGKILL 또는 --signal 옵션으로 지정된 신호가 전송됩니다. [강조 광산]

따라서 stop표준 POSIX 신호 를 전송하여 정상적인 종료를 트리거하는 SIGTERM반면 kill기본적으로 프로세스를 종료 하지만 다른 신호를 보낼 수도 있습니다.

SIGTERM 신호는 프로세스를 종료하여 종료를 요청합니다. SIGKILL 신호와 달리 프로세스에서 신호를 포착하고 해석하거나 무시할 수 있습니다. 이를 통해 프로세스는 자원을 해제하고 적절한 경우 상태를 저장하는 훌륭한 종료를 수행 할 수 있습니다. SIGINT는 SIGTERM과 거의 동일합니다.

어쨌든 프로세스는 적용되지 않지만 일반적으로 프로세스는 SIGTERM정상적으로 처리 하고 자신의 책임에 따라 올바른 작업을 수행해야합니다. 이는 유예 기간보다 오래 걸리는 정상 종료 시도로 인해 쉽게 실패 할 수 있습니다. 데이터 무결성이 가장 중요한 것 (예 : 데이터베이스); 자세한 설명 은 예를 들어 헤이든 소령의 SIGTERM 대 SIGKILL 을 참조하십시오 .

응용 프로그램은 SIGTERM이 수신되면 원하는 작업을 결정할 수 있습니다. 대부분의 응용 프로그램은 리소스를 정리하고 중지하지만 일부 응용 프로그램은 그렇지 않을 수 있습니다. SIGTERM이 수신 될 때 애플리케이션이 완전히 다른 것을 수행하도록 구성 될 수 있습니다. 또한 응용 프로그램이 디스크 I / O 대기와 같은 잘못된 상태 인 경우 전송 된 신호에 대해 작동하지 않을 수 있습니다.


1
따라서 컨테이너에 대한 일반적인 종료 절차를 원한다면 감독자 / 실행 프로세스에서 SIGTERM을 잡아야합니까?
CMCDragonkai

가장 좋은 방법은 무엇입니까? docker kill종료하는 동안 시간을 ​​절약하기 위해 수동으로 사용하는 이유를 이해 하지만 스크립트에서는 항상 종료를 통해 정상적으로 종료하는 것이 더 좋지 docker stop않습니까? 그래도 여전히 docker kill스크립트에서 많은 것을보고 있습니다.
데니스

10

docker kill 메인 진입 점 프로세스 / 프로그램을 갑자기 중지합니다

docker stop 우아하게 멈추려 고 노력할 것입니다.

두 경우 모두 파일 시스템 변경 사항이 유지되거나 (중지 또는 종료시) docker start <container>계속되는 경우 계속됩니다.


1
... 그러나 docker kill주 프로세스가 여전히 메모리에 가지고있는 보류중인 파일 시스템 변경의 경우 파일 시스템이 손상 될 수 있습니까?
Arjan

명백히, 갑작스런 정지이므로, 죽일 때의 변화 만이 지속될 것입니다. 보류중인 모든 항목이 손실됩니다. 내 요점은 docker kill이 실제로 컨테이너를 죽이고 프로세스를 중지시키는 것이 아니라는 것입니다. 컴퓨터를 종료하지 않고 전원을 끌 때와 같이
awkwardarts

2
도커 컨테이너는 VM이 ​​아니며 커널은 킬을 통해 살아 있습니다. 따라서 커널에 도달 한 모든 파일 시스템 변경 사항은 그대로 적용됩니다. 파일 시스템을 손상시킬 수 없어야합니다 (fsck 의미로, 응용 프로그램의 일부 쓰기 손실을 원하지 않을 수 있음). 컴퓨터 전원을 끄지 않고docker kill 프로세스를 종료하는 것과 유사 합니다.
Ian Howson

3

그리고 이전에 추가 된 답변 외에도

쇼 이벤트 docker events후 실행docker stop

  • kill (신호 15) : 신호 15 = SIGTERM
  • 주사위
  • 중지

쇼 이벤트 docker events후 실행docker kill

  • kill (신호 9) : 신호 9 = SIGKILL
  • 다이 (종료 코드 137)

docker stop프로세스를 종료하기 전에 시간이 초과되었습니다. 기본값은 10 초입니다.

이 표 에는 더 자세한 내용이 있습니다.


1

데스크탑 분리컴퓨터 종료 와 유사 합니다.

플러그 오프를 당기는 것은 하드 전원 끄기를 docker kill의미하는 것처럼 my_container를 죽이는 직접적인 방법을 의미하며, 프로세스를 먼저 정상적으로 종료하려고 시도하지 않습니다.

컴퓨터를 종료 docker stop한다는 것은 모든 프로세스를 종료하기 위해 OS에 SIGTERM신호를 보내는 것을 의미 합니다. 여기서 프로세스를 정상적으로 중지하기 위해 실행중인 컨테이너에 신호를 보냅니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.