CKA를 준비해보자 15일차 - Commands

0

CKA

목록 보기
15/43

Commands

시험을 위해 명령어들을 정리해보도록 하자.

Application Commands

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으로 대치되는 것이 아니라, ENTRYPOINTsleep10이 함께 만나서 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가 되는 것이다.

만약, 파라미터가 없다면 CMDENTRYPOINT와 함께 사용되는 것이다.

docker run ubuntu-sleeper

로 실행하면 sleep 5가 된다.

만약, docker run 명령어로 ENTRYPOINT 명령어를 override하고 싶다면 다음과 같이 쓸 수 있다.

docker run --entrypoint sleep2.0 ubuntu-sleeper 10

kubernetes pod에서의 command와 arguments

위와 같이 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로 옮겨보도록 하자.

  • pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-sleeper-pod
spec:
  containers:
    - name: ubuntu-sleeper
      image: ubuntu-sleeper
      args: ["10"]

pod에 argsENTRYPOINT의 argument를 넘겨주는 것이다.

이제 실행하여 결과를 확인하면 된다.

kubectl create -f pod-definition.yaml

그런데, 만약 ENTRYPOINT를 override하고 싶다면 어떻게해야할까?? docker run --entrypoint를 사용하듯이 말이다. 이때 사용하는 것이 바로 command field이다.

  • pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-sleeper-pod
spec:
  containers:
    - name: ubuntu-sleeper
      image: ubuntu-sleeper
      command: ["sleep2.0"]
      args: ["10"]

command에 써진 값은 ENTRYPOINT로 대체된다. 따라서 위의 podsleep2.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명령어로 commandargs를 함께 쓸 수는 없다. --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이 되는 것이다.

정리하자면 다음과 같다.

시작 명령어입력 매개변수
dockerENTRYPOINTCMD
kubernetescommandargs

따라서, kubernetes에서 command를 입력하면 docker의 ENTRYPOINT부분이 덮어쓰여진다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN