티스토리 뷰

Linux 컨테이너

리눅스 컨테이너에 대해 전반적인 내용을 알아보겠습니다.

리눅스 컨테이너를 살펴보면 OS 내부는 물리적 자원을 관리하는 "커널 공간"과 애플리케이션을 실행하는 "사용자 공간"으로 나누어집니다. 컨테이너형 가상화 기술은 사용자 공간(User space)를 나누어 각각의 사용자 프로세스에서 보이는 리소스를 제한하는 방법입니다. 사용자 영역 인터페이스라고도 합니다.

 


 

기존 가상화 기술과 LXC 차이점

 

널리 사용되고있는 가상화 기술로는 Xen과 KVM이 있으며, 이것을 사용하여 호스트 OS (또는 하이퍼 바이저)에서 가상 머신 환경을 만들고 그 위에 OS를 실행시켜 여러 OS 환경을 구축할 수 있습니다.

KVM과 같은 기존의 가상화 기술에서는 가상머신이 실제 물리적인 하드웨어를 Emulate하기 때문에 OS가 반드시 필요합니다. 즉 왼쪽의 그림처럼 OS 위에서 또하나의 OS가 동작하는 형태입니다.
이 경우 가상머신을 실행하는 호스트 OS와 게스트 OS를 완전히 분리 할 수​​있는 장점은 있지만, 하드웨어에서 시뮬레이트하기 때문에 오버 헤드가 증가하는 단점도있습니다.

리눅스 컨테이너는 모든 프로세스는 호스트 OS에서 바로 시작합니다. 일반적인 프로세스의 동작과 다른 점은 그 과정의 일부를 그룹화하고 다른 그룹이나 그룹에 속하지 않는 프로세스에서 단절된 공간으로 동작하는 것입니다.
화물 컨테이너처럼 독립된 공간에 프로세스가 들어 있기 때문에 이 공간을 ‘컨테이너’라고 부르는 것입니다.
컨테이너 간에는 다른 컨테이너의 내부를 볼 수 없습니다.
결론적으로 Linux Container는 Xen과 KVM 등 가상화 기술과는 다르게, 가상 머신을 생성하는 것이 아니라 OS가 사용하는 자원을 분리하여 여러 환경을 만들수 있도록 하는 것입니다.
이러한 방식이기 때문에 하드웨어 시뮬레이션이 필요없기 때문에 가상화 오버 헤드는 거의 존재하지 않으며, 또한 가상 머신 부팅 및 종료라는 개념이 존재하지 않기 때문에 가상 환경의 시작과 종료를 빠르게 실행할 수 있습니다.

 


 

리눅스 컨테이너란?

 

위키디피아에 따르면, LXC (LinuX Containers)는 단일 컨트롤 호스트 상에서 여러개의 고립된 리눅스 시스템 (컨테이너)들을 실행하기 위한 운영 시스템 레벨 가상화 방법입니다.  리눅스 커널은 cgroups를 절충하여 가상화 머신을 시작할 필요 없이 자원 할당 (CPU, 메모리, 블록 I/O, 네트워크 등)을 합니다. Cgroups는 또한 애플리케이션 입장에서 프로세스 트리, 네트워크, 사용자 ID, 마운트된 파일 시스템 등의 운영 환경을 완전히 고립시키기 위해 namespace isolation을 제공합니다.  LXC는 cgroups와 namespace를 결합하여 애플리케이션을 위한 고립된 환경을 제공합니다. Docker 또한 실행 드라이버의 하나로 LXC를 사용할 수 있으며 이를 통해 이미지 관리와 개발 서비스를 제공합니다.

 

다시 말하자면, 컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것입니다. 이러한 방식을 사용하기 떄문에 부팅 및 종료라는 개념이 없어 가상 환경의 시작과 종료가 매우 빠릅니다.

 

컨테이너의 방식은 OS에서 관리되기 때문에 OS레벨의 가상화라고 부르기도 합니다.

 


 

 

리눅스 컨테이너의 장점

 

1. 빠른 시작과 종료 속도

 

 컨테이너를 생성하는 것은 일반적인 프로세스를 시작하는 것과 같기 때문에 일반적인 프로세스를 시작하는 것과 별 차이가 없습니다. 그리고 가상 환경이 커널에서 공유되기 때문에 새로운 커널을 시작할 필요가 없습니다.

 

 

2. 높은 집적도 

 

 컨테이너는 분리된 공간을 구성하는 것이기 때문에 컴퓨터 상에서 동작하는 OS는 하나입니다. 여러 개의 컨테이너를 만들어서 실행한다고 해도 OS는 하나이기 때문에 가상머신에 비해 고 밀도화가 가능합니다.

 그리고 컨테이너에서 실행되는 프로세스를 위한 메모리만 필요하기 때문에 낮은 사양의 환경에서 더욱 활용도가 높습니다.

 

 

3. 낮은 오버헤드


가상화를 위한 하드웨어 에뮬레이트 (emulate) 단계 없이, 분리된 공간을 만들기 때문에 오버 헤드가 줄어 듭니다.

 

 

4. 어플리케이션 컨테이너 지원

 

컨테이너는 가상머신과는 달리 init을 먼저 시작하거나 각종 데몬들을 실행할 필요가 없습니다. 

 컨테이너는 목적에 맞는 프로세스만 존재하는 환경을 만들 수 있습니다. 즉 웹서버 용 컨테이너라면 Apache Httpd 프로세스만 존재하는 컨테이너를 만들 수 있습니다.

이러한 환경을 어플리케이션 컨테이너라고합니다. 물론 init을 처음 시작하여 보통의 OS가 시작하는 것과 같은 환경을 만들 수 있는데 이를 시스템 컨테이너라고 합니다.

 

 

 

리눅스 컨테이너의 단점

 

1. Host OS에 종속적

 

 리눅스 컨테이너는 OS에 있는 리눅스 커널이 관리하는 것이므로, 당연히 리눅스외에 다른 OS에서는 동작하지 않으며, 컨테이너 환경에서도 다른 OS를 설치할 수 없습니다.

컨테이너에 Linux의 모든 배포판은 설치할 수 있지만, 실행중인 커널은 하나이기 때문에 엄밀하게는 컨테이너는 Host OS 의 커널을 사용하게 됩니다. 예를 들어 Ubuntu Host OS에서 컨테이너에 CentOS를 설치한다고 해도 실행중인 커널은 Ubuntu 커널입니다.

 

 

2. 컨테이너별 커널구성 불가

 

 커널에 관련된 작업은 가능하지만, 컨테이너마다 다른 커널 작업을 수행 할 수는 없습니다. 따라서 컨테이너에서 보이는 장치나 로드되는 커널 모듈은 모두 동일합니다.

 

 

3.컨테이너별 커널구성이 불가능


정확하게는 커널에 관련된 작업은 가능합니다. 그러나 컨테이너마다 다른 커널 작업을 수행 할 수는 없습니다. 커널의 기능으로 구성되는 환경이기 때문에 당연히 전체 컨테이너에서 보이는 커널은 동일합니다. 따라서 컨테이너에서 보이는 장치나 로드되는 커널 모듈은 모두 동일합니다.

 


 

 

LXC는 컨테이너를 만들기 위해 사용하는 커널 기능

 

 

1. 커널 네임스페이스 (ipc, uts, 마운트, pid, 네트워크, 사용자)

 

2. Apparmor와 SELinux 프로파일

 

3. Seccomp 정책

 

4. Chroots (pivot_root 사용)

 

5. 커널 캐퍼빌리티

 

6. CGroups (컨트롤 그룹)

 

LXC 컨네이너는 보통 chroot와 실제 가상머신의 중간적인 성격을 갖고 있다고 생각되어 집니다. LXC의 목적은 별도의 독립적인 커널이 없어도 보통의 리눅스 설치에 가까운 환경을 만드는 것입니다.

 

 


 

 

LXC를 사용할 때의 주의점

 

LXC는 cgroups 기능을 사용하여 다양한 자원을 분리하여 독립적 인 환경을 제공하고 있습니다.
LXC로 만들어진 가상 환경은 호스트 환경에서 완전히 고립된 상태이기 때문에 가상 환경에서 호스트 환경의 리소스를 직접 액세스 할 수 없습니다. 그러나 주의해야 할 것은 root 권한으로 동작하기 때문에 컨테이너에서 root 권한으로 실행되는 프로세스는 호스트 환경에서 root 권한을 가지게 됩니다. 이 문제를 해결하기 위해 LXC 1.0 컨테이너에서는 root 사용자를 컨테이너 외부에서 다른 사용자로 처리하는 방식으로 구현되었습니다. 이것은 커널쪽에서도 지원이 필요하기 때문에, 환경에 따라서는 사용할 수없는 경우도 있으므로 주의해야 합니다.

 


 

소개와 특징은 이것으로 간단히 마치고 다음에 더 자세한 내용으로 작성하겠습니다.

반응형