컨테이너 수명주기¶
개요¶
이미지가 "어떻게 생겼는지"에 대한 설계도라면, 컨테이너는 그 설계도를 실제로 실행해 돌아가는 프로세스예요. 같은 이미지에서 컨테이너를 몇 개든 띄울 수 있고, 각각은 서로 간섭하지 않아요. 이 페이지에서는 컨테이너가 만들어지고, 돌다가, 멈추고, 사라지기까지의 수명주기를 따라가 볼게요.
상위 문서: Docker · 이미지와 도커파일 · 네트워킹
핵심 개념¶
생성과 실행. docker run 이미지는 컨테이너를 만들고 바로 실행해요. 이때 이미지 위에 얇은 쓰기 레이어가 얹히고, 실행 중 바뀌는 파일은 여기에 기록돼요. 컨테이너를 지우면 이 쓰기 레이어도 함께 사라져요.
상태와 전환. 컨테이너는 running(돌아가는 중), exited(종료됨), paused(일시정지) 같은 상태를 오가요. docker ps는 실행 중인 것만, docker ps -a는 종료된 것까지 보여줘요.
docker start— 종료된 컨테이너를 다시 실행docker stop— 종료 신호를 보내 정리 후 멈춤docker rm— 컨테이너(와 쓰기 레이어)를 완전히 삭제
프로세스가 없으면 컨테이너는 바로 종료돼요. 이벤트 루프를 돌며 계속 살아 있는 프로세스(웹 서버 등)를 띄워야 컨테이너가 유지되는데, 초보 때 흔히 겪는 "바로 꺼지는 문제"의 원인이 바로 이거예요.
재시작 정책. 컨테이너가 죽었을 때 어떻게 할지를 --restart로 정할 수 있어요. unless-stopped는 컨테이너가 명시적으로 멈추지만 않으면 데몬과 함께 다시 살려 줘요. 운영에서 어지간히 죽지 않게 하려면 이 옵션을 넣어 두는 게 좋아요.
로그와 프로세스 분리. docker logs로 컨테이너의 표준 출력을 확인해요. 컨테이너 안 프로세스는 기동 시 PID 1로 뜨는데, 이 프로세스가 자식 프로세스를 정리하지 않으면 고아가 생길 수 있어요. 그래서 한 컨테이너에는 한 역할(한 프로세스 묶음)만 담는 게 다루기 쉬워요.
실제 적용(데이터스케쳐스)¶
우리는 컨테이너를 손으로 띄우기보다 Kubernetes에 맡겨요. 그래서 여기서 다룬 재시작 정책 같은 관리 책임을 쿠버네티스가 대신하고요. 수명주기 개념은 로컬 개발에서 이미지를 테스트하거나 디버깅할 때(예: docker run으로 컨테이너를 띄워 봤을 때) 유용해요. 컨테이너가 왜 바로 죽었는지는 docker ps -a와 docker logs로 확인하면 금방 보여요.
더 알아보기¶
- 공식 문서 (1차): Docker Docs, docker run reference, docker ps
- 큐레이션/블로그 (2차): Containers overview