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
이제 시스템을 재부팅해도 포트 포워딩 규칙이 자동으로 적용되어 컨테이너의 서비스를 안정적으로 운영할 수 있습니다.
'인프라' 카테고리의 다른 글
[ubuntu22.04] Docker 설치하기 (1) | 2024.10.10 |
---|---|
[TInypilot] Tinypilot 도커로 컨테이너화 해보기 (2) | 2024.09.01 |
[RaspberryPI] 라즈베리 파이 dwc 커스텀 usb_hid_gadget 설정 (4) | 2024.08.30 |
tinypilot 도커 이미지로 배포 하기 (0) | 2024.07.25 |
ubuntu ssh key-pair 생성 및 적용 (6) | 2024.07.23 |