메뉴 닫기

[ Kubernetes #02 ] Container 와 Docker 란?

도커 컨테이너(Container)
Docker 아이콘 이미지

안녕하세요

스마일서브 KoreaV 공공클라우드 사업부 김병학 입니다. 오늘은 지난글에 “MSA와 Kubernetes 란 무엇일까?“에 이어서, Conatainer 와 Docker 에 대해서 설명해 보겠습니다.

 지난 글

 

목차


  1. 개요
  2. 컨테이너의 역사
    1. 컨테이너 기술의 발전사
    2. 현재 컨테이너의 모습.
  3.  커널 기반 가상 머신(KVM) 과 컨테이너의 차이점
    1. 가상머신과 컨테이너의 차이점
  4. 도커의 몰락, 다양한 컨테이너 엔진의 등장
    1. 쿠버네티스의 도커 지원 중단
    2. CRI의 등장과 Dockershim
    3. Docker의 점유율이 낮아지면서 등장한 Containerd와 CRI-O

 

1. 개요


쿠버네티스에 대해서 이해하기전에 컨테이너(Container)의 개념부터 설명하고자 합니다.  어떤 이유때문에 지금까지 발전하게 되었는지 근본이되는 기술과 개념을 시작으로 컨테이너를 설명해보도록 하겠습니다.

 

2. 컨테이너의 역사


몇년 전부터 컨테이너라는 기술이 인기가 많아지면서 최근에 나온 기술로 생각할 수 있습니다. 하지만 컨테이너의 시작은 생각보다 비교적 오래전에 등장했습니다. 이를 이해하기 위해, 초기의 격리 기술부터 최신의 컨테이너 기술에 이르기까지의 발전 과정을 살펴보겠습니다.

출처 : https://oziie.medium.com/something-missed-history-of-container-technology-e978f202464a

2-1. 컨테이너 기술의 발전사

  • chroot (1979) : 컨테이너의 역사는 1979년에 등장한 Unix의 chroot 명령어에서 시작되었습니다. chroot는 특정 프로세스와 그 자식 프로세스들의 루트 디렉토리를 변경하여 격리된 파일 시스템 환경을 제공합니다. 이로써 시스템 전체가 아닌 특정 프로세스만 격리된 환경에서 실행될 수 있게 되었으며, 이는 현대 컨테이너 기술의 초석이 되었습니다.
  • cgroups (2006) : 2006년, 리눅스 커널에 cgroups (control groups)라는 기능이 도입되었습니다. cgroups는 리소스를 격리하고 제한하며, 모니터링하는 기능을 제공합니다. 이를 통해 CPU, 메모리, 디스크 I/O, 네트워크 등의 자원을 특정 그룹의 프로세스에 할당하고 제어할 수 있게 되었습니다. cgroups는 컨테이너의 리소스 관리와 성능 격리를 가능하게 하여, LXC와 Docker와 같은 현대적인 컨테이너 기술의 핵심 구성 요소가 되었습니다.
  • LXC (2008) : 2008년, Linux 컨테이너(LXC)가 발표되었습니다. LXC는 리눅스 커널의 cgroups와 namespace 기능을 활용하여 애플리케이션을 격리하고 관리하는 기술입니다. 이는 컨테이너의 현대적인 형태에 가까운 개념으로, 사용자 공간에서의 격리와 더불어 리소스 제어가 가능하게 했습니다
  • Docker (2013) : 2013년, Docker가 등장하면서 컨테이너 기술은 급격히 발전하고 대중화되었습니다. 컨테이너를 더 쉽게 사용하고 관리할 수 있는 도구와 이미지를 제공함으로써 개발자와 운영자들 사이에서 빠르게 인기를 얻었습니다. 컨테이너화된 애플리케이션의 빌드, 배포, 실행을 단순화하여 DevOps와 마이크로서비스 아키텍처의 핵심 도구로 자리잡았습니다.
  • Kubernetes (2014) : 2014년, Google이 Kubernetes를 오픈소스로 발표하면서 컨테이너 오케스트레이션의 시대가 열렸습니다. Kubernetes는 대규모 컨테이너화된 애플리케이션의 자동 배포, 확장, 관리를 제공하여 컨테이너 환경의 효율성과 안정성을 크게 향상시켰습니다.

이러한 꾸준한 발전으로 현재는 컨테이너가 대중적으로 사용하게 되므로 IT 시장의 뜨거운 감자가 되었습니다.

2-2. 현재 컨테이너 모습

결과적으로 현재 컨테이너 모습은 리눅스의 자체 기능인 chroot, namespace, cgroup 을 사용하여 프로세스 단위의 격리 환경을 만들 수 있게 되었습니다. 또한 컨테이너에 필요한 커널은 Host OS 의 커널을 공유하며, 컨테이너 내에는 어플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재하게 되어, 컨테이너를 이미지로 만들었을 때 용량 가성머신보다 대폭 줄어듭니다. 따라서 컨테이너의 배포가 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다는 장점이 있습니다.

 

3. 커널 기반 가상 머신(KVM) 과 컨테이너의 차이점


현대 IT 인프라에서 가상화 기술은 필수적입니다. 가상화 기술에도 여러 종류가 있으며, 그 중에서도 커널 기반 가상 머신(KVM)과 컨테이너는 가장 널리 사용되는 두 가지 기술입니다. 이 글에서는 KVM과 컨테이너의 주요 차이점을 살펴보고, 각 기술이 어떠한 상황에 적합한지 알아보도록 하겠습니다.

커널 기반 가상 머신(KVM)이란?

KVM은 리눅스 커널에 내장된 하이퍼바이저로, 리눅스 커널을 가상화 플랫폼으로 변환시킵니다. KVM을 사용하면 여러 개의 가상 머신(VM)을 하나의 물리적 호스트에서 실행할 수 있으며, 각 VM은 독립적인 운영체제를 실행합니다.

3-1. 가상머신과 컨테이너의 차이점

가상머신과 컨테이너의 구조적 차이를 그림으로 그려보면 위 사진과 같습니다. 가상머신은 서버의 Host OS 위에서 동작하는 Hypervisor 와 같은 프로그램이 Guest OS를 동작시켜, Guest OS 위에 종속성 패키지와 어플리케이션을 동작시키게 됩니다.

컨테이너의 경우는 Host OS 위에서 Docker Engine 과 같은 런타임엔진(Runtime Engine)을 통하여 커널을 공유한상태로 어플리케이션과 종속성 패키지를 프로세스 상태로 구동시킵니다.

두가지 다른 방식의 가상화는 아래와 같은 차이점을 발생시킵니다.

특성

KVM / Hypervisor 컨테이너
격리 수준 하드웨어 수준 격리 운영체제 수준 격리
리소스 사용 상대적으로 높음 상대적으로 낮음
부팅 시간 느림 빠름
운영체제 각 VM마다 독립적 호스트 커널 공유
사용 사례 다양한 운영체제 실행, 보안이 중요한 환경 마이크로서비스, CI/CD 파이프라인

따라서 각 기술의 특징을 파악하고, 적재적소 필요한 기술을 사용하는것이 중요하다고 볼 수 있습니다.

 컨테이너 런타임 엔진(Runtime Engine) 이란?

런타임 엔진 또는 컨테이너 런타임은 컨테이너 이미지를 기반으로 컨테이너를 생성하는 소프트웨어 프로그램입니다.
컨테이너와 운영 체제 간의 중개 에이전트 역할을 하며 애플리케이션에 필요한 리소스를 제공하고 관리합니다.

흔히 아는 Docker 자체는 Runtime Engine 과 컨테이너 관리 기능을 합쳐둔 프로그램입니다.

참고로 이후 설명하겠지만 Docker 에서 Runtime Engine 만 분리하여 나온 containerd 가 있습니다.

출처 : https://aws.amazon.com/ko/what-is/containerization/

 

4. 도커의 몰락, 다양한 컨테이너 엔진의 등장


컨테이너 기술의 선두주자였던 Docker는 이제 더 이상 컨테이너 런타임으로 사용되지 않습니다. 이는 Kubernetes의 도커 지원 중단 발표 이후 빠르게 변화한 컨테이너 생태계 때문입니다. 이번 글에서는 Docker의 몰락과 다양한 컨테이너 엔진의 등장을 중심으로 이 변화를 자세히 살펴보겠습니다.

4-1. 쿠버네티스의 도커 지원 중단

2020년 12월 8일, Kubernetes는 공식적으로 도커를 컨테이너 런타임으로 지원하지 않겠다고 발표했습니다. 당시 이 발표는 컨테이너를 사용하는 모든 사람들에게 큰 충격을 주었습니다. 지원을 중단한 이유는 Kubernetes에서 CRI(Container Runtime Interface)라는 표준 인터페이스를 통해 다양한 컨테이너 런타임과 통신할 수 있도록 설계되도록 구조를 변경하였기 때문입니다.

4-2. CRI의 등장과 Dockershim

CRI는 Kubernetes가 다양한 컨테이너 런타임과 상호 작용할 수 있게 해주는 표준 인터페이스입니다. 이를 통해 Kubernetes는 특정 런타임에 종속되지 않고, 다양한 런타임과 유연하게 연동할 수 있습니다. 하지만 Docker 의 입장은 달랐습니다. Kubernetes 가 등장하기 이전부터 컨테이너 생태계에 오랫동안 존재해 왔었던 Docker는 이미 독자적인 인터페이스를 구축해두었기 때문입니다. 때문에 Kubernetes의 결정으로 Docker는 더 이상 기본 컨테이너 런타임으로 사용되지 않게 되었고, 자연스럽게 CRI 를 직접 지원하는 런타임을 선호하게 되었습니다.

Docker는 Kubernetes의 지원종료 발표에 대응하여 dockershim이라는 중간 레이어를 만들었습니다. Dockershim은 Kubernetes와 Docker 간의 통신을 가능하게 해주는 인터페이스 역할을 했습니다. 그러나 이 추가 계층은 시스템의 복잡성을 증가시키고, Kubernetes의 성능과 효율성을 저하시키는 요인이 되었습니다.

4-3. Docker의 점유율이 낮아지면서 등장한 Containerd와 CRI-O

Docker의 점유율이 낮아지면서, CRI를 지원하는 더 경량화된 컨테이너 런타임들이 주목받기 시작했습니다. 그 중 대표적인 것이 containerd와 CRI-O입니다.

  • Containerd : Containerd는 Docker에서 분리된 경량화된 컨테이너 런타임입니다. Containerd는 CRI를 지원하며, Kubernetes와의 완벽한 호환성을 제공합니다. Docker의 핵심 기술이었던 containerd는 이제 독립된 프로젝트로 관리되며, 다양한 클라우드 플랫폼과 Kubernetes 환경에서 널리 사용되고 있습니다.
  • CRI-O : CRI-O는 OpenShift에서 개발된 컨테이너 런타임으로, CRI를 직접 지원합니다. CRI-O는 Kubernetes와의 완벽한 통합을 목표로 하며, 경량화와 보안을 중시합니다. 이를 통해 Kubernetes 환경에서 보다 효율적이고 안전한 컨테이너 관리를 가능하게 합니다.
NOTE
Docker 가 더이상 런타임엔진으로 사용되지 않을뿐, 개발자 도구로서 사용되 않는것은 아닙니다.
이전 노트박스에서 설명했듯이 Docker는 컨테이너 관리툴로서의 역할도 포함하고 있으며, Docker를 통해 생성되는 이미지는 OCI(Open Container Initiative) 표준 이미지 입니다.
또한 Dockerfile 의 문법, Dockerhub repository 등도 지속적으로 사용되고 있으므로, 런타임엔진으로 사용되지 않을뿐 컨테이너 관리툴로서의 역할은 지속될것으로 보입니다.
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x