일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- docker
- DocumentDB
- MongoDB
- namespace
- S3
- 재테크
- 실사용
- 후기
- 앱테크
- 도커
- built-in
- 리뷰
- Python
- 토스카드
- 리워드앱
- network
- 포인트앱
- VPC
- Container
- codecommit
- 커피머니불리기
- docker network
- python3
- clone
- AWS
- Linux
- aws codecommit
- mininet
- MongoEngine
- 하나머니
- Today
- Total
ㅍㅍㅋㄷ
Docker host에 다양한 Linux 배포판(distro) container 들이 올라갈 수 있는 이유 본문
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 를 사용하는 듯한 환경이 될 것이다.
'IT > Docker' 카테고리의 다른 글
Docker Network 구조(2) - container network 방식 4가지 (1) | 2016.05.20 |
---|---|
Docker container IP 확인 (4) | 2016.05.18 |
docker container에 접속하기 (2) | 2015.07.21 |
docker0 IP 및 CIDR 변경하기 (4) | 2015.07.14 |
Docker Network 구조(1) - docker0와 container network 구조 (10) | 2015.07.13 |