본문 바로가기

IT

[Container] Container 란?

Container 란?


1. Container?

컨테이너(Container)는 애플리케이션을 작동시키기 위해 필요한 구성 파일, 라이브러리 및 실행하기 위한 dependency를 하나로 패키징 되어 있는 소프트웨어 실행 유닛입니다. Container 내 프로세스들은 격리되어 내부에서만 동작하지만, 리소스는 Container 가 동작하는 호스트 서버에 의존적입니다.

2. Container vs. VM

그러면 Container와 VM 은 무슨 차이가 있는 걸까요? 먼저, VM가상화 된 하드웨어라고 생각하면 됩니다. 가상화 기술에서는 각 VM 이 실제 물리적인 하드웨어를 emulate 하기 때문에 각 VM 별로 OS 가 반드시 실행되어야 합니다. 즉, 1개 물리서버(=Host) 리소스를 여러 대의 물리서버(=Guest)로 분할해서 사용하는 느낌입니다. 이러한 리소스 분할사용은 Hypervisor 가 담당하게 됩니다.

출처: https://azure.microsoft.com/ko-kr/overview/what-is-a-container/#overview

 

반면, Container는 가상화된 OS를 기반으로 오직 해당 애플리케이션에 필요한 dependency 만 포함되어 있고, 이를 하나로 패키징해놓은 상태입니다. 그리고, Container는 호스트 OS를 공유하기 때문에 하드웨어 시뮬레이션이 별도로 필요가 없어서 가상화 오버헤드가 VM 방식에 비해 거의 존재하지 않습니다. 또한, 컨테이너 별 사용자 프로세스는 사용자 공간으로 분리되어 서로 개입할 수 없습니다.

출처: https://azure.microsoft.com/ko-kr/overview/what-is-a-container/#overview

3. Container 장점

이러한 Container의 특징 덕분에 Container는 (VM에 비해) 다음과 같은 장점들을 가지게 됩니다.

  1. 경량
    Container는 호스트 OS를 공유함으로써 각 Container 마다 전체 OS 인스턴스가 필요하지 않기 때문에 애플리케이션 사이즈가 경량화됩니다.
  2. 이식성 및 플랫폼
    Container는 어플리케이션 구성에 필요한 파일, 라이브러리 및 dependency 들을 패키징 한 상태이기 때문에 프로비저닝에 굉장히 유리합니다.
  3. 활용도
    Container는 리소스를 효율적으로 분할하여 사용할 수 있을 뿐더러, MSA를 허용하기 때문에 더욱 효율적인 스케일링도 가능합니다.

4. Container 단점

하지만 Container 는 단점도 존재합니다.

  1. Host OS 종속성
    Container 는 Host OS를 공유함으로써 구동시간, 자원 소모량 등 측면에서 이득을 가져가지만, container 내에 다른 종류의 OS를 설치하더라도 실제 동작하는 kernel은 Host OS의 커널입니다.
  2. Container 별로 다른 kernel 작업 불가능
    컨테이너마다 서로 다른 kernel 작업은 수행할 수 없습니다. container 자체가 kernel로 구성되는 환경이기 때문에 모든 컨테이너는 동일한 kernel을 바라봅니다.

5. Container 동작 원리

그러면 Container는 어떻게 하여 앞서 설명한 장/단점을 갖는 방식으로 동작할 수 있을까요? Container 구동의 기반이 되는 Linux kernel 및 관련 기능들을 설명하겠습니다. Linux kernel 은 아래 기능들을 제공합니다.

  • namespaces
    Linux kernel 자원들을 구분하여 서로가 충돌하지 않도록 합니다. Linux kernel에서는 다음과 같은 6가지 namespace를 지원하고 있습니다.
    분류 설명
    mnt Host filesystem과 독립적으로 filesystem을 mount 및 unmount를 지원.
    pid 독립적인 프로세스 공간을 할당.
    net namespace 간 네트워크 충돌 방지.
    ipc 프로세스 간 독립적인 통신통로 할당. (PIPE, Message Queue, Socket …)
    uts 독립적인 hostname 할당.
    uid 독립적인 user 할당.
  • chroot
    chroot는 프로세스의 루트 디렉터리를 변경 및 제어할 수 있습니다. 이를 통해 프로세스가 접근할 수 있는 디렉토리를 제한할 수 있습니다.
  • cgroups
    namespace로 독립적으로 고립된 환경에서 사용할 자원(메모리, CPU, Disk I/O, Network, Device node 등)들을 제어 및 제한할 수 있도록 지원하는 기능입니다.
  • capabilities
    task 및 file에 대해 특권(접근) 정도를 제어하는 기능입니다. (ex - 슈퍼유저)

6. Container 기술

그렇다면 위에서 설명한 Linux kernel을 활용한 container 기술을 살펴보겠습니다.

  1. libvirt
    libvirt는 Linux 상에서 움직이는 다양한 가상화환경을 조작 및 관리하는 API toolkit입니다. 아래 이미지처럼 LXC를 포함한 다양한 가상화 작업을 지원합니다.
    출처: https://arisu1000.tistory.com/27780
  2. LXC (Linux Container)
    LXC는 단일 컨트롤 호스트 상에서 여러개의 container를 실행하기 위한 운영 시스템 레벨 가상화 방법입니다. cgroups와 namespace를 통해 container 가 동작할 수 있는 고립 환경을 제공하며, chroot를 통해 루트 디렉터리를 변경하면서 container 별로 filesystem + process + resource를 분리합니다. LXC는 상기 architecture처럼 libvirt API를 활용하여 구성됩니다.
    출처: http://www.digistory.co.kr/?p=733
  3. libcontainer
    Docker가 초반에는 LXC를 기반으로 architecture를 구성하였지만, Linux에 제한된다는 측면에서 멀티플랫폼으로써 역할을 하기 위해 독자적으로 libcontainer를 개발하였습니다. 또한, LXC를 사용하지 않음으로 관련 패키지들에 영향도를 받지 않게 되면서 kernel의 container API에 직접 접근할 수 있게 되었습니다.
    출처: https://www.agbeindia.com/docker-for-accelerating-the-workflow/

 


연관 게시글

 

[Docker] Docker 란?

 

[Docker] Docker 란?

1. Docker? Docker는 Container를 활용하여 어플리케이션을 개발 및 배포, 운영할 수 있는 오픈소스 기술입니다. Docker는 multi-platform을 지원하여 Linux, Windows, Mac OS 모두에서 동작합니다. 2. Why Docker? Containe

brightchords.tistory.com


참조

 

'IT' 카테고리의 다른 글

[Docker] Docker Swarm 이란?  (0) 2024.02.21
[Docker] Docker 란?  (0) 2024.02.20
[Container] Container Orchestration  (0) 2024.02.19
[CI/CD] CI/CD 란?  (0) 2024.02.12
[DevOps] DevOps 란?  (0) 2024.02.12