본문 바로가기

Computer/Docker

컨테이너 - Docker

반응형

컨테이너란 호스트 OS 상에 논리적인 구획을 만들고 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것입니다. 애플리케이션이 작동하는 플랫폼에 상관 없이 자유롭게 사용하며 버젼 관리와 배포를 쉽게 할 수 있다는 것이죠.

Docker 로고

컨테이너를 이용한 오픈 소스 가상화 플랫폼으로는 2013년에 출시된 Docker 가 있습니다. 로고에서 보듯이 컨테이너에 애플리케이션에 필요한 각종 라이브러리 등을 담아 여러 항구 (플랫폼)에 배포하게 되는데요. 도커는 가상화 기술이 발전하면서 개인이 일일히 서버의 환경을 셋팅하기 힘들어지면서 탄생한 Immutable Infrastructure Paradigm 기반으로 만들어졌습니다. 

Immutable Infrastructure Paradigm 이란 Host OS (Window, Mac, Linux, ..)와 서비스에 필요한 다양한 환경 (서비스를 위해 서버에 설치되어야 할 각종 코드, 애플리케이션, 시스템 라이브러리 등)을 분리하여, 서비스 환경에 필요한 부분을 이미지화 하여 배포하는 것을 의미합니다. 즉, Host OS와 서비스 운영 환경을 분리하고 서비스 운영 환경에 필요한 부분을 이미지화하여 환경 업데이트시 이미지만 변경하는 식으로 작동한다는 것이죠.

이러한 패러다임은 컨테이너 가상화 기술로서 구현이 가능해지며 현재 대부분의 서비스들이 컨테이너 기반의 인프라 구축을 사용하고 있습니다.  이번 포스트에서는 컨테이너 가상화 기술과 기존 가상화 기술인 VM에 대해 알아보도록 하겠습니다.

컨테이너

컨테이너는 호스트 OS의 리소스를 논리적으로 분리시키고 여러 개의 컨테이너가 공유하여 사용합니다. Guest OS를 따로 설치해야 하는 Virtual Machine 기반의 가상화 기술에 비해 오버헤드가 적어 가볍고 고속으로 작동합니다. 

일반적으로 물리 서버 상에 설치한 호스트 OS의 경우 하나의 OS 상에서 움직이는 여러 애플리케이션은 똑같은 시스템 리소스를 사용하므로 데이터 디렉토리를 공유하고 동일한 IP 주소로 통신을 합니다. 따라서 여러 애플리케이션에서 사용하고 있는 미들웨어나 라이브러리의 버젼이 다를 경우 충돌을 방지하도록 따로 주의해야 합니다. 하지만 컨테이너는 OS나 디렉토리, IP 주소와 같은 시스템 자원을 마치 각 애플리케이션이 독립적으로 점유하고 있는 것처럼 보이게 할 수 있습니다.

Docker 구조

Docker 공식 문서에 따르면 컨테이너는 코드 및 종속성을 함께 패키징하는 애플리케이션 계층의 추상화라고 정의됩니다. 즉, 하나의 Host OS 위에서 자원만 (커널) 공유할 뿐 각 컨테이너는 서로 독립적으로 분리된 공간에서의 프로세스로 실행됩니다. 즉, 컨테이너는 프로세스 단위의 서로 분리 독립된 가상환경이라 생각할 수 있으며 컨테이너의 정보를 담고 있는 Docker 이미지를 통해 Docker만 설치되어 있다면 어떤 인프라에서든 사용 가능합니다. 

컨테이너의 OS는 기본적으로 리눅스 OS만 지원합니다. 이때, 컨테이너끼리는 OS 커널만 공유함으로써 컨테이너에 담긴 OS 이미지는 호스트 OS와의 다른 부분만 패키징됩니다. 예를 들어 호스트 OS가 Ubuntu이고 컨테이너의 OS가 CentOS라면 Ubuntu와 CentOS와의 차이가 되는 부분만 담기게 됩니다. 따라서 컨테이너 내에서 명령어를 수행하면 실제로는 호스트 OS 커널이 명령을 수행하게 됩니다.

Docker 개요

Docker는 애플리케이션의 실행에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하기 위한 오픈소스 플랫폼입니다.

기존의 일반적인 시스템 개발 흐름 상에서는 각 환경마다 미들웨어, 라이브러리의 버젼이 다르거나 인프라 환경이 다르기 때문에 개발 환경이나 테스트 환경에서 올바르게 작동해도 제품 실제 환경에서는 정상적으로 작동하지 않는 경우가 있습니다. 

일반적인 시스템 개발 흐름

Docker는 이러한 인프라 환경을 컨테이너로 관리합니다. 애플리케이션의 실행에 필요한 모든 파일 및 디렉토리들을 Docker 이미지로 빌드하여 이를 이용해 각 환경에서 컨테이너를 가동시킵니다. Docker만 설치되어 있다면 매우 쉽게 컨테이너를 가동시킬 수 있고 각 환경에 따라 애플리케이션을 동일한 환경에서 가동시킬 수 있으므로 환경 간의 이식성 (portability)를 도모할 수 있습니다. 즉, 온프레미스, 클라우드 간 환경에서도 손쉽게 실행 환경을 선택할 수 있게 되는 것이죠.

Docker를 사용한 시스템 개발 흐름

Docker로 인한 높은 이식성은 시스템 유지/보수 입장에서 굉장히 중요합니다. 애플리케이션의 실행 환경에 제약이 많게 되면 개발 속도가 떨어지는 경우도 많고 온프레미스 환경에서의 경우 복잡한 인프라 구성으로 쉽게 다룰 수 없는 복잡한 환경이 되어버리기 때문입니다. 즉, 실행 환경의 구축, 버젼 관리 등이 아닌 온연한 솔루션 개발에 집중할 수 있게 된다는 것이죠. 또한 애플리케이션의 버젼 업을 할 때에도 단순히 이미지만 바꾸면 됩니다.

 

Virtual machine

Virtual machine은 호스트형 서버 가상화로 하드웨어 상에 베이스가 되는 호스트 OS를 설치하고 호스트 OS에 가상화 스프트웨어를 설치한 후 가상화 소프트웨어 상에서 Guest OS를 작동시키는 기술입니다. 가상화 소프트웨어로는 대표적으로 VMWare나 Virtual Box가 있습니다. 하지만 이 방식은 호스트 OS 상에서 다른 Guest OS를 움직여야 하기 때문에 오버헤드가 커지고 부팅 속도가 느립니다.

하나의 Host OS 상에서 OS자원을 공유한 채 프로세스 단위에서 독립적인 가상환경을 지원하는 컨테이너와 달리 가상환경은 하나의 서버를 여러 서버로 전환하는 물리적인 하드웨어의 추상화로서 하나가 독립된 OS 커널을 가진 완전한 컴퓨터를 설치하는 방법입니다 (컨테이너보다 더 높은 수준으로 격리됩니다). 즉, OS를 별도로 포함해야 되기 때문에 매우 무겁습니다.

하지만 물리적 하드웨어의 가상화로부터 오는 이점 또한 있습니다. 컨테이너는 호스트 OS를 공유하므로 컨테이너 하나가 공격당하면 다른 컨테이너까지 위험해질 수 있는 확률이 높아집니다. 하지만 VM의 경우는 물리적인 하드웨어 단에서 격리되다 보니 보안에 굉장히 강력합니다. VM이 공격당한다 하더라도 다른 VM이나 호스트에는 상관이 없게 되니까요. 또한, 컨테이너는 호스트 OS를 공유하게 되니 호스트 OS와 다른 OS를 올릴 수 없습니다. 하지만 VM은 윈도우 호스트에 리눅스, 리눅스 호스트에 윈도우 등으로 multi-OS 설치가 가능합니다.

따라서, 컨테이너와 VM의 장점을 합치기 위해 VM 상에 컨테이너를 올리는 3중첩 인프라 구성도 발전되고 있습니다. VM의 단점인 Guest OS는 nano, photon, atomic 등의 초 경량화 OS를 사용하는 것으로 대체하고요. 어차피 모든 애플리케이션은 컨테이너로 구성될 것이니 OS의 불필요한 부분을 없앤 초경량화 OS를 사용하자는 것입니다. 컨테이너가 공격받아도 컨테이너가 속한 VM을 제외한 나머지 VM은 안전하니 보안 상에도 이점이 있습니다.

반응형

'Computer > Docker' 카테고리의 다른 글

Docker 이미지 커맨드  (0) 2021.04.03
Docker의 작동 구조  (0) 2021.03.27
Docker의 기능  (0) 2021.03.27
리눅스  (0) 2021.03.22
하드웨어와 네트워크  (0) 2021.03.22