인프라

[ubuntu 22.04] lxc 설정하기

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

LXC (Linux Containers) 설치 및 활용 가이드

이 문서는 LXC(Linux Containers)의 개념을 설명하고, 설치부터 기본 설정, 컨테이너 생성 및 관리, 그리고 포트 포워딩을 통한 고급 활용까지의 과정을 상세히 기술함.

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. 컨테이너 관리 필수 명령어

다음은 컨테이너 관리에 필요한 필수 명령어 목록임.

  • 컨테이너 목록 확인
    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. 고급 활용: 포트 포워딩과 서비스 영속성

컨테이너 내부에 구축된 서비스(웹 서버 등)를 외부에서 접속하려면 포트 포워딩 설정이 필요함. 이는 호스트의 특정 포트로 들어오는 요청을 10.0.3.x와 같은 내부 IP를 가진 컨테이너로 전달하는 방식임. 이 설정은 재부팅 시 초기화되므로, 스크립트와 cron을 통해 영속성을 확보함.

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

포워딩 규칙을 담은 셸 스크립트를 /etc/iptables-rules.sh 경로에 작성함.

sudo nano /etc/iptables-rules.sh

아래는 호스트의 특정 포트를 컨테이너의 포트로 연결하는 스크립트 예시임.

#!/bin/bash

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

# [호스트 포트] -> [컨테이너 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 작업을 추가하고 저장함.

@reboot /etc/iptables-rules.sh