도커
컨테이너
중지 / 종료

도커 컨테이너 중지, 종료

이번 포스팅은 도커 컨테이너 중지 및 종료 관련 7가지 핵심 내용을 살펴봅니다. pause, stop 명령어와 전체 중지 및 종료 방법, 강제 중지 및 종료 방법, 정지 상태 컨테이너 일괄 삭제, signal 옵션과 timeout 옵션, permission denied 해결 방법 등의 내용을 포함합니다.

1. 도커 컨테이너 중지 명령어

실행 중인 도커 컨테이너를 중지 혹은 종료하는 명령어의 기본 형태는 다음과 같습니다.

$ docker container stop [OPTIONS] CONTAINER [CONTAINER...]

Unix 프로세스 기반으로 동작하는 도커 컨테이너이기 때문에, 이 명령어는 해당하는 도커 컨테이너에 SIGTERM 신호를 보내서 실행을 정지할 시간을 줍니다 . 이후 SIGKILL 신호를 보내서 해당 프로세스를 종료합니다.

SIGTERM 은 해당 프로세스가 안전하게 종료될 때까지 기다릴테니 종료하세요 하고 알리는 신호입니다. SIGKILL 은 다른 OS의 강제 종료와 같은 역할을 합니다.

다시 stop 명령어를 살펴보자면, 여기서 CONTAINER는 정지하려는 컨테이너의 이름이나 ID를 의미합니다. 이 명령어를 통해 한 개 이상의 컨테이너를 동시에 정지할 수 있습니다.

[OPTIONS]에는 --time 옵션과 같은 원하는 옵션을 추가할 수 있습니다. 우리가 가장 자주 사용할 옵션들은 아래 섹션들에서 하나씩 다뤄볼 것입니다.

stop 명령어로 중지한 컨테이너는 start 명령어로 다시 시작할 수 있습니다. 명령어는 아래와 같으며, 도커 컨테이너 실행 포스트에서 보았던 -a, -i 등의 옵션을 추가할 수 있습니다.

$ docker container start [OPTIONS] CONTAINER [CONTAINER...]

간단하게 실행 중인 nginx 컨테이너를 종료하고 다시 실행하는 예제를 보겠습니다.

먼저, (1) 해당 컨테이너의 이름 혹은 ID를 살펴보고, 이것을 가지고 (2) stop 명령어를 실행합니다. (3) 종료한 컨테이너는 --all 옵션 없이는 ls 명렁어에 조회되지 않습니다. 이후 (4) start 명령어로 재실행한 후, (5) 확인합니다.

$ docker container ls                             # (1)
CONTAINER ID   IMAGE     COMMAND
6f3e40d12122   nginx     "/docker-entrypoint.…"
 
$ docker container stop 6f3e                      # (2)
6f3e
 
$ docker container ls                             # (3)
 
$ docker container start 6f3e                     # (4)
6f3e
 
$ docker container ls                             # (5)
CONTAINER ID   IMAGE     COMMAND
6f3e40d12122   nginx     "/docker-entrypoint.…"

2. 도커 컨테이너 일시 정지 명령어

때때로, 실행 중인 컨테이너를 일시 정지해야 할 때도 있습니다. 주로, 시스템 리소스가 제한된 상황에서 리소스가 부족할 때 일시 정지하는데요. 도커 컨테이너를 일시 정지하면, 해당 컨테이너에 할당되었던 리소스를 잠시 반환하기 때문입니다.

컨테이너 일시 정지를 위한 명령어는 다음과 같습니다.

$ docker container pause [OPTIONS] CONTAINER [CONTAINER...]

섹션 1에서 보았던 stop 명령어와 유사합니다. 위 명령어를 실행하면 도커 데몬은 해당 컨테이너에 SIGSTOP 신호를 보내서 해당 프로세스를 잠시 중단합니다.

일시 정지한 컨테이너를 재개하기 위해서는 다음의 명령어를 입력합니다.

$ docker container unpause CONTAINER [CONTAINER...]

이 명령어는 일시 정지되었던 도커 컨테이너에 SIGCONT 신호를 보내서 하던 작업을 이어서 하도록 만듭니다.

예제로 확인해보겠습니다.

$ docker container ls                                 # 컨테이너 ID 확인
CONTAINER ID   IMAGE  ...   STATUS
6f3e40d12122   nginx   ...  Up 11 seconds
 
$ docker container pause 6f32                         # 컨테이너 일시 정지
6f3e
 
$ docker container ls                                 # 컨테이너 일시 정지 확인
CONTAINER ID   IMAGE  ...   STATUS
6f3e40d12122   nginx   ...  Up 26 seconds (Paused)
 
$ docker container unpause 6f3e                       # 컨테이너 재실행
6f3e
 
$ docker container ls                                 # 컨테이너 재실행 확인
6f3eCONTAINER ID   IMAGE  ...   STATUS
6f3e40d12122   nginx   ...  Up 44 seconds

Paused 상태의 컨테이너는 docker container ls 명령어에 조회가 되며, STATUS 항목에 (Paused) 라고 명시됩니다. 이 상태에서 unpause 명령어를 실행하면 다시 구동하는 것을 확인할 수 있습니다.

3. 도커 컨테이너 전체 중지 및 종료

도커는 따로 모든 컨테이너 일괄 중지 및 종료 옵션을 제공하지 않습니다. 하지만 2가지의 도커 명령어를 함께 사용하는 방법으로 컨테이너를 모두 중지할 수 있습니다.

명령어는 다음과 같습니다.

$ docker container stop $(docker container ls -aq)

여기서 사용한 docker container ls 명령어의 -a 옵션은 모든 상태의 컨테이너를 조회하는 --all 옵션이며, -q 옵션은 컨테이너 ID 만 출력하는 --quiet 옵션입니다.

이렇게 출력한 ID 목록을 쉘 스크립트 문법 $() 를 이용해서 stop 명령어의 인자로 보내주는 것입니다.

실제로 사용하면 다음과 같습니다.

$ docker container ls -aq                               # 대상 컨테이너 ID 확인
6f3e40d12122
7d392cc25008
 
$ docker container stop $(docker container ls -aq)      # 컨테이너 전체 종료
6f3e40d12122
7d392cc25008
 
$ docker container ls                                   # 컨테이너 전체 종료 확인
CONTAINER ID   IMAGE     COMMAND

모든 컨테이너를 중지하는 간편한 방법이지만, 혹시나 실행중이어야 했던 컨테이너까지 예상치 못하게 중지하는 상황이 생길 수도 있습니다. 그러니 꼭 주의해서 사용하세요.

4. 컨테이너 중지 후 삭제 명령어

도커는 새롭게 명령어 체계를 개편하면서, 컨테이너 종료와 삭제를 동시에 하는 명령어는 제외시켰습니다. 따라서 다음과 같이 2개의 명령어를 이어서 사용하는 것을 가장 추천합니다.

$ docker container stop [container-id]
$ docker container rm [container-id]

docker container rm 명령어는 정지 상태의 도커 컨테이너를 삭제할 때 사용하며, 더 자세한 내용은 컨테이너 삭제 포스트에서 확인하세요.

그러나, 정말로 이 작업을 하나의 명령어로만 하고 싶다면 도커의 레거시 명령어인 docker rm 명령어의 --force 옵션을 사용할 수는 있습니다.

$ docker rm -f [container-id]

이 명령어는 해당 컨테이너에 곧바로 SIGKILL 신호를 보내서, 강제 종료합니다. 컨테이너 삭제는 해당 컨테이너 내부의 모든 데이터를 함께 삭제하니 언제나 신중, 또 신중하게 실행하는 것 잊지 마세요.

5. 컨테이너를 강제 종료하는 kill 명령어와 --signal 옵션

컨테이너 중지 및 종료 시, 모든 프로세스를 안전하게 종료하는 docker container stop 명령어가 언제나 최우선 방법입니다. 그러나, 응답 없음 상태나 잘못된 이미지로 만들어져 조작이 어려운 컨테이너라면 강제 종료가 필요합니다.

도커는 컨테이너 강제 종료를 위한 별도의 명령어를 제공하고 있습니다. 바로, kill 명령어 입니다.

$ docker container kill [OPTIONS] CONTAINER [CONTAINER...]

이 명령어는 하나 이상의 컨테이너에 SIGKILL 신호를 보내서, 해당 컨테이너를 즉시 종료합니다.

만약, SIGKILL 이외의 다른 신호를 보내고자 한다면 --signal 옵션을 통해 지정할 수 있습니다. 하지만, kill 명령어를 사용할 상황이면 이미 다른 신호를 무시하고 있는 프로세스이기 때문에 다른 응답을 기대하기는 쉽지 않다고 생각합니다.

kill 명령어를 사용하면, 즉시 강제 종료되어 예기치 못한 데이터 소실 등의 상황이 벌어질 수도 있습니다. 따라서, 이에 대한 백업이나 대비가 필요한 부분입니다.

6. 컨테이너 중지 timeout 설정하기

섹션 1에서 docker container stop 명령어를 실행하면, 컨테이너에 SIGTERM 신호를 보내 프로세스를 안전하게 중지하도록 기다린다고 했죠. 도커가 기다리는 이 시간의 기본값은 10초로 설정되어 있습니다.

10초가 짧은 시간은 아니지만, 컨테이너 종료 과정이 복잡해서 10초가 지난다면 도커는 SIGKILL 신호로 이 컨테이너를 강제 종료합니다. 이 과정에서 예기치 못한 데이터 소실 등이 발생할 수 있고요. 이 때문에 때로는 더 긴 시간을 부여해줄 수 있어야 합니다.

stop 명령어의 --time 옵션이 바로 이 역할을 합니다.

$ docker container stop -t 30 my_container

만약 위와 같은 명령어를 실행했다면, 해당 컨테이너는 30초 내에 종료 과정을 모두 마쳐야 합니다. 그 이후에는 강제 종료됩니다.

7. permission denied 발생 시 해결 방법

컨테이너 중지 과정에서 permission denied 에러 메시지를 마주할 수 있는데요. 메시지가 말해주듯이, 현재 유저가 도커 컨테이너를 조작하기에 충분한 권한을 가지고 있지 않기 때문에 발생하는 일입니다.

도커는 기본적으로 root 혹은 관리자 권한을 필요로 합니다. 개인 사용자의 경우에는 권한 설정이 자유롭지만, 엔터프라이즈 환경이나 협업하는 경우 권한이 필요한 만큼 설정되어 있지 않을 가능성이 존재합니다.

이 때는 도커 명령어를 root 권한으로 실행하거나, 호스트가 아닌 유저라도 도커를 사용할 수 있는 docker group 에 속하는 방법으로 해결합니다.

7.1. sudo 키워드 사용

root 권한을 사용하는 방법은 간단합니다. 다음과 같이 sudo 키워드를 함께 사용합니다. 호스트 계정의 비밀번호를 알고 있어야겠죠?

$ sudo docker container stop [container-id]

7.2. docker user group에 추가

다음은, 명령어마다 sudo 키워드를 사용할 필요 없이, 현재 유저에 도커 사용 권한을 부여하는 방법입니다. 아래 명령어를 실행하고, 로그아웃한 후 현재 유저로 재로그인하면 그룹 설정이 적용되어 있습니다.

$ sudo usermod -aG docker $USER

위 명령어는 현재 로그인한 유저($USER) 를 docker 라는 그룹에 추가하기 위해 (-aG: append Group), 유저 속성을 변경하는 (usermod: user modify) 명령어입니다. 이 방법도 sudo 명령어를 위한 비밀번호가 필요합니다.

이렇게 2가지 방법으로 도커 사용 권한을 획득해서 permission denied 문제를 해결할 수 있습니다.

8. 마치며

이번 포스팅은 도커 컨테이너 중지, 일시 정지, 전체 종료, 중지 후 삭제, 강제 종료, timeout 설정, 권한 문제 해결 등의 내용을 다루었습니다. 이러한 내용들이 실제 개발 과정에서 도움이 되길 바라겠습니다.

copyright for docker container stop

© 2023 All rights reserved.