처음에는, 가상화 기술을 사용하기 위해여 KVM, VMWARE 같은 하이퍼바이저를 사용하는 기술을 사용하였지만, 최근에는 Docker로 대표되는 리눅스 컨테이너(LXC)와 같은 컨테이너 형 가상화 기술을 이 더 각광받고 있습니다.
컨테이너형 가상화 기술은 기존 기술보다 더 가볍고, 이식성이 뛰어난 특징을 가지고 있습니다. 그리고 '가상화'라기 보단 '격리'라는 개념에 더 가깝다고 합니다. (말그대로 컨테이너안에 가둔다는 것 같습니다.) 리눅스 컨테이너를 살펴보면 OS 내부는 물리적 자원을 관리하는 "커널 공간"과 애플리케이션을 실행하는 "사용자 공간"으로 나누어집니다. 컨테이너형 가상화 기술은 사용자 공간(User space)를 나누어 각각의 사용자 프로세스에서 보이는 리소스를 제한하는 방법입니다.
1. LXC (Linux Container)란?
LXC (LinuX Containers)는 단일 컨트롤 호스트 상에서 여러개의 고립된 리눅스 시스템 (컨테이너)들을 실행하기 위한 운영 시스템 레벨 가상화 방법이다. 리눅스 커널은 cgroups를 절충하여 가상화 머신을 시작할 필요 없이 자원 할당 (CPU, 메모리, 블록 I/O, 네트워크 등)을 한다. Cgroups는 또한 애플리케이션 입장에서 프로세스 트리, 네트워크, 사용자 ID, 마운트된 파일 시스템 등의 운영 환경을 완전히 고립시키기 위해 namespace isolation을 제공한다. LXC는 cgroups와 namespace를 결합하여 애플리케이션을 위한 고립된 환경을 제공한다. Docker 또한 실행 드라이버의 하나로 LXC를 사용할 수 있으며 이를 통해 이미지 관리와 개발 서비스를 제공한다.
- 위키피디아
2. 기존 가상화 기술과 LXC의 차이점
KVM과 같은 하이퍼바이저를 이용하는 가상화 깃루은 가상머신이 물리적 하드웨어를 실제로 사용하는 것이기 때문에 그 하드웨어 자원을 이용하는 Guest OS가 반드시 필요합니다. 왼쪽 그림처럼 OS위에 또 다른 OS가 동작한다고 보시면 됩니다. 이러한 방법은 가상머신을 실행하는 Host OS와 Guest OS를 완전히 분리 할 수 있는 장점이 있지만, 컴퓨터를 통째로 만들어 내는 것과 같기 때문에 오버 헤드가 증가 및 각종 성능 손실이 발생하는 단점이 있습니다.
LXC는 오른쪽 그림과 같이 모든 프로세스가 Host OS에서 바로 시작합니다. 일반적인 프로세스의 동작과 다른 점은 프로세스의 일부를 그룹화하고 다른 그룹에 속하지 않는 프로세스에서 단절된 공간으로 동작한다는 것입니다. 마치 화물 컨테이너처럼 독립된 공간에 프로세스가 들어 있기 때문에 '컨테이너'라고 부릅니다. 그리고 한 컨테이너에서 다른 컨테이너의 내부는 볼 수 없습니다.
다시 말하자면, 컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것입니다. 이러한 방식을 사용하기 떄문에 부팅 및 종료라는 개념이 없어 가상 환경의 시작과 종료가 매우 빠릅니다.
3. LXC의 장단점
컨테이너의 방식은 OS에서 관리되기 때문에 OS레벨의 가상화라고 부르기도 합니다.
장점
1. 빠른 시작과 종료 속도
컨테이너를 생성하는 것은 일반적인 프로세스를 시작하는 것과 같기 때문에 일반적인 프로세스를 시작하는 것과 별 차이가 없습니다. 그리고 가상 환경이 커널에서 공유되기 때문에 새로운 커널을 시작할 필요가 없습니다.
2. 높은 집적도
컨테이너는 분리된 공간을 구성하는 것이기 때문에 컴퓨터 상에서 동작하는 OS는 하나입니다. 여러 개의 컨테이너를 만들어서 실행한다고 해도 OS는 하나이기 때문에 가상머신에 비해 고 밀도화가 가능합니다.
그리고 컨테이너에서 실행되는 프로세스를 위한 메모리만 필요하기 때문에 낮은 사양의 환경에서 더욱 활용도가 높습니다.
3. 낮은 오버헤드
가상화를 위한 하드웨어 에뮬레이트 단계가 없기 때문에 오버 헤드가 줄어듭니다.
4. 어플리케이션 컨테이너 지원
컨테이너는 목적에 맞는 프로세스만 존재하는 환경을 만들 수 있습니다. 즉 웹서버 용 컨테이너라면 Apache Httpd 프로세스만 존재하는 컨테이너를 만들 수 있습니다.
이러한 환경을 어플리케이션 컨테이너라고합니다. 물론 init을 처음 시작하여 보통의 OS가 시작하는 것과 같은 환경을 만들 수 있는데 이를 시스템 컨테이너라고 합니다.
단점
1. Host OS에 종속적
리눅스 컨테이너는 OS에 있는 리눅스 커널이 관리하는 것이므로, 당연히 리눅스외에 다른 OS에서는 동작하지 않으며, 컨테이너 환경에서도 다른 OS를 설치할 수 없습니다.
2. 컨테이너별 커널구성 불가
커널에 관련된 작업은 가능하지만, 컨테이너마다 다른 커널 작업을 수행 할 수는 없습니다. 따라서 컨테이너에서 보이는 장치나 로드되는 커널 모듈은 모두 동일합니다.
4. cgroups(control groups)
LXC는 cgroups 기능을 사용하여 다양한 자원을 분리하여 독립적인 환경을 제공하는 것입니다.
cgroups는 프로세스 그룹의 리소스의 이용을 제한, 격리하는 기능입니다. cgroups는 다음과 같은 기능을 제공합니다.
- 자원 제한 : 그룹의 메모리 사용량을 제한 할 수 있다.
- 우선 순위 : 여러 그룹에 의해 큰 CPU와 디스크 I/O 처리량을 할당함
- 기록 : 시스템이 자원을 얼마나 사용하고 있는지 측정한다.
- 격리 : 다른 네임 스페이스에 그룹을 분리하고 다른 그룹의 프로세스 네트워크 연결 파일이 눈에 띄지 않게 함
cgroups는 동일한 기준으로 수집 된 프로세스의 집합입니다. 이 그룹들은 계층적인데, 각 그룹은 부모 그룹으로 부터 한계를 상속받는다는 뜻이다. 커널은 cgroup 인터페이스로 부터 다수의 컨트롤러(또한 서브시스템이라 불리는)로의 접근을 제공한다. 예를 들어 "메모리" 컨트롤러는 메모리 사용을 제한하고, "cpuacct"은 CPU사용을 할당하는 것이다.
5. Docker
Docker는 Go언어로 작성된 소프트웨어 입니다. 원래는 컨테이너를 구현하기 위해 리눅스 컨테이너를 사용했지만, Docker 0.9버전 부터는 자체 컨테이너를 직접 만들어 사용하고 있습니다. Docker는 단순한 컨테이너의 구현을 넘어 컨테이너 기반 가상화 환경을 구축하고 있습니다.
6. References
- LXC - http://ko.wikipedia.org/wiki/LXC
- linux - cgroups (control groups) - http://linuxism.tistory.com/1601
- OpenVZ - http://ko.wikipedia.org/wiki/OpenVZ
- 새로운 가상화 기술 Docker 를 구글,레드햇 그리고 오픈스택 등에서 채택 - http://opennaru.tistory.com/64
- 오픈소스 슈퍼루키 Docker 이해 하기 - http://opennaru.tistory.com/9
- http://opennaru.tistory.com/105