컨테이너는 OS를 점유하지 않고 특정한 task나 process를(ex.webserver, app server, db) 실행하기 때문에,
task가 완료되면 컨테이너는 exit 된다.
즉, 컨테이너는 프로세스가 동작중일 때만 살아있는다.
예를 들어, 컨테이너 내부의 web server가 중지되거나 crash되면, 컨테이너도 종료된다.
(위 그림을 보면, ubuntu를 run했으나 곧내 Exit 된걸 볼 수 있다)
그럼, 컨테이너 내에서 어떤 프로세스가 구동될지는 누가 정의할까?
docker file을 보면(여기서는 nginx), 'CMD'(=command)라는 instruction을 볼 수 있다.
즉, 해당 프로그램이 컨테이너가 시작되면, 컨테이너 내에서 구동될 것이라는 것을 의미한다.
mysql에는 mysqld가 있다.
Ubuntu 파일의 docker file도 보면, 'bash' 라는 default cmd가 있다.
그런데, bash는 webserver와 db와 같은 프로세스가 아니라 쉘이다.
* shell: 터미널로부터 input을 listen. 없으면 종료.
우리가 우분투 컨테이너를 생성할 때,
docker는 우분투 img로부터 container를 생성하고, bash program을 구동한다.
그런데, 기본적으로 docker는 터미널이 포함되어 있지 않기 때문에,
bash program은 터미널을 찾을 수 없고, 이내 프로세스는 시작되자마자 종료될 것이다.
1. 'docker run' command
: 컨테이너가 생성되자마자 종료되지 않기 위해서는 어떻게 해야할까?
sleep 5초를 줘보자.
# docker run ubuntu sleep 5 // ubuntu 컨테이너를 시작할 때, sleep program을 함께 구동, 5초간 기다렸다가 exit
* 그런데 이것은 일시적인데... 어떻게 영구적으로 적용할까?
새 커멘드를 만들면 된다.
docker build -t ubuntu-sleeper
docker run ubuntu-sleeper
단, CMD에는 항상 키와 값을 따로따로 써줘야 한다.
ex. ["sleep", "5"] // ["sleep 5"]하면 안됨
그럼 value(값)를 바꾸고 싶다면?
ENTRYPOINT로 명령어를 수행하고, CMD를 통해 매개변수 값을 입력한다.
런타임에 ENTRYPOINT를 sleep2.0으로 수정하고 싶다면?
entry point option을 사용해서 override할 수 있음.
# docker run --entrypoint sleep2.0 ubuntu-sleeper 10
그럼 위의 설정은 YAML에 어떻게 입력 할까?
args:가 CMD에 있는 매개변수 값으로, args에 value를 입력해준다.
그리고 ENTRYPOINT가 command: 이다. (Entrypoint를 수정하고 싶다면, YAML에 위와 같이 "sleep2.0"으로 바꿔도 된다)
출처: Udemy 사이트의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의