시험을 위해 명령어들을 정리해보도록 하자.
container는 vm과 달리 os를 구동하는 것이 아니라, os에서 특정 task를 구동하는 것이다. 따라서, 다음과 같이 os만 구동하는 경우 바로 container가 내려가게 된다.
docker run ubuntu
그래서 Dockerfile내부를 보면 CMD
로 명령어가 적혀있는데, 이 명령어가 바로 os에서의 특정 task이다. ubuntu
에서는 default CMD
가 바로 다음과 같다.
FROM ubuntu:14.04
...
CMD ["bash"]
따라서 ubuntu container를 실행하자마자 종료되는 것이다.
이 default command를 docker 명령어로 override하는 방법이 있는데 docker run
에 넘겨주면 된다.
docker run ubuntu [COMMAND]
docker run ubuntu sleep 5
이렇게 하면 sleep 5
명령어가 실행되는 것이다.
이 sleep 5
명령어를 image에 넣어서 계속 사용하기 위해서는 docker image를 새로 빌드하는 수 밖에 없다. 단, 5
라는 숫자는 parameter로 받도록 하자.
FROM Ubuntu
...
ENTRYPOINT ["sleep"]
다음과 같이 CMD
대신에 ENTRYPOINT
를 사용하면 해당 명령어를 기반으로 입력을 받을 수 있게 된다.
docker run ubuntu-sleeper 10
이렇게 실행하면 아까처럼 CMD
부분이 10
으로 대치되는 것이 아니라, ENTRYPOINT
의 sleep
과 10
이 함께 만나서 sleep 10
이 되는 것이다.
정리하자면 CMD
를 사용하면 docker run
명령어로 전달되는 command가 override되는 것이고, ENTRYPOINT
를 사용하면 odkcer run
명령어로 전달되는 command가 파라미터로 들어가는 것이다.
그런데, 만약 다음과 같이 실행하면 어떻게될까??
docker run ubuntu-sleeper
이렇게 실행하면 입력 파라미터가 없기 때문에 sleep
만 실행된다. 이는 우리가 원하는 것이 아니라, 따라서 default parameter를 주도록 해야하는데, 이를 위해서 ENTRYPOINT다음으로
CMD`를 함께 사용하는 것이다.
FROM Ubuntu
...
ENTRYPOINT ["sleep"]
CMD ["5"]
이 경우 만약 파라미터를 넣은 경우 CMD
부분이 override된다.
docker run ubuntu-sleeper 10
즉, sleep 10
가 되는 것이다.
만약, 파라미터가 없다면 CMD
가 ENTRYPOINT
와 함께 사용되는 것이다.
docker run ubuntu-sleeper
로 실행하면 sleep 5
가 된다.
만약, docker run
명령어로 ENTRYPOINT
명령어를 override하고 싶다면 다음과 같이 쓸 수 있다.
docker run --entrypoint sleep2.0 ubuntu-sleeper 10
위와 같이 docker run
으로 command와 argument들을 pod에서 실행하고 싶다면 어떻게 해야할까??
pod의 containers
에서 args
를 이용하면 ENTRYPOINT
에 대한 args
를 넘겨줄 수 있다.
FROM Ubuntu
...
ENTRYPOINT ["sleep"]
CMD ["5"]
다음과 같은 ubuntu-sleeper
image에서 sleep
을 10초 동안하는 container를 만들도록 하기 위해서는 docker에서 다음의 명령어를 실행하면 된다.
docker run ubuntu-sleeper 10
이를 pod로 옮겨보도록 하자.
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-sleeper-pod
spec:
containers:
- name: ubuntu-sleeper
image: ubuntu-sleeper
args: ["10"]
pod에 args
로 ENTRYPOINT
의 argument를 넘겨주는 것이다.
이제 실행하여 결과를 확인하면 된다.
kubectl create -f pod-definition.yaml
그런데, 만약 ENTRYPOINT
를 override하고 싶다면 어떻게해야할까?? docker run --entrypoint
를 사용하듯이 말이다. 이때 사용하는 것이 바로 command
field이다.
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-sleeper-pod
spec:
containers:
- name: ubuntu-sleeper
image: ubuntu-sleeper
command: ["sleep2.0"]
args: ["10"]
command
에 써진 값은 ENTRYPOINT
로 대체된다. 따라서 위의 pod
는 sleep2.0 10
로 실행되는 것이다.
단, command
의 경우에 docker의 CMD
와 헷갈리는 경우가 있는데, 헷갈리지 말도록 하자.
만약 kubectl run
명령어로 바로 args
를 사용하고 싶다면 다음과 같이 사용할 수 있다.
kubectl run {pod_name} --image={image} -- {args}
--
다음에 args
를 나열하면 된다. 가령 argument가 --color=green
이라면 다음과 같다.
kubectl run {pod_name} --image={image} -- --color=green
kubectl run
명령어로 command
와 args
를 함께 쓸 수는 없다. --command
flag를 켜면 {args}
에 해당하는 값들이 command
로 들어가기 때문이다.
kubectl run webapp-green --image=kodekloud/webapp-color --command -- python3 app.py -- color=green
--command
flag를 켜면 command
flag가 true
가 되어, --command
뒤의 --
부터는 모두 command
가 된다. 따라서 python3 app.py color=green
이 되는 것이다.
정리하자면 다음과 같다.
시작 명령어 | 입력 매개변수 | |
---|---|---|
docker | ENTRYPOINT | CMD |
kubernetes | command | args |
따라서, kubernetes에서 command
를 입력하면 docker의 ENTRYPOINT부분이 덮어쓰여진다.