Docker - Container vs VM

문한성·2023년 4월 6일
0

공부

목록 보기
15/28
post-thumbnail

가상머신(virtual machine)

클라우드 서비스 형태로는 기본 엔진 (AWS : EC2 , GCP : CGE 등) 으로 제공된다.

VM의 구현 방법에 따라 다르지만, 기본적으로 하이퍼바이저가 여러개의 VM을 띄우고 실행한다. 이때 중요한 것은 각 VM마다 독립된 실행 환경을 제공한다는 것이다. 즉 VM1과 VM2가 동일한 OS를 사용한다고 하더라도, 데이터는 물론이고 코드도 전혀 공유하여 사용하지 않는다.

이로 인해 각 VM마다 최소 GB 단위의 공간이 필요하며, VM 수에 비례해서 늘어나게 된다.

퍼포먼스 오버헤드도 상당하다. 하드웨어까지 가상화하는 전가상화(full-virtualization)이냐 그렇지 않은 반가상화(para-virtualization)이냐에 따라 다르지만, 보통 부팅 시에 상당한 시간이 소요된다.

전가상화의 느린 속도를 보완하기 위해 현재는 반가상화 방식으로 퍼포먼스를 제공하나 아직은 리얼 머신에 비해 느리다.

예를 들면 VMware, Virtual Box 와 같이 Host OS 위에 Guest OS를 가상화 하는 방식인데, 예전에는 Guest OS 전체를 가상화했고 이 방식은 간단하지만 무겁고 느려 운영환경에는 적용하기 어려웠다.

그래서 현재는 Xen 과 같은 반가상화 방식으로 구성된다.

컨테이너(Container)

무겁고 느린 가상화방식을 해결하기 위해 프로세스를 격리하는 방안이 등장했다.

컨테이너화는 커널 하나에 격리된 여러 개의 사용자 공간 인스턴스가 포함 될 수 있도록 애플리케이션 수준에서 이루어지는 가상화의 일종이다. 이런 인스턴스를 컨테이너라고 부른다.

컨테이너는 애플리케이션 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 구성을 하나의 인스턴스에 패키징하는 기본적인 방법을 제공한다. 컨테이너는 하드웨어에 설치된 커널(운영 체제) 하나를 공유한다.

Docker의 컨테이너는 독립된 실행환경을 제공하지 않는다.

즉 OS의 많은 자원들을 컨테이너들끼리 공유한다( 높은 이동성 )

덕분에 부팅시간이 훨씬 짧고,

컨테이너 개수가 늘어나더라도 디스크 공간을 많이 차지하지 않는다.

또한, 컨테이너가 완전히 독립된 실행환경을 제공하지 않고 공유한다고 하더라도, 각 컨테이너 내의 프로세스들은 이를 감지하지 못하고, 자신이 OS의 모든 자원을 독점하고 있다고 생각한다.

컨테이너 장점

1. 가벼움

서버에서 가상 머신보다 공간을 더 적게 차지하며, 시작하는데 일반적으로 몇 초 밖에 걸리지 않는다.

2. 탄력성

탄력적이여서 리소스를 별도로 할당할 필요가 없다. 따라서 컨테이너는 서버의 리소스를 더 효율적이고 동적으로 사용한다. 컨테이너 하나에 대한 수요가 감소하면 여분의 리소스를 다른 컨테이너에서 사용할 수 있다.

3. 밀도

밀도란 물리적 서버 한 대에서 동시에 실행할 수 있는 개체 수를 의미한다. 컨테이너화를 사용하면 호스트 서버의 리소스를 완전히 이용하지만 과다하게 이용하지 않는 밀집된 환경을 조성할 수 있다. 컨테이너는 전용 운영 체제를 호스트할 필요가 없으므로 가상화와 비교하여 보다 밀집한 환경이 가능하다.

4. 성능

리소스 압박이 큰 경우 애플리케이션 성능은 하이퍼바이저를 사용하는 것보다 컨테이너가 훨씬 우수하다.

가상머신에서는 게스트 OS도 자체 메모리 요구 사항을 충족해야 하기에 RAM을 호스트에서 가져와야한다.

5. 유지관리 효율

운영 체제 커널이 하나밖에 없기 때문에 운영 체제 수준에서 업데이트 또는 패치 작업을 한 번만 수행하면 변경사항이 모든 컨테이너에 적용된다. 이를 통해 서버를 더 효율적으로 운영하고 관리한다.

도커는 하이퍼바이저가 필요없고 도커엔진만 있으면 그 위에 어플리케이션, Binary, 라이브러리가 포함된 컨테이너만 올리면 되는 구성이다. OS의 자원인 커널을 공유하지만 어플리케이션 단위로 추상화하여 서로 격리하는 형태이다.

오버헤드가 없기에 시작 시간이 짧고, 자원 효율성이 높으며 메모리를 훨씬 적게 차지한다. Host OS가 어느 것이든 상관없이 도커 엔진만 있다면 배포가 가능하다. 이런 사항을 확장하면 멀티 클라우드, 하이브리드 환경 구축이 가능하다.

컨테이너 단점

보안 이슈가 있다. 컨테이너는 커널을 공유한다. 즉, 논리적으로 격리한 개념인데 당연히 물리적으로 격리한 가상머신에 비해서는 보안이 취약 할 수 밖에 없다. 그리고 컨테이너는 MSA( Microservice Architecture ) 와 최적화 되었을때 빛을 본다.

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글