콘텐츠로 이동

컨테이너 수명주기

개요

이미지가 "어떻게 생겼는지"에 대한 설계도라면, 컨테이너는 그 설계도를 실제로 실행해 돌아가는 프로세스예요. 같은 이미지에서 컨테이너를 몇 개든 띄울 수 있고, 각각은 서로 간섭하지 않아요. 이 페이지에서는 컨테이너가 만들어지고, 돌다가, 멈추고, 사라지기까지의 수명주기를 따라가 볼게요.

상위 문서: Docker · 이미지와 도커파일 · 네트워킹

핵심 개념

생성과 실행. docker run 이미지는 컨테이너를 만들고 바로 실행해요. 이때 이미지 위에 얇은 쓰기 레이어가 얹히고, 실행 중 바뀌는 파일은 여기에 기록돼요. 컨테이너를 지우면 이 쓰기 레이어도 함께 사라져요.

$ docker run --name api -d -p 8080:80 myapp:latest

상태와 전환. 컨테이너는 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 -adocker logs로 확인하면 금방 보여요.

더 알아보기