Cloud

Container 101 - (1) Introduction

Operation CWAL 2022. 1. 10. 21:42

지금 여러분이 IT업계에서 일하고 있다면 컨테이너라는 단어를 언젠가 한번은 꼭 들어봤을 것이다.

단순히 가상화 기술이라고 하기엔 그 범위와 중요성이 너무 커서, 더 이상 컨테이너 기술을 모른다면 Cloud Native 시대를 생존하기 어려울 지경이다. 도대체 컨테이너가 뭔데, 얼마나 좋길래 이렇게 난리인걸까? 

 

그 질문에 앞서 '왜 컨테이너가 필요할까?'를 먼저 생각해 볼 필요가 있다. 다음과 같이 정말 원시적인 호스팅 환경을 예로 들겠다.

 

 

서버 1대에 여러개의 어플리케이션을 배포하였다. 어플리케이션은 단독으로 실행되지 않고, 패키지나 라이브러리(ex: libssl.so)와 같은 Dependency가 존재하며 서로 같은 라이브러리를 공유할 수 있다.

이제 특정 어플리케이션을 업그레이드하면서 dependecy가 존재하는 라이브러리도 같이 업데이트했다고 가정하자. 그런데 운이 없게도 해당 라이브러리를 참조하는 다른 어플리케이션이 더 이상 실행되지 않는다! 구 버전의 라이브러리만 사용 가능하기 때문이다. 또한 라이브러리 외에도 특정 파일, 환경변수 등을 여러개의 어플리케이션에서 같이 사용한다면 이러한 이슈가 발생할 수 있다.

 

또 다른 문제는 호스팅 환경과 어플리케이션 간의 coupling이 발생한다는 점이다. 머신 A에서 잘 돌아가던 어플리케이션이 머신 B에선 알 수 없는 이유로 죽는다거나, 신규 개발자 PC에 개발환경 셋업하는데 며칠씩 걸리던 경험은 누구나 갖고 있을 것이다.

 

The Matrix from Hell

'The Matrix from Hell'이라 불리우는 이 문제는, 2013년 Docker가 소개되고 컨테이너 기술이 성장하면서 마침내 해결될 수 있었다(Docker에 대한 내용은 2부에서 따로 다루겠다).

 

아래 그림과 같이 어플리케이션, 그리고 의존성이 있는 라이브러리와 패키지, 파일 및 환경변수 등을 H/W, OS(정확히는 커널)로부터 격리된 환경에 패키징된 단위를 컨테이너라고 한다. 그리고 컨테이너의 생성, 삭제 등 전체 Lifecycle을 관리해주는 미들웨어가 바로 Docker와 같은 컨테이너 런타임(Container Runtime)이다.

 

 

하나의 호스트에 위치한 모든 컨테이너는 동일한 커널을 공유한다. 각 컨테이너 내부의 프로세스가 접근할 수 있는 리소스(파일시스템, 네트워크, PID 테이블 등)은 호스트 및 다른 컨테이너와 분리되어 있기 때문에 어플리케이션 간의 간섭을 최소화할 수 있다.

 

Linux Kernel 위에 어떤 오픈소스 S/W를 추가하는지에 따라 다양한 Ubuntu, RHEL, CentOS, SUSE와 같은 다양한 Linux 배포판(distribution)이 존재한다. 

https://www.techrepublic.com/article/how-to-find-the-right-linux-distribution-for-you/

 

이를 바꿔서 말하면 하나의 Linux 호스트에서 다양한 배포판의 컨테이너를 생성할 수 있다는 이야기가 된다. 예를 들어 Ubuntu OS 위에 RHEL 컨테이너나 Alpine Linux를 생성할 수 있다. 이처럼 커널만 같다면 Container Runtime이 설치된 모든 환경에서 컨테이너 배포가 보장할 수 있다(물론 Linux 호스트에서 Windows 컨테이너를 생성한다거나 그 반대는 불가).

 

그렇다면 컨테이너는 VM(Virtual Machine)과는 어떤 점에서 차이가 있을까? 단도직입적으로 말하자면 VM은 OS 수준의 격리, 컨테이너는 프로세스 수준의 격리라고 할 수 있다.

VM Vs. Container

 

VM은 Guest OS가 같이 구동되어야 하므로, 컨테이너에 비해 많은 리소스와 이미지 용량(수~수십GB), 부팅 시간을 필요로 한다. 컨테이너는 VM에 비해 상대적으로 경량화되어 있기 때문에, 어플리케이션을 호스트에서 바로 실행하는 것과 같은 속도로 가동할 수 있으며, 이미지 용량도 수십MB 단위로 줄일 수 있는 것이 큰 장점이다.

 

하지만 VM과 컨테이너는 상호 배타적인 기술이 아니다. 오히려 많은 Cloud Native 어플리케이션이 아래 그림처럼 VM 안에서 컨테이너 형태로 배포되는 것을 알 수 있는데, 이를 통해 보다 높은 가용성(Availability)과 리소스 효율 극대화, 비용 절감을 얻을 수 있다.

 

 

 

다음 시간은 Container의 기반이 되는 기술인 Namespace와 CGroups에 대해서 알아보겠다.

'Cloud' 카테고리의 다른 글

Azure - Role Based Access Control  (0) 2022.03.06
Azure - Virtual Network Peering  (0) 2022.03.04
Amazon RDS - Read Replica와 Multi AZ 비교  (0) 2021.11.07
Amazon RDS - 개요  (0) 2021.11.05
Container Vs. VM  (0) 2021.06.26