컨테이너 종료 시까지 블로킹하는 docker container wait 명령어 사용 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker container wait 명령어를 효과적으로 사용하는 방법을 배우게 됩니다. 이 명령어는 스크립팅 및 자동화를 위한 강력한 도구로, 지정된 컨테이너가 중지될 때까지 실행을 일시 중지할 수 있도록 해줍니다.

먼저 detached mode (-d) 를 사용하여 Docker 컨테이너를 백그라운드에서 시작합니다. 그런 다음, docker container wait를 사용하여 이 백그라운드 컨테이너가 실행을 완료할 때까지 터미널을 블록합니다. 블로킹 동작을 시연하기 위해 별도의 터미널에서 컨테이너를 중지합니다. 마지막으로, docker container wait 명령어가 반환하는 종료 코드를 관찰하여 컨테이너의 종료 상태를 이해합니다.

백그라운드에서 컨테이너 시작

이 단계에서는 Docker 컨테이너를 백그라운드에서 시작하는 방법을 배우게 됩니다. 컨테이너를 백그라운드에서 실행하면 터미널을 점유하지 않고 작동할 수 있으므로, 장시간 실행되는 서비스나 애플리케이션에 유용합니다.

먼저, alpine 이미지를 가져와 보겠습니다. 이는 테스트에 유용한 매우 작은 Linux 배포판 이미지입니다.

docker pull alpine

이미지가 가져와지고 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다.

Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

이제 -d 플래그를 사용하여 alpine 컨테이너를 백그라운드에서 시작합니다. -d 플래그는 "detached mode"를 의미합니다. 또한 컨테이너 내에서 간단한 명령인 sleep 30을 실행하여 컨테이너가 종료되기 전에 30 초 동안 실행되도록 합니다.

docker run -d alpine sleep 30

이 명령을 실행하면 Docker 는 전체 컨테이너 ID 를 출력합니다.

<container_id>

컨테이너가 백그라운드에서 실행 중인지 확인하려면 docker ps 명령어를 사용할 수 있습니다. 이 명령어는 현재 실행 중인 모든 컨테이너를 나열합니다.

docker ps

다음과 유사한 출력을 볼 수 있으며, 실행 중인 alpine 컨테이너가 표시됩니다.

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
<container_id>   alpine    "sleep 30"    X seconds ago   Up X seconds             <container_name>

STATUS 열에는 Up 다음에 컨테이너가 실행된 기간이 표시됩니다. 이는 컨테이너가 detached mode 로 실행 중임을 확인해 줍니다.

docker container wait 를 사용하여 컨테이너가 중지될 때까지 블로킹

이 단계에서는 docker container wait 명령어를 사용하는 방법을 배우게 됩니다. 이 명령어는 하나 이상의 컨테이너가 중지될 때까지 블록하고, 그런 다음 해당 종료 코드를 출력합니다. 이는 컨테이너 내의 백그라운드 프로세스가 다른 작업을 진행하기 전에 완료될 때까지 기다려야 할 때 유용합니다.

먼저, 이전 단계에서 시작한 컨테이너의 ID 를 가져오겠습니다. 실행 중인 컨테이너의 컨테이너 ID 만 얻기 위해 docker ps -q를 사용할 수 있습니다.

docker ps -q

이 명령어는 컨테이너 ID 를 출력합니다. 다음 명령에 필요하므로 이 ID 를 복사하십시오.

<container_id>

이제 docker container wait 명령어를 사용하고 방금 얻은 컨테이너 ID 를 입력합니다.

docker container wait <container_id>

이 명령을 실행하면 터미널이 멈춘 것처럼 보일 것입니다. 이는 예상되는 동작입니다. docker container wait 명령어는 블로킹 (blocking) 되므로, 지정된 컨테이너가 중지될 때까지 실행을 일시 중지합니다. 컨테이너가 현재 sleep 30 명령을 실행 중이므로, 이 명령어는 컨테이너가 완료될 때까지 최대 30 초 동안 대기합니다.

컨테이너가 ( sleep 30 명령을 완료하거나 수동으로 중지되어) 중지되면 docker container wait 명령어는 블록을 해제하고 컨테이너의 종료 코드를 출력합니다.

예를 들어, 컨테이너가 30 초 후에 성공적으로 중지되면 다음과 같은 출력을 볼 수 있습니다.

0

종료 코드 0은 일반적으로 컨테이너 내부의 명령이 성공적으로 완료되었음을 나타냅니다.

다음 단계에서 이 대기 명령과 상호 작용할 것이므로 이 터미널 창을 열어 두십시오.

다른 터미널에서 컨테이너 중지

이 단계에서는 새 터미널을 열고 실행 중인 컨테이너를 중지합니다. 이는 첫 번째 터미널에서 docker container wait가 컨테이너가 외부에서 중지될 때 어떻게 반응하는지 보여줍니다.

LabEx 환경에서 새 터미널 창을 엽니다. 일반적으로 "+" 아이콘을 클릭하거나 메뉴에서 "New Terminal"을 선택하여 수행할 수 있습니다.

이 새 터미널에서 다시 실행 중인 컨테이너를 식별해야 합니다. docker ps를 사용하여 실행 중인 컨테이너를 나열하고 컨테이너 ID 를 찾습니다.

docker ps

이전 단계와 유사한 출력을 볼 수 있으며, 컨테이너 ID, 이미지, 명령 등을 표시합니다.

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
<container_id>   alpine    "sleep 30"    X minutes ago   Up X minutes             <container_name>

이제 docker stop 명령어를 사용하고 컨테이너 ID 를 입력하여 컨테이너를 중지합니다.

docker stop <container_id>

터미널에 컨테이너 ID 가 다시 출력되어 중지 명령이 성공했음을 나타냅니다.

<container_id>

docker container wait를 실행한 첫 번째 터미널 창으로 다시 전환합니다. docker container wait 명령이 이제 완료되었고 종료 코드를 출력했음을 확인할 수 있습니다. 다음 단계에서 이 종료 코드를 검토합니다.

docker container wait 의 종료 코드 확인

이 마지막 단계에서는 첫 번째 터미널에서 docker container wait 명령으로 출력된 종료 코드를 검토합니다.

docker container wait <container_id> 명령을 실행한 첫 번째 터미널 창으로 다시 전환합니다.

명령어 다음 줄에 숫자가 출력되는 것을 볼 수 있습니다. 이 숫자는 컨테이너의 종료 코드입니다.

137

이전 단계에서 docker stop을 사용하여 컨테이너를 중지했습니다. docker stop을 사용하여 컨테이너를 중지하면 Docker 는 컨테이너의 주 프로세스에 SIGTERM 신호를 보내고, 유예 기간 후에 프로세스가 종료되지 않으면 SIGKILL 신호를 보냅니다. 종료 코드 137은 일반적으로 프로세스가 SIGKILL 신호에 의해 종료되었음을 나타냅니다 (128 + 9, 여기서 9 는 SIGKILL의 신호 번호입니다).

이는 docker container wait가 컨테이너가 중지될 때까지 기다릴 뿐만 아니라 컨테이너가 어떻게 중지되었는지에 대한 정보를 제공할 수 있는 종료 코드를 제공한다는 것을 보여줍니다. 컨테이너가 자연스럽게 sleep 30 명령을 완료했다면 종료 코드는 0이었을 것입니다.

어느 터미널에서든 docker ps -a를 실행하여 컨테이너가 중지되었는지 확인할 수 있습니다. -a 플래그는 중지된 컨테이너를 포함한 모든 컨테이너를 표시합니다.

docker ps -a

alpine 컨테이너가 나열되고 상태가 Exited (<exit_code>)로 표시되는 것을 볼 수 있습니다.

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
<container_id>   alpine    "sleep 30"    X minutes ago    Exited (137) X seconds ago             <container_name>

이것으로 docker container wait 사용에 대한 랩을 마칩니다. 백그라운드에서 컨테이너를 시작하고, docker container wait를 사용하여 컨테이너가 중지될 때까지 기다리고, 다른 터미널에서 컨테이너를 중지하고, 결과 종료 코드를 관찰하는 방법을 배웠습니다.

요약

이 랩에서는 -d 플래그와 docker run 명령을 사용하여 Docker 컨테이너를 백그라운드에서 시작하고 docker ps로 상태를 확인하는 방법을 배웠습니다. 또한 지정된 컨테이너가 중지될 때까지 실행을 차단한 다음 종료 코드를 반환하는 docker container wait 명령의 목적을 이해하면서 이 명령을 탐구하기 시작했습니다.