컨테이너는 하이퍼바이저 기술과 함께 잘 알려져 있는 대표적인 가상화 기술 중 하나로, 하드웨어 수준에서 리소스를 가상화하는 하이퍼바이저 기술과 달리 소프트웨어 범주에서 애플리케이션 실행 환경을 격리하는 하이퍼바이저보다 가벼운, 경량화된 가상화 기법이다.
하이퍼바이저의 VM들은 논리적으로 독립된 CPU, 메모리와 자체 커널을 갖지만 컨테이너들은 Host OS의 커널을 공유하며, 실행 환경 격리에 필요한 프로세스, 파일 시스템, 네트워크의 격리와 CPU, 메모리 사용 관리가 운영체제에 의해 지원되는 cgroups와 namespaces 을 통해 구현되어 운영체제 수준, 소프트웨어 수준에서 가상화가 이뤄진다고 이해할 수 있다.
간략히 정리하면 컨테이너는 어떤 애플리케이션과 애플리케이션 실행에 필요한 소프트웨어들을 하나의 컨테이너 안에 패키징해, 애플리케이션이 독립적으로 실행, 관리될 수 있게 실행 환경을 격리하는 기술이다. 이때 애플리케이션 실행에 필요한 소프트웨어란 애플리케이션 코드와 이와 종속되는 라이브러리 등을 말한다.
이렇게 패키징되는 환경은 이미지를 통해 손쉽게 재연될 수 있어 배포에 용이하며 여러 애플리케이션을 동시에 실행할 시 각각이 격리된 환경인 컨테이너 내에서 동작하기에 오류가 발생하더라도 다른 컨테이너에 영향을 주지 않아 장애 발생 시 대응에도 유리하다.
이러한 컨테이너 기술의 대표적인 예시로는 Docker(도커), Podman(파드맨) 그리고 이들의 기반이 되는 기술인 리눅스 컨테이너(LXC) 등이 있으며 컨테이너 관련 핵심 키워드들을 도커를 예시로 정리하면 다음과 같다. 도커 컨테이너는 도커 이미지의 인스턴스로, 이미지 실행을 통해 컨테이너의 생성, 실행이 가능하다. 이미지 빌드에 필요한 내용들을 기술하는 파일을 도커 파일이라고 하며 도커 파일 작성 후, 빌드를 통해 도커 이미지를 생성할 수 있다. 도커 이미지들은 레지스트리라고 불리는 저장소에 저장되어 필요 시 받아 사용될 수 있는데 레지스트리는 공개 범위에 따라 프라이빗 레지스트리와 퍼블릭 레지스트리로 유형을 나눌 수 있으며 도커 허브가 바로 대표적인 퍼블릭 레지스트리로 공식 이미지들을 받아 사용할 때 주로 접근된다.
컨테이너 관련 도구로는 이미지 관리용 도구인 Skopeo(스코페오)와 이미지 빌드용 도구인 Buildah(빌드아)가 있다고 한다. 이와 관련된 또 다른 주요 개념으로는 쿠버네티스(k8s) 기술로 많이 알려져 있는, 수천 개의 docker 컨테이너들을 관리하는 기술인 컨테이너 오케스트레이션이있다. 전통적인 개발 방식인 모놀리식(Monolithic)에서 최근 MSA(Microservice Architecture)로 개발 방식이 전환되면서 컨테이너는 더욱 활발히 활용되고 있기에 MSA와 연관지어서도 정리해 보면 좋을 것 같다.
참고링크
컨테이너의 이해
https://www.redhat.com/ko/topics/containers
컨테이너란 무엇인가요
https://www.ibm.com/kr-ko/think/topics/containers
컨테이너란
https://cloud.google.com/learn/what-are-containers?hl=ko