다양한 리눅스 배포판 기반의 컨테이너를 올릴 수 있는 이유

2022. 8. 14. 15:55[ 자격증 ]/[ AWS ]

도커를 기반으로 배포를 하다가 컨테이너로 들어가서(docker exec) 작업이 잘 수행되었는지 확인할 경우가 있었다. 들어가서 ps 명령어를 사용하기 위해 apt 커맨드로 procps 패키지를 설치했는데, apt가 지원이 되지 않았다. yum으로 변경하니 패키지가 설치되었다. 호스트 OS는 우분투를 사용하고 있었는데 컨테이너 OS는 centos였던 것이다. 컨테이너의 개념이 호스트 OS를 공유하는 것으로 알고 있었는데 이렇게 리눅스 배포판이 바뀔 수 있던 이유가 궁금해서 찾아보았다. 

 

 

1. 리눅스 구조

 

https://unix.stackexchange.com/questions/137820/whats-the-difference-of-the-userland-vs-the-kernel

 

리눅스는 kernel space와 user space로 나뉜다. 

 

1) user space

application들이 실행되는 공간으로 이 application이 실행되는데 필요한 library나 환경을 제공하는 system daemon들, shell 도 user space의 영역이다.  

 

2) kernel space

application(process)들을 관리하기 위한(하드웨어 점유, 스케줄링, IPC, 네트워킹 등) OS의 고유 기능들이 포함되며 kernel space로 요청을 보내기 위해 system call이라는 인터페이스가 제공된다.

 

 

 

2. Linux Distribution (리눅스 배포판)

 

https://cognitivewaves.wordpress.com/linux-distributions/

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

 

각각의 배포판은 서로 다른 재단에서 관리되며 kernel은 Linux foundation에서 공통으로 관리된다. (https://www.kernel.org/)

 

 

cf. 각 배포판들의 차이점

각 배포판들은 kernel을 기반으로 하면서 각각의 Foundation에서 추구하는 철학에 맞게 package, library, UI들을 구성하여 배포된 OS이다. package, library, UI 환경은 Linux 구성 영역 중 user space의 영역에 해당한다. 즉, 배포판 모두 같은 kernel의 기능을 활용하면서 user space만을 다르게 한 OS라는 것이다.

 

안드로이드, 스마트TV, 키오스크, 무선AP 장비 등에 들어가는 OS도 리눅스 배포판의 일종이다.

 

 

 

3. Docker Host가 다양한 배포판 기반의 Container를 실행시킬 수 있는 이유

컨테이너 구현 기술 중 리눅스의 namespace 덕분에 다양한 배포판 기반의 컨테이너를 만들 수 있다.

 

Linux namespace는 아래와 같이 크게 6가지로 분류된다.

1. UTS namespace : hostname을 변경하고 격리
2. IPC namespace : 프로세스간 통신 격리
3. PID namespace : Process ID를 분할 관리
4. NS namepsace : file system의 mount지점을 분할하여 격리
5. USER namespace : user와 group을 분할 격리
6. NET namespace : 네트워크 인터페이스, iptables 등 network 리소스와 관련된 정보를 격리

 

 

cf. namespace를 만드는 시스템 콜: clone(), unshare(), setns()

리눅스 namespace는 하나의 시스템을 마치 독립된 시스템 공간으로 구성되도록 격리시키는 가상화 기술인데, namespace는 리눅스의 user space를 격리시키는 기술이다. 즉, 각각이 완전히 분리된 환경처럼 보이지만, "실제로는 user space 영역을 가상화해서 격리한 기술이므로 동일한 kernel space를 사용하게 되는 것이다." 이 방식은 기존의 Hypervisor 기술과는 완전히 다른 방식이다. 

cf. Hypervisor와 namespace 차이

하이퍼바이저의 경우 하드웨어 자체를 가상화한다. 하이퍼바이저는 하드웨어를 물리적으로 구분해서 가상화한다고 생각하면 된다. 따라서 하이퍼바이저 위에 올라가는 게스트 OS는 서로 물리적으로 구분된 공간에서 돌아간다. 그러나 네임스페이스는 하드웨어를 분리하지는 않으며 하나의 kernel 위에서 돌아간다. 즉, namespace는 kernel을 공유하며 user space를 격리하는 기술이다.

 

https://tech.ssut.me/what-even-is-a-container/

 

위에서 설명했듯이, 리눅스의 다양한 배포판들은 user space를 달리하는 OS들이다. namespace 기술이 user space를 격리하는 기술이기 때문에 컨테이너마다 다른 user space를 둘 수 있는 것이다. 또한 package management system은 user space에 해당하므로 컨테이너마다 다른 배포판을 둘 수 있게 되는 것이다.

 

컨테이너 기술이 VM보다 가볍다고 말하는 이유가 여기 있는 것 같다. 컨테이너는 VM과 다르게 'kernel space를 공유하면서' 각 배포판(user space)이 갖는 shell이나 명령어 라이브러리만을 달리하는 것이기 때문이다.

 

 

cf. kernel을 공유하는 것의 단점

Docker 컨테이너는 docker 호스트의 kernel을 공유하기 때문에 kernel에 의존적일 수밖에 없다. 이 말의 의미는 docker 호스트에 어떠한 kernel 레벨의 작업을 하게 될 경우 모든 container들이 영향을 받을 수 있다는 것이다. 예를 들어, kernel을 업그레이드한다면 이 작업 자체가 모든 컨테이너에 영향을 준다. 또한 kernel 3.8 버전부터 도커를 지원하기 때문에 컨테이너의 배포판(user space)도 kernel 3.8 이후를 지원하는 것만 사용할 수 있다.

 

 

 

Reference

- linux user and kernel mode, https://unix.stackexchange.com/questions/137820/whats-the-difference-of-the-userland-vs-the-kernel

- 컨테이너가 다양한 리눅스 배포판을 가질 수 있는 이유, https://bluese05.tistory.com/10

- 리눅스 배포판 차이, https://en.wikipedia.org/wiki/Linux_distribution

- 하이퍼바이저와 네임스페이스, https://losskatsu.github.io/os-kernel/linux-namespace/