Server

우분투 시스템 에 lxc 설정하기

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

LXC란 무엇인가?

**LXC (Linux Containers)**는 리눅스 커널의 가상화 기술을 사용하여 애플리케이션을 격리된 환경에서 실행할 수 있게 해주는 운영체제 수준의 가상화 솔루션이다. LXC는 전통적인 가상 머신(VM)과는 달리, 전체 운영체제의 복제본을 실행하지 않고, 호스트 운영체제의 커널을 공유하면서도 격리된 파일 시스템, 네트워크, 프로세스 등을 제공한다.

1. LXC 설치

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

2. 전역 설정 파일 수정 (/etc/lxc/default.conf)

sudo nano /etc/lxc/default.conf
# AppArmor 설정
lxc.apparmor.profile = unconfined  # 컨테이너에 AppArmor 보안 프로파일을 적용하지 않음 (제한 없음), 컨테이너 사용자에게 모든 권한 을 주는 것이기 때문에 , 보안적인 위협이 존재 하기에 , 하기전에 잘생각할것.

# 리눅스 기능 권한 관리
lxc.cap.drop =  # 제거할 리눅스 기능 권한을 지정하지 않음 (즉, 모든 권한을 유지)

# 자동 마운트 설정
lxc.mount.auto = proc:mixed sys:mixed cgroup:mixed  # 컨테이너 내에서 /proc, /sys, cgroup을 혼합 모드로 마운트, 컨테이너 내부에서 도커를 독립적으로 실행 하기 위한 설정으로 , 기본적으로 권장하는 방법은 아님.

3. LXC 컨테이너 생성

컨테이너를 생성하려면 lxc-create 명령어를 사용한다. 예를 들어 "haru2_Container"라는 이름의 컨테이너를 생성하려면 다음 명령어를 사용한다:

sudo lxc-create -n haru2_Container -t ubuntu
  • -n: 생성할 컨테이너의 이름을 지정한다.
  • -t: 사용할 템플릿을 지정한다(예: ubuntu).

4. 컨테이너 설정 파일 수정 (/var/lib/lxc/haru2_Container/config)

컨테이너별로 추가적인 설정을 하기 위해 설정 파일을 편집한다:

sudo nano /var/lib/lxc/haru2_Container/config

설정 파일 내용 예제:

# 기본 설정 파일 포함
lxc.include = /etc/lxc/default.conf  # 전역 LXC 기본 설정 파일 포함
lxc.include = /usr/share/lxc/config/common.conf  # LXC에서 공통적으로 사용되는 설정 파일 포함

# 컨테이너 아키텍처 설정
lxc.arch = linux64  # 컨테이너의 아키텍처를 64비트 리눅스로 설정

# 컨테이너별 개별 설정
lxc.rootfs.path = dir:/var/lib/lxc/haru2_Container/rootfs  # 컨테이너의 루트 파일 시스템 경로 설정
lxc.uts.name = haru2_Container  # 컨테이너의 호스트 이름(네임스페이스에서 사용) 설정

# 네트워크 설정
lxc.net.0.type = veth  # 컨테이너 네트워크 인터페이스를 가상 이더넷(veth) 타입으로 설정
lxc.net.0.link = lxcbr0  # 컨테이너 네트워크를 호스트의 'lxcbr0' 브리지와 연결
lxc.net.0.flags = up  # 컨테이너 네트워크 인터페이스를 활성화(up) 설정
lxc.net.0.hwaddr = 00:16:3e:4d:5e:6f  # 컨테이너 네트워크 인터페이스의 MAC 주소 설정

5. LXC 컨테이너 관리 명령어 정리

  • 컨테이너 실행:
  • sudo lxc-start -n haru2_Container # 컨테이너를 시작한다. sudo lxc-start -n haru2_Container -d # 백그라운드 모드로 컨테이너를 시작한다.
  • 컨테이너 상태 확인:
  • sudo lxc-info -n haru2_Container # 컨테이너의 상태 정보를 출력한다.
  • 컨테이너 멈춤:
  • sudo lxc-stop -n haru2_Container # 실행 중인 컨테이너를 멈춘다.
  • 컨테이너 자동 시작 설정:
    컨테이너가 시스템 부팅 시 자동으로 시작되도록 설정하려면 설정 파일에 다음을 추가한다:
  • lxc.start.auto = 1 # 시스템 부팅 시 컨테이너 자동 시작
  • 컨테이너 삭제:
  • sudo lxc-destroy -n haru2_Container # 컨테이너를 삭제한다.
  • 컨테이너의 콘솔 접근:
  • sudo lxc-attach -n haru2_Container # 컨테이너 내부로 접근하여 쉘을 연다.
  • 컨테이너 일시 중지 및 재개:
  • sudo lxc-freeze -n haru2_Container # 컨테이너를 일시 중지한다. sudo lxc-unfreeze -n haru2_Container # 일시 중지된 컨테이너를 재개한다.
  • 컨테이너 목록 확인:
  • sudo lxc-ls --fancy # 시스템에 존재하는 모든 LXC 컨테이너 목록을 확인한다.

6. 시스템 재부팅 시 iptables 규칙 적용 스크립트

컨테이너가 생성되면 호스트 와는 브릿지 이기 때문에 호스트 의 ip로 컨테이너 에 접근하려면 포트 를 포워딩하여야 한다.
컨테이너와 관련된 네트워크 규칙이 재부팅 후에도 유지되도록 iptables 설정 스크립트를 작성하고 등록할 수 있다.

스크립트 작성

다음은 /etc/iptables-rules.sh 파일의 예제이다:

#!/bin/bash

# 네트워크 주소 변환(NAT) 규칙 설정
iptables -t nat -A PREROUTING -p tcp --dport 4831 -j DNAT --to-destination 10.0.3.86:22
iptables -t nat -A PREROUTING -p tcp --dport 9100 -j DNAT --to-destination 10.0.3.86:9100
iptables -t nat -A PREROUTING -p tcp --dport 8100 -j DNAT --to-destination 10.0.3.86:8000
iptables -t nat -A PREROUTING -p tcp --dport 9300 -j DNAT --to-destination 10.0.3.86:3306

# Docker 관련 규칙 설정
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

echo "iptables rules have been set."

실행 권한 부여

스크립트에 실행 권한을 부여한다:

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

스크립트 자동 실행 설정

cron을 사용하여 스크립트가 시스템 부팅 시 자동으로 실행되도록 설정한다:

sudo crontab -e

파일의 마지막에 다음 줄을 추가한다:

@reboot /etc/iptables-rules.sh

또는, systemd 서비스 파일을 생성하여 설정할 수도 있다.