[Docker] 01. 컨테이너 (Container)이란?
카테고리: DOCKER
태그: docker
[Docker] 01. 컨테이너 (Container)이란?
🔔 컨테이너 (Container)이란?
「컨테이너」는 애플리케이션을 구동하기 위한 환경을 격리한 공간을 의미한다.
-
즉, 컨테이너란 호스트 OS상에서 논리적인 영역(컨테이너)를 만들고, 애플리케이션을 작동시키기 위해 필요한 라이브러리나, 바이너리 등을 하나로 모아, 별도의 서버인 것 처럼 사용할 수 있게 만든 공간을 말한다.
-
가상화를 위해 Hypervisor와 가상머신에 OS를 별도로 설치하여 운영하는 것 과는 달리, 컨테이너는 OS를 제외하고 애플리케이션 실행에 필요한 파일만을 패키징한 형태인 만큼 가상머신에 비해 가볍고 빠르게 동작이 가능하다.

🔔 가상머신과 컨테이너의 차이점
(1) 가상화 방식
【가상머신】는 기존의 서버에 하이퍼바이저를 설치하고, 그 위에 Guest OS와 애플리케이션을 패키징한 가상머신을 만들어 애뮬레이팅하는 방식인 「하드웨어 수준의 가상화」, 반면 【컨테이너】는 호스트 OS의 커널을 공유하면서 운영체제의 커널이 여러 격리된 사용자 공간 인스턴스를 갖출 수 있도록 프로세스를 격리된 환경에서 실행시키는 「운영체제 수준의 가상화」 기술이다.
(2) 경령화 & 리소스 절감
【컨테이너】는 Guest OS와 하이퍼바이저가 없는 운영체제 수준의 가상화 구조이기 때문에 시스템에 요구사항이 적으며, 컨테니어를 생성 및 실행하면 **OS 위에서 하나의 애플리케이션이 동작하는 것과 동일한 수준의 컴퓨팅 자원만을 필요**로 하기 때문에 【가상머신】 대비 시스템 부하가 적은 편이다.
그리고 운영체제가 포함되지 않아 크기가 아무리 커봐야 수십~수백 MB 정도로 비교적으로 가벼워 복제와 배포에 용이하다.
반면, 【가상머신】은 기본적으로 운영체제가 포함되어 GB를 넘고, 각각의 Guest OS 마다 운영체제에 필요한 하드웨어의 가상 복제본(가상 컴퓨팅 리소스)를 필요로 하기 떄문에 시스템 자원 또한 많이 소모한다.
(3) 안정성
【가상머신】은 각각의 가상머신들이 독립된 형태로 완전히 분리되어 있기 때문에 안정적인 운영이 가능하며, 완전한 격리로 만일 가상머신이 외부로부터 공격을 당하면 해당 가상머신의 OS에만 영향을 받고, 다른 가상머신들과 호스트 OS에는 영향을 받지 않는다.
반면, 【컨테이너】은 통제된 영역이라 할지라도 호스트 OS의 커널을 공유하는(프로세스 레벨의 격리) 구조이기 때문에 한쪽에 장애가 발생하면 다른 컨테이너들 또한 영향을 받을 수 있다.
(4) 구동 방식
【컨테이너】는 특정 애플리케이션이 실행되기 위한 라이브러리와 바이너리 파일 등이 패키지화되어 있기 때문에 기존의 시스템에서 애플리케이션을 실행하듯이 실행된다.
반면, 【가상머신】은 특정 애플리케이션을 실행하기 위해 먼저 가상머신을 띄우고 자원할당한 다음, 필요한 Guest OS를 부팅한 후 애플리케이션을 실행한다.
🔔 컨테이너를 사용하는 이유
(1) 개발자 관점
(a) 일관성 있는 환경 & 배포 편이성
-
개발 팀원 간에 각각의 개발 환경 차이로 문제가 발생하는 경우가 있는데, 마찬가지로 고객사의 운영 환경과 개발 환경 차이로 실행되기까지 어려움이 있었다.
-
그런데, 컨테이너는 그 환경을 컨테이너가 담고 있기 때문에 애플리케이션 개발이 완료되면 개발했던 환경 그대로 배포할 수 있다.
-
컨테이너는 OS 설치가 필요 없으며, 그 안에는 앱과 앱을 실행하기 위한 파일들로 구성된 MB 정도의 이미지로 생성되므로 배포를 위한 주고받는 것의 부담이 줄어든다.
(b) 컨테이너의 확장성, MSA(Microservices Architecture)
-
컨테이너는 호스트 OS 위에서 각각의 독립적인 프로세스 처럼 관리되고 실행되며, 불필요한 OS 설치 작업 및 인프라를 독립적으로 나눌 필요가 없어 확장성이 좋고 빠르다.
-
MSA는 여러 개의 서비스를 분리시켜 놓은 구조로, MSA의 세분화된 서비스와 컨테이너의 확장성의 장점이 맞물리면서 컨테이너를 배포와 운영하는 것이 유리하다.
(2) 관리자 관점
(a) 뛰어난 성능 & 경량화로 인한 시스템 자원을 좀더 효율적으로 사용 가능
-
기존 가상화 방식은 각 가상먼신마다 독립된 커널 OS가 존재하고 하드웨어를 애뮬레이팅하기 때문에 무겁고 느릴 수 밖에 없으며, 또한 각 환경마다 쓸 수 있는 자원이 고정으로 정해져 있기 때문에 컴퓨터의 성능과 환경이 제한되었다.
-
반면 컨테이너는 가상머신 보다 적은 컴퓨팅 리소스을 사용하며, 성능 또한 빠르다 컨테이너를 생성하는 것은 OS 입장에서 프로세스를 시작하는 것과 같으며, 또한 각 환경마다 사용할 수 있는 자원이 고정으로 정해져 있지 않아 유동적으로 사용 가능하다.
-
컨테이너는 호스트 커널을 공유되기 때문에 새로운 커널을 시작할 필요도, 하드웨어 초기화 등의 작업도 필요 없다 물론 프로세스를 격리하는 오버헤드가 존재하지만, 가상머신의 하드웨어 에뮬레이트와 비교하였을 때 오버헤드가 거의 없다.
(b) 높은 이식성
-
모든 컨테이너는 호스트의 환경이 아닌 독자적인 실행환경을 가지고 있으며, 이 환경은 파일들로 구성하고 이미지 형식으로 공유할 수 있다.
-
리눅스 커널을 사용하고 같은 컨테이너 런타임을 사용할 경우 컨테이너 실행 환경을 쉽게 공유하고 재현할 수 있다. 즉, Public 클라우드와 기업 내의 서버 어디서나 운영 및 이식하는데 용이하다.
(c) 환경 구축 기간 단축 & 장애 대응
-
컨테이너는 개발/테스트/운영 환경을 단순히 복사로 구축하여 작업시간을 단축시킬 수 있다.
-
컨테이너는 이미지 단위로 배포하고 운영하기 때문에 시스템 유지보수, 장애 발생시 무정지 작업이 가능하다.
댓글 남기기