Kubernetes

Container와 Container Runtime

hihikiki 2023. 7. 17. 23:51

이 글에서는 Kubernetes를 배우면 가장 먼저 언급되는 컨테이너, 가상서버, Docker에 관해서 이야기 합니다.

컨테이너는 왜 등장했을까?

컨테이너는 어플리케이션을 실행하는데 필요한 설정, 소프트웨어들을 합쳐놓은 것이다.

따라서 어떤 환경에서든 구동시킬 수 있고, 여러 개의 컨테이너도 돌리 수 있다.

 

컨테이너와 가상 서버의 차이점은?

둘 다 한 대의 머신을 여러 사용자에게 쪼개면서도 사용자는 마치 한 대의 전용 서버를 쓰는 것 같이 이용할 수 있게 해준다.

차이점은 어떻게 분리된 느낌을 주게 하는 냐이다.

가상 서버는 가상화 소프트웨어 즉, 하이퍼바이저(Hypervisor)를 사용해 하드웨어를 공유한다.

컨테이너는 하나의 리눅스 프로세스가 마치 전용 서버에서 동작하고 있는 것 같은 분리상태를 만들어 낸다.

(정확히는 리눅스 커널의 네임스페이스와 컨트롤 그룹(cgroup)을 사용한다.)

 

그럼 Docker는 왜 등장했을까?

Docker없이도 리눅스 커널의 기능만으로도 컨테이너를 만들고 관리할 수 있다.

하지만...namespace로 고유한 가상화 환경을 구분하고, cgroup으로 리소스 제한과 우선순위 설정해서 프로세스 그룹의 리소스를 관리한다. CPU, 메모리, 디스크 I/O, 네트워크 대역폭 등의 컨테이너 리소스 사용량을 제한할 수 있다. 

또한 chroot 기능을 통해서 프로세스가 루트 파일 시스템의 특정 디렉토리 안에서 벗어날 수 없게 격리된 파일 시스템 환경을 구축할 수 있다. 

Docker 같은 Container Runtime없이도 할 수 있지만...매우 귀찮고 재사용성도 떨어진다. 

 

Docker는 컨테이너 이미지 관리, 네트워킹, 볼륨 관리 등을 편리하게 수행할 수 있는 기능들을 제공하고, 컨테이너의 배포와 관리를 단순화시켜준다. 따라서 컨테이너 관리하기에 효율적이다.

 

다음 글에서는 Docker는 컨테이너 관리를 효율적으로 하기 위해서 어떤 아키텍처를 가지고 있고, Docker 관련 명령어를 알아보자.