이번 포스트에서는 도커 컨테이너의 생명주기와 관련 명령어에 대해서 알아보겠습니다.
Container Lifecycle)
컨테이너가 생성되었지만 실행되고있지 않은 상태
예시
$ docker create --name app1 nginx:alpine
# nginx:alpine 를 사용해서 appi1이라는 이름의 컨테이너 생성
컨테이너가 활성화되어 실행중인 상태, 즉 프로세스가 실행중이라는 의미
컨테이너가 생성되었거나 중지된 경우, docker start를 사용해 시작될 수 있습니다
예시
$ docker start app1
# app1 실행
$ docker run -d --name app2 nginx:alpine
# 도커 생성과 실행을 한꺼번에 하려면 run 명령어를 사용하면 됩니다.
# d 명령어를 통해 백그라운드에서 실행
실행중인 컨테이너는 docker pause 명령어를 통해 일시 중지할 수 있습니다.
특정 컨테이너 내부의 모든 프로세스를 일시 중지(suspending or freezing)하는 효과가 있으며 디스크(파일 시스템) 부분과 메모리(RAM) 부분 모두 컨테이너의 상태가 그대로 유지됩니다.
$ docker pause app1 # app1 컨테이너 일시중지
$ docker unpause app1 # app1 컨테이너 일시중지 해제
pause) 를 구현하기 위해 유닉스의 POSIX 신호가 아니라 freezer cgroup이 사용되었습니다.컨테이너가 중지되어도 디스크 부분의 상태는 유지되지만, 메모리 부분의 상태는 지워진다는 것이 일시중지(pause) 상태와 다른 점입니다.
docker stop 명령어 사용
SIGTERM를 받게 되고 유예기간이 지난 후 SIGKILL 신호를 받게 됩니다.$ docker stop app1 # 유예기간 후 프로세스 종료
docker kill 명령어 사용
SIGKILL 신호가 직접 전송됩니다.docker kill은 SIGKILL뿐만 아니라, -signal/-s 인수를 사용하여 컨테이너 프로세스에 모든 신호를 발행하는 데에도 사용할 수 있습니다.$ docker kill app2 # 프로세스 즉시 종료
$ docker kill -s SIGINT app1 # SIGINT 신호 발행
메인 컨테이너 프로세스가 종료 또는 완료된 경우
$ docker run alpine echo "hi"
# 알파인 컨테이너 내에서 echo "hi" 명령을 실행하고 콘솔에 "hi"를 출력한 다음 echo 명령이 완료되면 즉시 종료
메모리 부족 예외(OOME; Out Of Memory Exception) 가 발생한 경우
$ docker run -m 50m redis:alpine
# m 옵션을 사용하여 컨테이너의 최대 가용 메모리를 제한
# redis:alpine 이미지로 컨테이너를 실행, 최대 가용 메모리는 50mb로 제한
생성(created)되거나 중지(stopped)된 컨테이너는 docker rm 명령어로 삭제될 수 있습니다.
즉, 실행중(running)이거나 일시중지(paused)된 컨테이너를 삭제하려고 시도할 경우에는 에러가 발생할 수 있습니다.
해당 명령어를 통해 프로세스들, 파일 시스템, 볼륨과 네트워크 매핑 등의 컨테이너와 관련된 모든 데이터를 삭제할 수 있습니다.
$ docker rm app1
