1. 개요
운영 중인 Docker 호스트에서 특정 컨테이너(Grafana)가 docker stop, docker kill, docker exec 등의 명령에 응답하지 않고, 다른 컨테이너는 정상 동작하는 상황이 발생하였다.
본 문서는 해당 현상의 원인 분석 과정과 현실적인 대응 방안을 정리한다.
2. 증상 요약
- docker ps 상 컨테이너는 Up 상태
- docker stop / kill / exec 명령이 특정 컨테이너에서만 실패
- 다른 컨테이너 및 docker 명령은 정상 동작
- 호스트 재기동은 즉시 불가
- 디스크 사용률 99% 상태 확인
- ps 결과에서 해당 컨테이너 프로세스 상태가 Sl로 표시
- containerd-shim 프로세스가 지속적으로 존재
3. 주요 점검 내용
3.1 Docker 데이터 루트 확인
docker info | grep -i "Docker Root Dir"
df -h <Docker Root Dir 경로>
- Docker data-root는 특정 디렉토리이나, 실제 파일시스템은 루트 디스크(/)를 사용 중
- OverlayFS 특성상 루트 파일시스템 사용량 증가와 직결됨
3.2 디스크 사용량 분석
df -h
docker system df
관찰 사항:
- /var/lib/docker/overlay2 관련 overlay 마운트 다수
- Docker Images, Local Volumes, Build Cache에서 reclaimable 비율 매우 높음
- 디스크 full 상태가 컨테이너 비정상 동작의 직접적인 트리거로 판단됨
3.3 이미지/볼륨 상태
docker system df
- 사용 중이지 않은 이미지 다수 존재
- 태그가 없는(dangling) 이미지뿐 아니라, 컨테이너에 참조되지 않는 태그 이미지도 포함
- Local Volume에서 대용량 reclaimable 공간 확인
3.4 프로세스 상태 확인
docker inspect <container_id> | grep Pid
ps -eo pid,stat,cmd | grep <container_id>
- containerd-shim 프로세스가 존재
- 프로세스 상태 Sl
- SIGKILL이 즉시 반영되지 않음
4. 원인 분석
본 현상은 다음 요인이 복합적으로 작용한 결과로 판단된다.
- Docker 데이터 영역 디스크 full
- Grafana 특성상 지속적인 디스크 I/O 발생
- OverlayFS + containerd-shim 구조
- 커널 레벨에서 I/O 관련 리소스 대기 상태 진입
결과적으로 컨테이너 프로세스가 커널 리소스를 점유한 채 해제되지 않는 상태가 되었으며, Docker/Containerd 레벨에서는 해당 프로세스를 강제 종료할 수 없는 상태로 판단된다.
5. containerd-shim 설명
- containerd와 실제 컨테이너 프로세스 사이의 중계 프로세스
- 컨테이너 표준 입출력 및 생명주기 관리 담당
- 컨테이너 프로세스가 커널 레벨에서 block될 경우 shim도 함께 해제 불가 상태가 될 수 있음
6. 대응 방안 정리
6.1 즉시 가능한 조치 (서비스 유지 목적)
- 사용하지 않는 이미지/볼륨/빌드 캐시 정리
docker image prune -a
docker volume prune
docker builder prune -a
- 문제 컨테이너를 대체하는 신규 컨테이너 기동
- 기존 좀비 컨테이너는 유지한 채 우회 운영
6.2 containerd 재기동 판단
systemctl restart containerd
- 시도는 가능하나 성공 보장 없음
- 커널 D state 또는 I/O block 상태에서는 효과 제한적
- 다른 정상 컨테이너에 영향 가능성 존재
6.3 근본 해결
- 호스트 머신 재기동
- 커널 리소스 초기화
- zombie / orphan containerd-shim 정리
- Docker/Containerd 상태 일관성 복구
운영 중인 서비스 특성상 점검 시간 확보 후 재기동 권장
7. 결론
- 특정 컨테이너만 종료되지 않는 현상은 Docker 문제가 아닌 커널 및 스토리지 리소스 상태 문제일 가능성이 높음
- 디스크 full 상태는 Docker 컨테이너 안정성에 직접적인 영향을 미침
- containerd 재기동은 임시 시도 수단이며, 확실한 복구는 호스트 재기동
- 재발 방지를 위해 Docker data-root 분리 및 주기적인 이미지/볼륨 정리 필요
8. 운영 권고 사항
- Docker 데이터 디스크 분리 운영
- 로그 로테이션 및 모니터링 설정
- docker system df 정기 점검
- 디스크 사용률 임계치 알람 설정