본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 95: Commands

by 공부하는 무니 2023. 1. 11.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이 섹션에서는 파드 definition 파일의 커맨드 및 arguments에 대해 설명합니다. 이것은 CKA 커리큘럼에 필수 항목으로 나와 있지는 않지만, 일반적으로 간과하기 쉬운 내용이므로 설명하는 것이 중요하다고 생각합니다. 먼저 도커에서의 커맨드와 컨테이너 개념을 refresh 합시다. 다음 강의에서 이 내용들을 파드로 바꿔서 살펴볼 것입니다.
이 강의에서는 Docker의 커맨드, arguments 및 entry point에 대해 살펴보겠습니다. 간단한 시나리오부터 시작하겠습니다. Ubuntu 이미지에서 Docker 컨테이너를 실행한다고 가정합니다. 
docker run ubuntu 커맨드를 실행하면 Ubuntu 이미지 인스턴스가 실행되고 즉시 종료됩니다. 실행 중인 컨테이너를 조회하면 실행 중인 컨테이너가 표시되지 않습니다. 중지된 컨테이너를 포함하여 모든 컨테이너를 조회하면 실행한 새 컨테이너가 종료된 상태임을 알 수 있습니다. 왜 그럴까요?


가상 머신과 달리 컨테이너는 운영 체제를 호스트하기 위한 것이 아닙니다. 컨테이너는 웹 서버, 애플리케이션 서버 또는 데이터베이스의 인스턴스를 호스팅하거나 일부 계산 또는 분석을 수행하는 것과 같이 특정 태스크 또는 프로세스를 실행하기 위한 것입니다.
작업이 완료되면 컨테이너가 종료됩니다. 컨테이너는 그 안에 있는 프로세스가 살아 있는 동안에만 살아 있습니다. 컨테이너 내부의 웹 서비스가 중지되거나 충돌하면 컨테이너가 종료됩니다.
그렇다면 컨테이너 내에서 어떤 프로세스가 실행되는지 정의하는 것은 누가 할까요? nginx와 같은 널리 사용되는 Docker 이미지의 Docker 파일을 보면 시작할 때 컨테이너 내에서 실행될 프로그램을 정의하는 커맨드를 나타내는 CMD라는 커맨드가 표시됩니다. nginx 이미지의 경우 nginx 커맨드입니다. MySQL 이미지의 경우 mysqld 커맨드입니다. 방금 시도한 것은 일반 Ubuntu 운영 체제로 컨테이너를 실행하는 것이었습니다.
이 이미지의 Docker 파일을 살펴보겠습니다. bash를 default 커맨드로 사용하는 것을 볼 수 있습니다. bash는 웹 서버나 데이터베이스 서버와 같은 프로세스가 아닙니다. 터미널에서 입력을 받는 쉘입니다. 터미널을 찾을 수 없으면 종료합니다.
이전에 Ubuntu 컨테이너를 실행했을 때 Docker는 Ubuntu 이미지에서 컨테이너를 만들고 bash 프로그램을 시작했습니다. default로 Docker는 실행될 때 컨테이너에 터미널을 연결하지 않습니다. 그래서 bash 프로그램은 터미널을 찾지 못하고 종료됩니다.
컨테이너가 생성될 때 시작된 프로세스가 완료되었으므로 컨테이너도 종료됩니다. 그렇다면 컨테이너를 시작하기 위한 다른 커맨드를 지정하려면 어떻게 할까요?
한 가지 옵션은 Docker run 커맨드에 커맨드를 추가하는 것입니다. 이렇게 하면 이미지에 지정된 디폴트 커맨드을 재정의합니다.

docker run ubuntu sleep 5

이 경우 추가 옵션으로 sleep 5 커맨드를 사용하여 docker run ubuntu 커맨드를 실행합니다. 이렇게 하면 컨테이너가 시작될 때 sleep 프로그램을 실행하고 5초 동안 기다린 다음 종료됩니다.
하지만 그 변화를 영구적으로 만드는 방법은 무엇일까요? 이미지가 시작될 때 항상 sleep 커맨드를 실행하기를 원한다고 가정해 봅시다. 그렇다면 base ubuntu 이미지에서 자신만의 이미지를 만들고 새 커맨드를 지정하면 됩니다.


커맨드를 지정하는 방법에는 여러 가지가 있습니다. 다음과 같이 간단하게 쉘 형식으로 입력할 수도 있고,JSON 형식으로 입력할 수도 있습니다.


그러나 JSON 형식으로 지정할 때 배열의 첫 번째 요소는 실행 파일(이 경우 sleep 프로그램)이어야 합니다. 커맨드와 파라미터를 함께 지정하지 마십시오. 커맨드와 해당 파라미터는 리스트에서 별도의 원소여야 합니다.
이제 Docker 빌드 커맨드를 사용하여 새 이미지를 빌드하고 이름을 ubuntu-sleeper로 지정합니다. 이제 docker run ubuntu-sleeper 커맨드를 실행하면 동일한 결과를 얻을 수 있습니다.

 


항상 5초 동안 잠들고 종료됩니다. 하지만 sleep 시간(초)을 변경하려면 어떻게 해야 할까요? 현재는 5초로 하드 코딩되어 있습니다. 이전에 배운 것처럼 한 가지 방법은 새 커맨드가 추가된 docker run 커맨드를 실행하는 것입니다. 이 경우 10을 추가하면 됩니다. 따라서 시작할 때 실행할 명령은 sleep 10이 됩니다.

docker run ubuntu-sleeper sleep 10

하지만 그다지 좋아 보이지는 않습니다. 이미지의 이름인ubuntu-sleeper는 그 자체로 컨테이너가 휴면 상태임을 의미합니다. 따라서 sleep 커맨드를 다시 지정하지 않아도 되기를 원합니다. 아래 처럼요.

docker run ubuntu-sleeper 10

우리는 컨테이너가 휴면해야 하는 시간(초)만 전달하고 싶고 sleep 커맨드가 자동으로 호출되면 좋을 것 같습니다. 그리고 이것이 entry point instruction이 작동하는 곳입니다. entry point instruction은 커맨드 instruction과 유사하며, 컨테이너가 시작될 때 실행될 프로그램을 지정할 수 있습니다. 커맨드라인에서 무엇을 지정하든 이 경우에는 10이 entry point에 추가됩니다. 따라서 컨테이너가 시작될 때 실행될 명령은 sleep 10입니다.
이것이 둘의 차이점입니다. CMD 명령의 경우 전달된 커맨드라인 파라미터가 완전히 대체됩니다. 반면 entry point의 경우 커맨드라인 파라미터가 추가됩니다.
이제 두 번째 케이스로, 다음 수를 추가하지 않고 ubuntu-sleeper이미지 커맨드를 실행하면 어떻게 됩니까? 그러면 시작할 때 커맨드은 sleep이며 operand가 없다는 오류가 발생합니다. 그렇다면 커맨드라인에 default값이 지정되지 않은 경우 명령의 default값을 어떻게 설정할까요?
이 때 entry point과 커맨드 instruction를 모두 사용합니다. 이 경우 커맨드 instruction이 entry point 명령에 추가됩니다. 따라서 시작할 때 커맨드라인에 파라미터를 지정하지 않은 경우 커맨드는 sleep 5가 됩니다. 그렇게 하면 커맨드 instruction이 무시됩니다. 이렇게 하려면 항상 entry point과 커맨드 instruction을 JSON 형식으로 지정해야 합니다.
마지막으로, 런타임 중에 entry point을 정말 정말 수정하고 싶다면 어떻게 해야 할까요? sleep에서 sleep2.0으로요. 이 경우 Docker 커맨드 instruction의 entry point 옵션을 사용하여 재정의할 수 있습니다. 시작할 때 최종 명령은 sleep2.0 2입니다.

반응형

댓글