ㅍㅍㅋㄷ

Docker host에 다양한 Linux 배포판(distro) container 들이 올라갈 수 있는 이유 본문

IT/Docker

Docker host에 다양한 Linux 배포판(distro) container 들이 올라갈 수 있는 이유

클쏭 2015. 7. 2. 18:20



 Docker 는 Host OS 에 상관 없이 다양한 Linux 배포판의 Container를 올릴수 있다.

예를 들면, Docker Host OS는 Ubuntu 일지라도 Container는 CentOS 로 생성 가능하다.


어떻게 가능할까?

이것을 알아 보기 위해 먼저 Linux 의 구성에 대해 살펴보자.




Linux 의 구성


 Linux 는 크게 kernel space 와 user space 로 나뉜다.


[ 출처 : wiki https://en.wikipedia.org/wiki/Linux_kernel ] 


 user space 는 흔히 userland 라고도 불리우는 공간으로, application 이 실행되는 공간이라고 생각하면 된다. 또한 이 application이 실행되는데 필요한 library 나 환경을 제공하는 system daemon 들도 user space 의 영역이다.  


 kernel space 는 직접적으로 Hardware 리소스를 제어하고 관리하는 영역이며, 사용자가 임의로 접근할 수 없는 영역이다. 하지만 application이 동작하기 위해서는 이것이 실행되기 위한 hardware 리소스를 할당 받아야 하는데, 이때 리소스 할당 요청을 kernel space 로 하게 되며, 이 interface를 우리는 system call 이라고 부르는 것이다. 


 사실 Linux에서 진짜 중요한 영역은 이 kernel space 이다. Linux 라는 identity는 바로 kernel에서 기인한다. 결국 OS가 하는 일은 단순히 말하자면, CPU, 메모리, 파일 같은 자원을 효율적으로 관리하는 시스템이기 때문이다.





Linux Distribution ( Linux 배포판 )



 현재의 Linux 는 다양한 배포판들이 존재 하고 있다. 흔히들 사용하는 CentOS, Ubuntu, Debian 모두 Linux 라는 공통의 카테고리 이지만, 각각이 명령체계가 다르고, 패키지 관리 방식도 다르며, UI도 다르다. 하지만 이들을 Linux 라고 묶을 수 있는 이유는 바로 위에서 언급한 Linux kernel 이 동일한 뿌리를 두기 때문이다. 

 각각의 배포판은 각각의 foundation이 관리를 하고 있지만, Linux kernel에 대한 관리는 Linux foundation 에서 공통으로 관리하고 있는 것도 이러한 이유이다. https://www.kernel.org/ )


 그렇다면, 각각의 Linux 배포판의 차이는 무엇인가.

 "Linux Distribution" 에 대한 정의를 Wikipedia 를 통해 빌려오자면, 


  A Linux distribution (often called a distro for short) is an operating system made as a software collection based on the Linux kernel and, often, on a package management system. 

...

  A typical Linux distribution comprises a Linux kernel, GNU tools and libraries, additional software, documentation, a window system (the most common being the X Window System), a window manager, and a desktop environment. 


[ 출처 : wiki https://en.wikipedia.org/wiki/Linux_distribution  


  Linux 배포판은 Linux kernel을 기반으로, 각각의 Foundation에서 추구하는 철학에 맞게 package, library, UI 환경들을 구성하여 배포한 OS 라는 의미이다. 이때 package, library, UI 환경은 Linux 구성 영역 중 user space의 영역임을 기억하자.


 


 Docker Host는 어떻게 다양한 Container를 실행할 수 있는가

  - namespace



  그렇다면 처음의 질문으로 되돌아 가보자. 

  Docker는 어떤 방식으로 Host OS 배포판에 무관하게 다양한 Container를 올릴수 있는가.


  그 비밀은, docker container 구현 기술 중 기반 기술인 namespace 로 인해 가능한 것이다.


 

[ 출처 : Docker blog ( https://blog.docker.com ) ]



 docker 의 container 구현 에는 다양한 Linux 기반 기술이 들어 있는데 이 중 namespace 가 핵심 기술 중 하나이다. 

 ( Linux namespace에 대한 자세한 설명은 여기 로... )


  짧게 이야기 하면, Linux namespace 는 하나의 시스템을 마치 독립된 시스템 공간으로 구성되도록 격리 시키는 가상화 기술인데, 이 namespace는 Linux의 영역 중 user space를 격리 시키는 기술이다. 

 즉, 각각이 완전히 분리된 환경처럼 보이지만, 실제로는 user space 영역을 가상화 시켜 분리한 기술이므로 동일한 kernel space 를 사용하게 되는 것이다. 이 방식은 기존의 Hypervisor 기술과는 완전히 다른 방식이다. 


 위에서 설명했듯, 각각의 Linux 배포판들은 (대부분이) 동일한 Linux kernel 위에 다양한 package management system 이 user space 영역에 구성된 것이다. namespace 는 kernel은 공유하고 user space를 격리 하는 것이므로, 이를 이용해 충분히 다양한 배포판을 제공할 수 있게 되는 것이다. 


 하지만, Docker 는 이렇게 kernel을 공유하는 특징 때문에 한계도 있고, 주의해야 할 점도 있다.

 

 Docker container는 docker host 의 kernel에 완전히 의존적일수 밖에 없다. 

 이 말의 의미는 docker host 에 어떠한 kernel 레벨의 작업을 하게 되면, 모든 container들이 영향을 받을 수 있다는 것이다.

 이는 운영상에 굉장히 critical한 약점일수 밖에 없다. 

 만약, docker 를 이용해 특정한 서비스를 운영 중에 긴급하게 host의 kernel patch 작업이 필요하다면? 

 굉장히 신중할 수 밖에 없을 것이다. 


 또한, Docker host는 비교적 최신 기술이 들어간 것이라 최근 kernel 버전 만을 지원하는데 ( 3.8 이상 ), Container 의 경우에도 최근 kernel 버전을 사용하는 배포판 버전을 지원할 수 밖에 없다.

 ( 옛날에 사용하던 CentOS 5.X 버전 같은건 지원이 불가능하다는 의미이다 )

 

 

 (이것은 논외로) 재미 있는 현상도 발견된다.


 만약 Docker Host가 kernel 버전이 3.13.0인 Ubuntu 14.04 LTS 라고 가정해보자. 

 이때, Container를 CentOS 6.6 버전으로 올리면 어떨까. (CentOS 6.6 의 default kernel 버전은 2.6.32 이다.)


 당연하게도, CentOS 6.6 Container 의 kernel 버전은 Host에 종속되기 때문에 3.13.0으로 보일 것이다. 


 bash-4.1# cat /etc/issue

CentOS release 6.6 (Final)

Kernel \r on an \m


bash-4.1# uname -r

3.13.0-40-generic

  

마치, container 입장에서는 CentOS 6.6 에 kernel 버전을 3.13.0 으로 upgrade 한 OS 를 사용하는 듯한  환경이 될 것이다.

 



 



  



Comments