소개
Docker 컨테이너는 현대 소프트웨어 개발 및 배포에 필수적인 요소가 되었습니다. 이러한 컨테이너가 적절하게 종료되는 것은 애플리케이션의 안정성과 신뢰성을 유지하는 데 중요합니다. 이 튜토리얼에서는 Docker 컨테이너를 정상적으로 중지하는 방법과 컨테이너 종료에 대한 최상의 관행을 안내합니다.
Docker 컨테이너 수명주기 이해
Docker 컨테이너 수명주기를 완전히 이해하려면 컨테이너가 있을 수 있는 다양한 상태와 이러한 상태 간의 전환 방법을 아는 것이 중요합니다.
컨테이너 상태
Docker 컨테이너는 다음과 같은 상태로 존재할 수 있습니다.
- Created: 컨테이너는 생성되었지만 시작되지 않았습니다.
- Running: 컨테이너는 현재 실행 중이며 주 프로세스를 실행하고 있습니다.
- Paused: 컨테이너의 주 프로세스가 일시 중지되었지만 컨테이너는 여전히 활성 상태입니다.
- Stopped: 컨테이너가 중지되었으며 주 프로세스가 종료되었습니다.
- Restarting: 컨테이너가 현재 다시 시작 중입니다.
- Removing: 컨테이너가 시스템에서 제거 중입니다.
stateDiagram-v2
[*] --> Created
Created --> Running
Running --> Paused
Paused --> Running
Running --> Stopped
Stopped --> Running
Stopped --> [*]
Running --> Restarting
Restarting --> Running
Running --> Removing
Removing --> [*]
컨테이너 수명주기 관리
Docker 엔진은 컨테이너의 수명주기를 관리하여 필요에 따라 컨테이너를 생성, 시작, 중지 및 제거합니다. 이는 docker run, docker stop, docker start, docker rm과 같은 다양한 Docker 명령을 통해 수행됩니다.
컨테이너가 생성되면 "Created" 상태입니다. 컨테이너를 시작하려면 docker start 명령을 사용하여 컨테이너를 "Running" 상태로 전환합니다. 컨테이너가 실행 중일 때 docker pause를 사용하여 일시 중지할 수 있으며, 이는 컨테이너를 "Paused" 상태로 만듭니다. 컨테이너를 다시 시작하려면 docker unpause를 사용합니다.
실행 중인 컨테이너를 중지하려면 docker stop 명령을 사용하여 컨테이너의 주 프로세스를 정상적으로 종료하고 "Stopped" 상태로 전환합니다. 중지된 컨테이너를 다시 시작하려면 docker start 명령을 다시 사용할 수 있습니다.
마지막으로, 시스템에서 컨테이너를 제거하려면 docker rm 명령을 사용하여 컨테이너를 "Removing" 상태로 전환하고 영구적으로 제거합니다.
## 새로운 컨테이너 생성
## 컨테이너 시작
## 컨테이너 일시 중지
## 컨테이너 일시 중지 해제
## 컨테이너 중지
## 중지된 컨테이너 시작
## 컨테이너 제거
Docker 컨테이너가 있을 수 있는 다양한 상태와 수명주기를 관리하는 데 사용되는 명령어를 이해함으로써 컨테이너의 동작을 효과적으로 제어하고 모니터링할 수 있습니다.
Docker 컨테이너 정상 종료
Docker 컨테이너를 중지할 때는 정상적인 종료 과정을 보장하고 잠재적인 데이터 손실이나 애플리케이션 문제를 방지하기 위해 정중하게 종료하는 것이 중요합니다.
docker stop 명령
실행 중인 Docker 컨테이너를 중지하는 주요 명령은 docker stop입니다. 이 명령은 컨테이너의 주 프로세스에 SIGTERM 신호를 보내며, 프로세스를 강제 종료하는 SIGKILL 신호를 보내기 전에 정상적인 종료를 위해 (기본값은 10 초) 유예 기간을 제공합니다.
docker stop [OPTIONS] CONTAINER [CONTAINER...]
[OPTIONS]에는 다음이 포함될 수 있습니다.
-t,--time=: 컨테이너가 종료되기 전에 기다릴 시간 (초) (기본값은 10 초).
정상 종료 전략
Docker 컨테이너의 정상 종료를 보장하려면 다음 전략을 구현할 수 있습니다.
SIGTERM 신호 처리: 애플리케이션의 주 프로세스가
SIGTERM신호를 감지하고 데이터 플러싱, 연결 종료 및 리소스 해제와 같은 정상 종료를 수행하도록 합니다.종료 스크립트 사용: 컨테이너의 진입점이나 명령으로 실행되는 사용자 정의 스크립트를 만듭니다. 이 스크립트는 컨테이너가 종료되기 전에
SIGTERM신호를 처리하고 필요한 종료 절차를 수행할 수 있습니다.
#!/bin/bash
## SIGTERM 신호를 받아 정상 종료 수행
trap 'echo "SIGTERM 신호를 받았습니다. 정상 종료 중..."; \
your_shutdown_logic; \
exit 0;' SIGTERM
## 애플리케이션의 주 프로세스 실행
your_application_command
- 헬스체크 활용: 애플리케이션의 준비 및 활성 상태를 확인하는 Docker 헬스체크를 구성합니다. 이를 통해 컨테이너가 정상 상태인지 확인하고 중지하려고 시도할 수 있습니다.
## Dockerfile
HEALTHCHECK --interval=5s --timeout=3s \
CMD your_healthcheck_command || exit 1
- 적절한
--time옵션 설정:docker stop을 사용할 때--time옵션을 사용하여 적절한 유예 기간을 설정하여 애플리케이션이 정상 종료할 충분한 시간을 제공합니다.
docker stop --time=30 my-container
이러한 전략을 구현함으로써 Docker 컨테이너가 제어되고 안정적으로 중지되도록 보장하여 데이터 손실이나 애플리케이션 문제의 위험을 최소화할 수 있습니다.
컨테이너 종료를 위한 최선의 방법
Docker 컨테이너를 안정적이고 효율적으로 종료하기 위해 다음과 같은 최선의 방법을 고려하십시오.
정상 종료 처리 구현
이전 섹션에서 설명했듯이 SIGTERM 신호를 처리하고 애플리케이션을 정상적으로 종료하는 것이 중요합니다. 이는 다음을 포함합니다.
- 애플리케이션의 주 프로세스에서
SIGTERM신호를 감지합니다. - 데이터 플러싱, 연결 종료 및 리소스 해제와 같은 필요한 정리 및 종료 로직을 실행합니다.
- 종료가 완료된 후 프로세스를 정상적으로 종료합니다.
종료 스크립트 사용
컨테이너의 진입점이나 명령으로 실행되는 사용자 정의 종료 스크립트를 활용합니다. 이 스크립트는 SIGTERM 신호를 처리하고 모든 컨테이너에서 일관되고 안정적인 종료를 보장하는 종료 프로세스를 조정할 수 있습니다.
#!/bin/bash
## SIGTERM 신호를 받아 정상 종료 수행
trap 'echo "SIGTERM 신호를 받았습니다. 정상 종료 중..."; \
your_shutdown_logic; \
exit 0;' SIGTERM
## 애플리케이션의 주 프로세스 실행
your_application_command
헬스체크 구성
애플리케이션의 준비 및 활성 상태를 확인하기 위해 Docker 헬스체크를 설정합니다. 이를 통해 컨테이너가 정상 상태인지 확인하고 종료 프로세스 중 문제 발생 위험을 줄일 수 있습니다.
## Dockerfile
HEALTHCHECK --interval=5s --timeout=3s \
CMD your_healthcheck_command || exit 1
적절한 --time 옵션 설정
docker stop 명령을 사용할 때 --time 옵션을 사용하여 적절한 유예 기간을 설정하는 것을 고려하십시오. 이는 애플리케이션이 정상 종료할 충분한 시간을 제공하여 데이터 손실이나 애플리케이션 문제 가능성을 줄입니다.
docker stop --time=30 my-container
컨테이너 종료 모니터링
특히 배포나 확장 작업 중 컨테이너의 종료 프로세스를 주의 깊게 모니터링합니다. 종료 단계에서 문제나 예기치 않은 동작을 식별하기 위해 컨테이너 로그 및 메트릭을 관찰합니다.
재시작 정책 구현
always, on-failure, 또는 unless-stopped과 같은 적절한 재시작 정책을 컨테이너에 구성합니다. 이를 통해 예기치 않은 종료나 오류 발생 시 컨테이너가 자동으로 다시 시작되도록 할 수 있습니다.
## docker-compose.yml
version: "3"
services:
my-app:
restart_policy:
condition: on-failure
이러한 최선의 방법을 따르면 Docker 컨테이너의 안정적이고 제어된 종료를 보장하여 데이터 손실이나 애플리케이션 문제의 위험을 최소화할 수 있습니다.
요약
이 튜토리얼에서는 Docker 컨테이너를 올바르게 종료하는 방법을 배웠습니다. 컨테이너 수명 주기를 이해하고 정상 종료 기법을 구현하며 최선의 방법을 따르면 Docker 기반 애플리케이션을 효과적으로 관리하고 예기치 않은 문제를 방지할 수 있습니다. 컨테이너를 올바르게 종료하는 것은 Docker 사용의 중요한 측면이며, 이 지식은 강력하고 안정적인 인프라를 유지하는 데 도움이 될 것입니다.



