Profile picture

[Linux] LXC(Linux Containers)에 대해서 알아보기

JaehyoJJAng2025년 01월 05일

개요

이번 게시글에서는 리눅스 컨테이너(LXC)에 대해서 알아보려고 합니다.

LXC가 뭐고, 왜 사용하는지, 도커와는 어떻게 다른지, 그리고 실제로 어떻게 구축하는 지 등 모든걸 다뤄봅시다.


LXC란 무엇인가?

Image
[출처: https://www.redhat.com/ko/topics/containers/whats-a-linux-container]


LXC(Linux Containers)는 리눅스 커널의 네임스페이스(namespace)와 cgroups(Control Groups) 기능을 활용해서,

독립된 파일 시스템, 프로세스 공간, 네트워크 인터페이스 등을 갖춘 격리된 환경, 즉 컨테이너를 만들어주는 기술이에요.


쉽게 말해서, 하나의 리눅스 시스템 내에서 여러 개의 독립된 환경을 동시에 운영할 수 있게 해주는 거지요.

이게 가능한 이유는 리눅스 커널의 네임스페이스와 cgroups 때문인거죠.



일반적으로 우리가 알고 있는 가상화는 하이퍼바이저라는 논리적인 플랫폼을 사용하여,

하나의 호스트 위에 여러 대의 Guest OS를 구동하는 기술로 알고 있죠?


그러나 LXC는 하나의 리눅스 시스템에서 프로세스들을 격리(분리)시켜 독자적인 시스템 환경을 구축합니다.


LXC 주요 구성 요소

  • 네임스페이스(Namespace): 프로세스, 네트워크, 파일 시스템 등을 분리해서 각 컨테이너가 독립된 환경을 가질 수 있도록 해줍니다.
  • cgroups(Control Groups): CPU, 메모리, 디스크 I/O 등 시스템 자원을 컨테이너별로 할당하고 제한할 수 있도록 해줍니다.
  • chroot: 파일 시스템의 루트 디렉토리를 변경해서 컨테이너 내에서의 파일 접근을 제한해줍니다.

LXC를 사용하는 이유?

경량화된 가상화

LXC는 전체 운영체제를 가상화하는 전통적인 가상 머신(VM)과는 다르게,

호스트 운영체제의 커널을 공유하면서 필요한 부분만 격리합니다.

LXC란 무엇인가?에서 짧게 애기했었죠?


그렇기 때문에 자원 소모가 적고, 시작 속도가 훨~씬 빠르답니다.

예를 들어, VM의 경우 초기 부팅부터 시작해서 서비스가 구동 되는데 까지 최소 몇 분이 걸리지만, LXC는 몇 초 만에 시작할 수 있습니다.


높은 성능

호스트와 동일한 커널을 사용하기 때문에 가상 머신보다 당연히 오버헤드가 더 적습니다.

그래서 성능 면에서 훨씬 효율적이죠.

애플리케이션이 호스트에서 직접 실행되는 것과 거의 비슷한 성능을 보여줍니다.


유연성

LXC는 다양한 리눅스 배포판을 컨테이너 내에서 실행할 수 있어서, 개발 및 테스트 환경을 다양하게 구성할 수 있습니다.

예를 들어, Ubuntu, CentOS, Debian 등 여러 배포판을 동시에 운영할 수 있는 이점이 존재하죠.


격리 및 보안

컨테이너 간의 격리를 통해 애플리케이션 간의 충돌을 방지하고, 보안적은 측면에서도 독립된 환경을 제공해요.

하나의 컨테이너에서 문제가 발생하면 어떻게 될까요?

당연히 다른 컨테이너나 호스트에 문제를 발생시키지 않습니다.


도커와 LXC의 차이점

기본 개념

LXC

  • 저수준의 컨테이너 기술로, 리눅스 커널 기능을 직접 활용해서 컨테이너를 관리해요.

Docker

  • LXC를 기반으로 하지만, 애플리케이션 배포와 관리를 위한 고수준의 도구 및 생태계를 제공합니다.
  • Docker 자체의 컨테이너 런타임(Docker Engine)을 사용하고, 이미지 관리, 레지스트리, 오케스트레이션 같은 기능도 포함하고 있어요.

사용 목적

LXC

  • 주로 시스템 전체를 격리된 환경에서 실행해야 할 때 사용됩니다.
  • 전체 서버 환경을 컨테이너로 분리해서 테스트하거나 다중 테넌시 환경 구축 시 유용해요!

Docker

  • 애플리케이션 단위의 컨테이너화에 최적화되어 있어요!
  • 마이크로 서비스 아키텍처, CI/CD 파이프라인, 애플리케이션 배포 등에 주로 사용됩니다.

이미지 관리

LXC

  • 이미지 관리가 도커에 비해 다소 복잡해요.
  • 사용자가 직접 이미지 파일을 관리해야 할 수도 있어요.

Docker

  • 도커 허브와 같은 중앙 레지스트리를 통해 이미지를 쉽게 공유하거나 관리할 수 있어요.


LXC 구축(생성) 방법

이제 실제로 LXC를 설치하고 컨테이너를 생성하는 방법에 대해서 설명해보려고 해요.

해당 챕터는 Ubuntu를 기준으로 설명할거에요.


1. LXC 설치

Ubuntu에서 LXC를 설치하려면 다음 명령어를 사용해요

sudo apt update -y
sudo apt install -y lxc

2. LXC 네트워크 설정

기본적으로 LXC는 브리지(Bridge) 네트워크를 사용해서 컨테이너에 네트워크를 제공해요.

lxc-net 서비스가 활성화 되어있는지 확인하고, 활성화되지 않았다면 활성화 해줘야 해요.

sudo systemctl enable lxc-net
sudo systemctl start lxc-net

3. 컨테이너 템플릿 확인

LXC는 다양한 리눅스 배포판의 템플릿(Template)을 지원합니다.

사용 가능한 템플릿 목록을 확인하려면 다음 명령어를 사용해봐요.

ls /usr/share/lxc/templates/

4. 컨테이너 생성

예를 들어, Ubuntu 20.04 기반의 컨테이너를 생성하려면 다음 명령어를 사용해요.

sudo lxc-create -n my-container -t ubuntu -- -r focal

옵션에 대한 설명은 다음과 같아요.

  • -n my-container: 컨테이너의 이름을 my-container로 지정해요.
  • -t ubuntu: Ubuntu 템플릿을 사용해요
  • -- -r focal: Ubuntu 20.04 (Focal Fossa) 릴리즈를 사용하도록 해요.

5. 컨테이너 시작

생성한 컨테이너를 시작하려면 다음 명령어를 사용해봐요.

sudo lxc-start -n my-container -d

6. 컨테이너 상태 확인

생성한 컨테이너의 상태를 확인하려면 다음 명령어를 사용해요

sudo lxc-ls -f

7. 컨테이너 내부 접속

컨테이너 내부로 접속해 특정 명령어를 실행하고 싶다면 다음 명령어를 실행하여 컨테이너 내부로 진입할 수 있어요.

sudo lxc-attach -n my-container

8. 컨테이너 중지

작업이 끝난 후 컨테이너를 중지하려면 다음 명령어를 사용해요.

sudo lxc-stop -n my-container

9. 컨테이너 삭제

더 이상 필요 없는 컨테이너를 삭제하려면 다음 명령어를 사용해요

sudo lxc-destroy -n my-container

10. 자원 할당

컨테이너의 CPU, 메모리, 디스크 등을 cgroups를 통해 세밀하게 제어할 수 있어요!

예를 들어, 특정 컨테이너에 할당할 메모리를 제한하려면 컨테이너 생성 시 설정 파일을 수정하거나,

실행 중인 컨테이너에 cgroups 설정을 적용해 주면 돼요.

sudo lxc-cgroup -n my-container memory.limit_in_bytes 512M
    Tag -

Loading script...