Ubuntu 22.04 LXC 컨테이너 사용하기

LXC(Linux Containers)는 리눅스 커널의 컨트롤 그룹(cgroup)과 네임스페이스만으로 격리된 실행 환경을 만드는 컨테이너 기술로, Docker가 내부적으로 쓰던 기반 기술이기도 하다. Docker처럼 이미지 레이어나 오케스트레이션 기능은 없지만, 그만큼 가볍고 VM에 가까운 방식으로 리눅스 배포판 하나를 통째로 컨테이너로 띄워 쓸 수 있다. 이 글에서는 Ubuntu에서 lxc 패키지로 컨테이너를 생성·시작·접속·정리하는 과정을 실제로 실행한 결과와 함께 정리한다.

LXC 설치

sudo apt update
sudo apt install -y lxc lxc-templates

설치 가능한 컨테이너 템플릿은 /usr/share/lxc/templates에 있다. ubuntu 배포판 컨테이너를 만들 것이므로 lxc-ubuntu가 목록에 있는지 확인한다.

$ ls /usr/share/lxc/templates/
lxc-alpine     lxc-centos    lxc-fedora         lxc-oci           lxc-plamo      lxc-sparclinux    lxc-voidlinux
lxc-altlinux   lxc-cirros    lxc-fedora-legacy  lxc-openmandriva  lxc-pld        lxc-sshd
lxc-archlinux  lxc-debian    lxc-gentoo         lxc-opensuse      lxc-sabayon    lxc-ubuntu
lxc-busybox    lxc-download  lxc-local          lxc-oracle        lxc-slackware  lxc-ubuntu-cloud

컨테이너 생성 (lxc-create)

lxc-create는 지정한 템플릿으로 컨테이너의 rootfs와 설정 파일을 생성한다(참조: lxc-create manpage).

lxc-create {-n name} [-f config_file] {-t template} [-B backingstore] [-- template-options]
옵션설명
-n, --name컨테이너를 식별할 이름
-f, --config가상화·isolation 설정 파일 경로
-t, --template사용할 템플릿(예: ubuntu, debian, alpine)
-B, --bdev백엔드 스토리지 타입(dir, btrfs, lvm, zfs 등, 기본은 dir)

-- 뒤에 템플릿 전용 옵션을 붙일 수 있는데, ubuntu 템플릿은 -r(release)로 배포판 버전을 지정한다. 지정하지 않으면 호스트와 같은 버전을 받는다.

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

내부적으로 debootstrap으로 최소 이미지를 받아오는 방식이라 네트워크 상태에 따라 수 분 걸릴 수 있다. 완료 후 lxc-ls --fancy로 상태를 확인하면 아직 STOPPED다.

$ sudo lxc-ls --fancy
NAME         STATE   AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
my-container STOPPED 0         -      -    -    false

컨테이너 시작·접속·정지·삭제

lxc-startcommand를 지정하지 않으면 /sbin/init을 실행해 컨테이너를 부팅한다(참조: lxc-start manpage). 시작 후 다시 확인하면 RUNNING 상태에 IPv4까지 할당된다 — 기본 설치 시 lxc-netlxcbr0 브리지와 dnsmasq로 컨테이너에 DHCP를 넘겨주기 때문이다.

sudo lxc-start -n my-container

실행 중인 컨테이너에는 별도 SSH 없이 lxc-attach로 바로 셸을 붙일 수 있다.

$ sudo lxc-attach -n my-container -- hostname
my-container
$ sudo lxc-attach -n my-container -- cat /etc/os-release | head -2
PRETTY_NAME="Ubuntu 24.04.4 LTS"
NAME="Ubuntu"

정지와 삭제는 각각 lxc-stop, lxc-destroy로 한다. 실행 중인 컨테이너는 삭제할 수 없으므로 반드시 stop 후 destroy한다. 두 명령 모두 성공하면 별도 메시지 없이 조용히 끝난다.

$ sudo lxc-stop -n my-container
$ sudo lxc-ls --fancy
NAME         STATE   AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
my-container STOPPED 0         -      -    -    false

$ sudo lxc-destroy -n my-container
$ sudo lxc-ls --fancy
$ 

주의사항

  • 기본 생성 컨테이너는 UNPRIVILEGED: false, 즉 privileged 컨테이너다. 컨테이너 root가 호스트 root와 사실상 같은 권한 경계에 있으므로, 격리를 신뢰할 수 없는 워크로드라면 lxc-usernet/subuid·subgid를 설정해 unprivileged 컨테이너로 만드는 게 안전하다.
  • 실행 중인 컨테이너는 lxc-destroy로 바로 지워지지 않는다. lxc-stop으로 먼저 정지해야 한다.
  • 이 lxc-* 계열 명령은 Ubuntu 22.04/24.04 저장소에 여전히 남아있지만, Canonical은 이후 배포판에서 스냅 기반 LXD의 lxc 명령(예: lxc launch ubuntu:24.04)을 기본 워크플로로 밀고 있다. 명령 이름이 겹치므로(lxc-create vs lxc create) 어느 쪽을 쓰는지 헷갈리지 않도록 한다.

마무리

lxc-* 명령만으로도 별도 데몬 관리 없이 컨테이너를 생성·실행·접속·정리하는 흐름을 그대로 확인할 수 있었다. 다만 legacy LXC와 LXD 기반 lxc 명령이 공존하는 상황이니, 새로 시작한다면 어느 도구 체계로 갈지 먼저 정하고 진행하는 게 좋다.

참고

답글 남기기