도커 컨테이너 라이프사이클
도커 컨테이너가 Run상태로 가기 위해서는 2가지 방법이 존재합니다. docker run, docker. create가 있습니다. 그리고 pause <--> unpause를 통해서 다시 컨테이너를 실행시킬 수도 있습니다. 이 뿐만 아니라 stop <--> start를 통해서 다시 run상태로 할 수 있고 stop상태에서 rm을 하면 docker container를 삭제할 수 있게 됩니다.
더 심오한 라이프 사이클이 있는데, 이는 다양한 도커 명령어를 알아보면서 자연스럽게 이해해 보도록 하겠습니다.
컨테이너 시작
run, create둘다 컨테이너를 만드는데 가장 많이 사용되는 방법입니다. create는 컨테이너를 생성하고 -> 생성한 컨테이너를 start를 통해서 실행시키는 방법입니다. run은 한번에 이 모든것을 하는 것이구요
그리고 도커 create / run명령어는 모두 이미지가 없을 경우 자동으로 Registry에서 pull을 먼저 수행하여 이미지를 다운받습니다.
실습
https://github.com/get-p-dev/fastcampus-devops
우선 실습을 시작하기 위해 기존에 작성한 terraform code를 fork해서 AWS EC2인스턴스와 VPC를 만들어 주었습니다. 그리고 Kubernetes의 cluster가 되기 위한 최소 서버의 스펙은 램 2GB이상에다 저장공간 20GB이상이므로 t3.small에 저장공간도 이에 맞게 설정해 주었습니다.
해당 Instance의 PublicIP로 들어가서 실습을 진행해 보도록 하겠습니다.
기본적으로 docker를 깔아주었고, ps, ps -a을 통해 컨테이너 목록에 아무 것도 없음을 확인했습니다 그리고 사전에 run이나 pull을 통해서 nginx, ubuntu:focal 이미지를 ubuntu server에 받아왔습니다.
docker run nginx을 하고 ctrl + c을 누르게 되면 fore-ground에서 동작한 container가 Kill Signal을 받아 종료되고 docker ps -a를 통해서 확인 가능하게 됩니다.
그리고 docker create [name]을 통해서 컨테이너를 만들고 ps -a를 통해서 확인할 수 있습니다.
그리고 만든 컨테이너를 실행시키기 위해서 start명령어를 사용해줘야 하는데, 시작시키기 위해서는 container id, name을 활용할 수 있고 id중 최소 구별크기를 나름껏 복사한다음에 활용해도 됩니다.
다음과 같이 실행이 됩니다.
컨테이너 시작 주요 옵션
우선 -i는 컨테이너에서 실행되어야 하는 어플리케이션이 키보드 입력을 필요로 하는 경우에 호스트에서 주는 키보드 입력이 전달될 수 있도록 할 수 있습니다. 그리고 -t옵션은 host의 terminal에 tty을 적용시켜서 명령어를 컨테이너에 잘 전달하게 하는 옵션입니다. 그래서 -it는 셸을 실행할 떄 자주 사용됩니다.
--rm은 컨테이너가 실행 종료되면 자동으로 삭제과정을 거치게 하는 옵션입니다. 그리고 -d는 컨테이너가 background에서 daemon으로 돌아가게 합니다. 기존에 nginx을 run했을 때 이는 ctrl + c을 주면 종료되었습니다. 이렇게 foreground가 아닌 background에서 daemon으로 돌아가게 합니다.
--name은 컨테이너의 이름을 지정해줍니다. 또한 -p는 호스트 - 컨테이너간의 네트워크 포트를 바인딩하는 것이고, -v는 파일 시스템 ( 디렉토리 )를 마운트 하기 위한 옵션입니다. 즉 컨테이너가 호스트 운영체제 내의 파일시스템에 접근할 수 있는 상태가 되는 것입니다.
그 다음에 마지막으로 이미지 정보를 기입하면 해당 이미지를 기반으로 컨테이너를 만듭니다. 마지막으로는 컨테이너 내에서 실행할 선택적 명령어를 지정해 줄 수 있습니다.
실습
다음과 같이 ubuntu:focal은 "bash" command를 초기에 실행하는데, -it옵션을 주지 않게되면 바로 종료됩니다. 따라서 -it로 run을 하게되면 컨테이너 쉘에 접속하게 되고 명령어를 칠 수 있게 되고 exit을 통해서 나갈 수 있게 됩니다.
또한 자동으로 쉘에서 exit로 나가면 종료되지 않게 하려면 ctrl + p + q를 통해서 종료되지 않게 할 수 있습니다.
또한 -d옵션을 통해서 nginx컨테이너를 background에서 daemon으로 실행시킬 수 있습니다.
그리고 위와같이 --name으로 컨테이너의 name을 지정해 줄 수 있습니다.
그리고 다음과 같이 80:80으로 포트바인딩을 할 수도 있습니다.
curl을 통해서 localhost:80으로 요청을 보내보면 nginx기본 페이지가 80번 포트에 보여지게 됩니다 (nginx의 기본 포트는 80 )
그리고 마지막에 기본 Command를 지정해 줄 수 있는데 id를 출력하고 종료하게 했습니다.
그리고 --rm옵션으로 바로 종료되면 삭제하게 했습니다.
또한 컨테이너 id로 inspect해서 low 레벨의 컨테이너의 정보를 확인해볼 수 있습니다.
또한 docker pause, unpase에 대해 간단히 실습하겠습니다.
다음과 같이 pause, unpause으로 실행중인 컨테이너를 일시중지했다가 재개할 수 있습니다.
다음으로는 실제로 종료하는 명령어 입니다. stop, kill의 차이점은 컨테이너 관점에서 stop이 SIGTERM 시그널을 전달하여 안전하게 종료한다는 것이고 kill은 SIGKILL 시그널을 전달하여 강제로 종료한다는 차이점이 있습니다.
그리고 docker stop에 $(docker ps -a -q)으로 모든 컨테이너 id목록을 제공해주면 모든 컨테이너들이 종료되게 되는 일종의 trick입니다.
다음과 같이 모든 컨테이너를 종료시켰습니다.
stop은 뻔해서 넘어가도록 하겠습니다.
그리고 docker rm으로 컨테이너를 삭제할 수 있는데, -f을 주면 실행중인 컨테이너를 강제로 종료시키는 것이라는 차이가 있습니다. 그리고 이전에 run --rm으로 종료되면 바로 삭제될 수 있게 할 수 있습니다.
마지막으로 container prune으로 모든 컨테이너를 삭제할 수 있습니다.
다음과 같이 실행중인 컨테이너를 삭제했습니다.
다음과 같이 정상적으로 모든 컨테이너를 삭제할 수 있습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 환경변수 (0) | 2022.08.27 |
---|---|
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 엔트리포인트와 커맨드 (0) | 2022.08.27 |
[ Docker && Kubernetes ] - 도커 이미지와 컨테이너 (0) | 2022.08.27 |
[ Docker && Kubernetes ] - 개요 (0) | 2022.08.27 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 실습 AWS VPC에 OpenVPN구성 (1) | 2022.08.03 |