인프라

[ubuntu 22.04] lxc 설정하기

하루이2222 2024. 8. 31. 23:07

1. LXC란 무엇인가?

**LXC (Linux Containers)**는 운영체제 수준의 가상화 기술입니다. 전체 운영체제를 새로 설치하는 가상 머신(VM)과 달리, LXC는 기존 리눅스 커널의 기능을 활용해 프로세스와 네트워크, 파일 시스템 등을 격리된 공간(컨테이너)에서 실행합니다. 이 덕분에 거의 네이티브에 가까운 성능을 발휘하며, 빠르고 효율적인 개발 및 테스트 환경을 구축하는 데 매우 유용합니다.


2. LXC 설치 및 기본 설정

가장 먼저 LXC를 설치하고 기본적인 환경을 설정해 보겠습니다. (Ubuntu/Debian 기준)

2.1. LXC 패키지 설치

터미널을 열고 아래 명령어를 입력하여 LXC와 컨테이너 생성에 필요한 템플릿을 설치합니다.

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

2.2. 전역 설정 파일 수정

모든 컨테이너에 공통으로 적용될 기본 설정을 구성합니다. /etc/lxc/default.conf 파일을 열어 수정합니다.

sudo nano /etc/lxc/default.conf

아래는 설정 예시입니다. 각 항목의 의미를 잘 확인하고 필요에 맞게 수정하세요.

# AppArmor 프로파일 비활성화
# 컨테이너에 보안 제약을 적용하지 않아 자유도는 높아지지만, 보안에 취약해질 수 있습니다.
# 특별한 목적이 없다면 기본 설정을 유지하는 것을 권장합니다.
lxc.apparmor.profile = unconfined

# 컨테이너의 리눅스 기능 권한 관리 (모든 권한 유지)
lxc.cap.drop =

# 컨테이너 내부에서 Docker와 같은 중첩 가상화를 사용하기 위한 설정입니다.
# 고급 설정으로, 일반적인 사용 환경에서는 권장되지 않습니다.
lxc.mount.auto = proc:mixed sys:mixed cgroup:mixed

⚠️ 보안 경고
lxc.apparmor.profile = unconfined 설정은 컨테이너에 거의 모든 권한을 부여하므로 심각한 보안 위협이 될 수 있습니다. 신뢰할 수 없는 이미지나 애플리케이션을 실행할 경우, 이 설정은 사용하지 않는 것이 좋습니다.


3. 나만의 컨테이너 만들기

이제 실제로 사용할 컨테이너를 생성해 보겠습니다. lxc-create 명령어를 사용합니다.

# 'my-ubuntu-container'라는 이름의 Ubuntu 컨테이너 생성
sudo lxc-create -n my-ubuntu-container -t ubuntu
  • -n: 생성할 컨테이너의 이름을 지정합니다.
  • -t: 사용할 리눅스 배포판 템플릿을 지정합니다. (예: ubuntu, debian, fedora 등)

이 과정은 원격 서버에서 이미지를 다운로드하므로 약간의 시간이 소요될 수 있습니다.


4. 컨테이너 세부 설정

각 컨테이너는 자신만의 설정 파일을 가집니다. 이 파일을 수정하여 네트워크나 아키텍처 등 세부 사항을 조정할 수 있습니다.

컨테이너 설정 파일 경로는 /var/lib/lxc/[컨테이너 이름]/config 입니다.

sudo nano /var/lib/lxc/my-ubuntu-container/config

아래는 일반적인 설정 파일의 내용입니다.

# 전역 및 공통 설정 파일 포함
lxc.include = /etc/lxc/default.conf
lxc.include = /usr/share/lxc/config/common.conf

# 컨테이너 아키텍처 (64비트)
lxc.arch = linux64

# 컨테이너의 루트 파일 시스템 경로
lxc.rootfs.path = dir:/var/lib/lxc/my-ubuntu-container/rootfs

# 컨테이너의 호스트 이름
lxc.uts.name = my-ubuntu-container

# 네트워크 설정
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0  # 호스트의 lxcbr0 브리지에 연결
lxc.net.0.flags = up     # 네트워크 인터페이스 활성화
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx # 고유한 MAC 주소

5. 컨테이너 관리 A to Z: 필수 명령어 모음

컨테이너를 생성했다면 이제 자유자재로 관리할 수 있어야 합니다. 다음은 필수 관리 명령어 목록입니다.

  • 컨테이너 목록 확인
  • sudo lxc-ls --fancy
  • 컨테이너 시작
  • # 포그라운드에서 시작 sudo lxc-start -n my-ubuntu-container # 백그라운드(데몬) 모드로 시작 sudo lxc-start -n my-ubuntu-container -d
  • 컨테이너 상태 확인
  • sudo lxc-info -n my-ubuntu-container
  • 컨테이너 내부 접속 (셸 실행)
  • sudo lxc-attach -n my-ubuntu-container
  • 컨테이너 정지
  • sudo lxc-stop -n my-ubuntu-container
  • 컨테이너 삭제 (주의! 복구 불가)
  • sudo lxc-destroy -n my-ubuntu-container
  • 컨테이너 일시정지 및 재개
  • sudo lxc-freeze -n my-ubuntu-container # 일시정지 sudo lxc-unfreeze -n my-ubuntu-container # 재개
  • 시스템 부팅 시 자동 시작 설정
    컨테이너 설정 파일 (/var/lib/lxc/[컨테이너 이름]/config) 하단에 다음 한 줄을 추가합니다.
  • lxc.start.auto = 1

6. 고급 활용: 포트 포워딩과 서비스 영속성

컨테이너 내부에 웹 서버나 DB 서버를 구축했다면 외부에서 접속할 수 있어야 합니다. 컨테이너는 10.0.3.x와 같은 내부 IP를 가지므로, 호스트의 특정 포트로 들어오는 요청을 컨테이너로 전달해주는 포트 포워딩 설정이 필요합니다.

또한, 이 설정은 시스템을 재부팅하면 초기화되므로 스크립트를 만들어 부팅 시 자동으로 실행되도록 해야 합니다.

6.1. iptables 포트 포워딩 스크립트 작성

먼저, 포워딩 규칙을 담은 셸 스크립트를 작성합니다.

sudo nano /etc/iptables-rules.sh

스크립트 내용을 아래와 같이 작성합니다. (예시: 호스트의 4831 포트를 컨테이너의 22번(SSH) 포트로 연결)

#!/bin/bash

# 컨테이너 IP 확인 (예: 10.0.3.86)
CONTAINER_IP="10.0.3.86"

# 기존 NAT 규칙 초기화 (선택 사항)
# iptables -t nat -F PREROUTING

# [호스트 포트] -> [컨테이너 IP:포트]
# 예시 1: 호스트 4831 -> 컨테이너 22 (SSH)
iptables -t nat -A PREROUTING -p tcp --dport 4831 -j DNAT --to-destination ${CONTAINER_IP}:22

# 예시 2: 호스트 9100 -> 컨테이너 9100 (모니터링)
iptables -t nat -A PREROUTING -p tcp --dport 9100 -j DNAT --to-destination ${CONTAINER_IP}:9100

# 예시 3: 호스트 8100 -> 컨테이너 8000 (웹서버)
iptables -t nat -A PREROUTING -p tcp --dport 8100 -j DNAT --to-destination ${CONTAINER_IP}:8000

echo "iptables 포트 포워딩 규칙이 적용되었습니다."

작성한 스크립트에 실행 권한을 부여합니다.

sudo chmod +x /etc/iptables-rules.sh

6.2. 재부팅 시 스크립트 자동 실행

cron을 사용하면 시스템이 부팅될 때마다 이 스크립트를 간편하게 실행할 수 있습니다.

sudo crontab -e

편집기 가장 아래에 다음 내용을 추가하고 저장합니다.

@reboot /etc/iptables-rules.sh

이제 시스템을 재부팅해도 포트 포워딩 규칙이 자동으로 적용되어 컨테이너의 서비스를 안정적으로 운영할 수 있습니다.