공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/클라우드

[IBM Cloud 강의번역 프로젝트] - ch1-3. Building Container Images

inspirit941 2020. 9. 1. 16:28
반응형

IBM Cloud 1기 활동 - 강의번역 프로젝트.

 

원본 강의

cognitiveclass.ai/courses/kubernetes-course

 

Kubernetes and containers on IBM Cloud - Free Kubernetes course by IBM Cognitive Class

About this course Containers and Cloud Native are the most significant invention in IT since the introduction of virtualization. Everyone from a small startup to a large multinational corporation is transitioning to this technology and they are looking for

cognitiveclass.ai

강의의 한글자막 제공을 위해 srt 파일로 번역하는 프로젝트를 진행 중입니다.

문맥이 어색하거나 내용이 잘못되었다고 느껴지시면 댓글로 남겨주세요.

 


컨테이너 이미지를 구성하는 요소에는 어떤 것들이 있는지, 어떻게 빌드되는지를 살펴보겠습니다.

스크린샷 2020-09-01 오후 2 13 19

 

 

이 그림은 실행 중인 컨테이너가 어떻게 만들어지는지를 보여주고 있습니다.

 

도커 파일은 해당 이미지를 빌드하기 위한 일종의 청사진으로, 원하는 형태의 이미지를 구성하기 위한 개요를 제공합니다. 그 후, 도커가 도커 파일을 토대로 이미지를 빌드합니다.

 

컨테이너와 이미지의 차이점은 매우 중요한 개념입니다. 둘은 완전히 다른 개념을 지칭하는 용어이기 때문입니다.

 

이미지는 애플리케이션이 실행되기 위해 필요한 소스코드, 라이브러리, 의존 객체 등을 포함하는 불변 파일입니다. 불변 파일이라는 건, 읽기 전용 파일이라는 뜻입니다. 즉 이미지를 변경하면, 새로운 이미지를 생성하게 됩니다. 말하자면, 이미지는 컨테이너를 구성할 템플릿이자 청사진입니다. 컨테이너의 스냅샷이라고도 볼 수 있습니다.

 

따라서, 컨테이너는 실행 중인 이미지를 의미합니다. 이미지 자체는 읽기 전용인 불변 파일이므로, 기록 가능한 레이어가 이미지의 최상위에 배치되어 컨테이너가 이미지 파일을 실행할 수 있게 합니다.

 

객체지향 프로그래밍 개념으로 비유하자면 이미지는 일종의 클래스이며,
컨테이너는 그 클래스를 토대로 생성된 인스턴스입니다.

 

스크린샷 2020-09-01 오후 2 31 35

 

 

이 그림에서 알 수 있듯, 처음에는 이미지에 무엇을 포함할 것인지 도커 파일에 정의한 후, 정의한 도커 파일을 사용해서 이미지를 빌드합니다. 그 후 빌드된 이미지를 실행하면, 컨테이너가 생성됩니다. 이것이 컨테이너 생성을 위한 기본 절차입니다.

 

도커는 도커 파일에 정의된 내용을 토대로 이미지를 자동으로 빌드해 줍니다.

도커파일은 이미지 생성을 위해 사용자가 터미널에 입력하는 모든 명령어를 저장한 텍스트 파일입니다. 이후 강의에서 곧 자세히 알아보게 될 것입니다.

 

도커는 이미지 생성을 보다 간단히 할 수 있는 명령어를 제공합니다. 도커 명령어가 실행될 때마다, 현재 존재하는 이미지 레이어의 최상단에
새로운 레이어가 하나씩 쌓이면서 이미지가 빌드됩니다.

이렇게 말이죠.
[4개의 레이어가 순차적으로 나타납니다]

스크린샷 2020-09-01 오후 2 33 11

 

 

도커 명령어가 실행되면, 읽기 전용 설정의 레이어가 생성되는 구조입니다. 레이어의 개수는 이미지의 크기에 따라 다릅니다. 예시에는 네 개의 레이어가 있습니다.

 

도커파일에 있는 모든 도커 명령어를 실행하고 나면, 이미지의 빌드가 완료됩니다. 다시 말하지만, 이 이미지는 읽기 전용입니다. 설정을 변경할 경우 새로운 이미지를 생성하게 됩니다.

 

앞서 말했던 것처럼, 이미지를 실행하면 컨테이너가 됩니다. 이미지를 인스턴스화 하면, 실행 중인 컨테이너를 얻는 것입니다. 이 과정에서, 기록 가능한 컨테이너 레이어가 읽기 전용 레이어의 최상단에 추가됩니다.

 

앞서 말했듯 이미지는 불변 파일이지만, 컨테이너는 변경이 가능합니다. 컨테이너에서는 이미지를 실행하고, 연산을 수행하며, 개발자가 작성한 어떤 종류의 함수라도 실행할 수 있습니다. 이 기록 가능한 레이어에서 해당 작업들이 가능한 것입니다.

 

레이어는 이미지 간 공유가 가능합니다. 만약 서로 다른 두 개의 이미지에 공통된 레이어가 있다면, 이미지마다 새로 레이어를 생성하는 대신, 이미 생성된 레이어를 공유합니다. 이 특성 덕분에, 이미지를 주고받을 경우 네트워크 대역폭과 디스크 공간을 절약할 수 있습니다.

 

도커파일에서 사용할 수 있는 몇 가지 명령어는 다음과 같습니다.

 

스크린샷 2020-09-01 오후 3 14 12

 

모든 도커파일은 FROM이라는 명령어로 시작해야 합니다. 새로운 빌드 명령어의 시작이자, 앞으로 있을 모든 명령어를 적용할 기본 이미지를 정의합니다. 이 기본 이미지는 운영체제와 같은 공용 레포지토리, 또는 Go나 Node.js와 같은 특정 언어로 구성된 이미지를 말합니다.

 

다른 명령어를 마저 보겠습니다. RUN은 실행 명령어입니다. 예컨대 RUN 명령어 뒤에 'bash' 명령어를 입력해서, 원하는 작업을 실행시킬 수 있습니다. 실행된 명령어는 하나의 레이어가 되어, 이전 레이어 계층 위에서 실행됩니다.

 

ENV는 이미지의 환경변수를 설정하는 명령어입니다.

 

ADD와 COPY는 파일을 이미지에 복사하는 기능을 제공합니다. 이 명령어들은 예컨대 애플리케이션 코드를 이미지에 삽입할 때, 또는 이미지에서 실행하기 위해 사용할 수 있습니다.
이 둘의 주요 차이점은

COPY는 로컬에 있는 파일과 디렉토리에만 적용된다면, ADD는 외부 URL의 파일에도 적용이 가능합니다.

 

CMD 명령어는 도커 파일에서 한 번만 실행됩니다. 하나 이상의 CMD 명령어가 도커파일에 있을 경우 마지막 명령어만 실행됩니다. CMD는 컨테이너 실행을 위한 기본값을 제공하는 명령어입니다. 컨테이너에서 실행될 기본 파일을 지정합니다.

 

이제 도커 파일의 예시를 보며 실제 명령어가 어떤 의미인지 확인해 보겠습니다.

 

 

스크린샷 2020-09-01 오후 4 15 29

 

첫 번째 명령어는, 언제나 FROM입니다. 이 명령어는 기본 이미지를 정의하는 역할입니다. 예시의 경우 기본 이미지는 우분투 18.04 버전입니다. 이 이미지는 도커 허브에서 무료로 사용 가능하기 때문에 별다른 인증 절차가 필요하지 않습니다. 호스트 이름도 생략할 수 있습니다.

 

다음은 COPY 명령어입니다. 이 명령어는 "app" 이라는 디렉토리가 작업 디렉토리에 있다고 가정합니다. 디렉토리가 있다고 가정하면, 해당 디렉토리와 그 하위에 있는 모든 내용이 새로운 레이어의 형태로 이미지에 저장됩니다.

 

RUN 명령어는 애플리케이션의 빌드 작업을 수행하는 'make' 명령어를 실행합니다.

 

마지막으로 CMD 명령어는 이 컨테이너를 실행할 기본 파일을 지정합니다. 이 경우, Python 애플리케이션이 실행됩니다.

 

보시다시피 도커파일은 구성이 간단하고 실행하기 편리합니다.
도커 파일을 최적화하고 이미지 빌드를 보다 효율적으로 할 수 있는
고급 패턴이 있지만, 일반적으로는 이 정도 기본 명령어로도 컨테이너화를 시작하는 데 전혀 무리가 없습니다.

 

스크린샷 2020-09-01 오후 4 15 43

 

이제 도커파일을 활용해서 이미지를 빌드하는 데에 어느 정도 익숙해졌을 거라 생각합니다.

이미지가 어떤 레이어 구조로 만들어지는지,

각각의 레이어가 도커파일의 명령어와 어떤 관계가 있는지 알게 되셨을 것입니다. 컨테이너와 이미지의 차이가 무엇인지도요.

 

다음 강의에서는 컨테이너 레지스트리를 사용해서 이미지를 저장하는 방법을 알아보겠습니다.

반응형