LinuX Container(LXC)의 설치 및 실행
주의: LXC는 곧 지원기간이 만료되므로 사용해서는 안됩니다.
본 내용은 이 자료1에 기반하여 작성되었습니다.
LXC의 설치
먼저, 우분투에서 아래의 명령을 쳐서 LXC를 설치해주도록 합니다.
sudo apt install lxc
lxc
의 설치가 완료되면 lxc-checkconfig
를 통해서 현재 사용할 수 있는 기능들을 확인하고, 아래와 같은 명령어를 쳐서 test-container를 임의로 제작을 해보도록 합니다.
sudo lxc-create -n test-container -t download
다운로드 중에 아래와 같은 창이 뜨게 될 것입니다.
Setting up the GPG keyring
Downloading the image index
---
DIST RELEASE ARCH VARIANT BUILD
---
alpine 3.10 amd64 default 20200628_13:00
alpine 3.11 ppc64el default 20200628_13:00
...
---
Distribution:
여기서 Distribution을 ubuntu
로 설정하시고 Release는 bionic
, Architecture는 i386
으로 설정하면 됩니다.
그러면 이제 i386 ubuntu bionic 버전의 설치가 시작되게 됩니다.
설치가 완료되면 다음과 같은 글이 쉘에 뜨게 됩니다.
Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs
---
You just created an Ubuntu bionic i386 (20200628_07:42) container.
To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.
LXC의 실행
설치가 완료되었으면 sudo lxc-start -n test-container -d
를 쳐서 방금 제작한 컨테이너를 실행하고, 실행이 정상적으로 되었는지를 확인하기 위해서 sudo lxc-ls --fancy
를 쳐서 확인해보도록 합니다.
정상적으로 설치가 된 경우에는 아래와 같은 창이 뜨게 됩니다.
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
test-container RUNNING 0 - 10.0.3.3 - false
LXC의 사용
방금 만든 컨테이너의 계정을 만들어주기 위해서 sudo lxc-attach -n test-container
라고 쳐주도록 합니다. 그러면 방금 만든 container의 root 계정으로 들어가게 됩니다.
여기서 sudo adduser test
을 수행해주어 계정을 만든 후에, visudo
를 쳐서 super user 권한을 방금 만든 계정에 부여해주도록 합니다
root ALL=(ALL:ALL) ALL
test ALL=(ALL:ALL) ALL
그리고 exit
을 쳐서 test-container에서 빠져나와서 사용자로 접근하기 위해서 sudo lxc-console -n test-container
라고 쳐서 진입을 하도록 합니다.
이 경우에 Login:
표시가 안 뜰 수도 있는 데, 그냥 사용자 계정을 먼저 치신 후에 암호를 치면 됩니다. 만약, 콘솔에서 빠져나가고 싶은 경우에는 Ctrl+a q
를 눌러서 빠져나가도록 합니다.
현재 컨테이너를 중지시키고 싶은 경우에는 sudo lxc-stop -n test-container
를 사용하고, 컨테이너를 삭제하고 싶은 경우에는 sudo lxc-destroy -n test-container
를 통해 삭제하도록 합니다.
Container에 SSH 접속
간단하게 컨테이너에 open-ssh를 설치하여 외부에서 접근이 가능하도록 만들어보겠습니다. 아래의 명령을 작성해서 OpenSSH 설치를 하고, 정상적으로 설치되었는지를 확인하도록 합니다. 정상적으로 설치가 된 경우에는 Active 상태가 active
로 뜨게 될 것입니다.
sudo apt update && sudo apt upgrade
sudo apt install openssh-server
sudo systemctl status sshd
이후, 컨테이너에서 네트워크 관련 툴을 설치해주도록 합니다.
sudo apt install net-tools
그러면 sudo lxc-ls --fancy
가 없어도 ifconfig
명령을 통해서 IP를 알아낼 수 있습니다. 여기까지 했으면 다시 호스트로 돌아가서 아래의 명령을 쳐서 포트 포워딩을 설정을 해주도록 합니다.
# 역할: NAT로 eth0의 9999 포트로 들어오는 tcp 패킷을 10.0.3.3:22로 보내도록 한다.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 9999 -j DNAT --to 10.0.3.3:22
[주의 사항] 반드시 위 명령을 수행하기 전에
ifconfig
를 통해서 자신의 네트워크 인터페이스가eth0
인지를 확인하도록 합니다. 간혹enp2s0
와 같이 다른 인터페이스일 수 있습니다.
이제 외부에서 아래의 명령어를 쳐서 접속할 수 있게 됩니다. 이때, 호스트가 아닌 외부에서 반드시 접속해야 합니다. 그렇지 않고, 호스트에서 ssh test@192.168.0.3 -p 9999
와 같이 쳐서 접속하면 안됩니다.
# host의 ip를 192.168.0.3 이라고 가정하겠습니다.
ssh test@192.168.0.3 -p 9999
그리고 반드시 ufw 방화벽에서 자신이 지정한 포트를 열어주셔야 합니다. 만약에 컨테이너를 삭제하고 iptable에서 관련 포워딩 정보를 제거할 때에는 다음의 순서로 진행하면 됩니다. 먼저, 지우고자 하는 번호를 확인하기 위해서 다음의 명령을 실행하도록 합니다.
sudo iptables -t nat -v -L PREROUTING -n --line-number
명령을 수행하면 아래와 같은 표가 뜨게 됩니다.
Chain PREROUTING (policy ACCEPT 224 packets, 33457 bytes)
num pkts bytes target prot opt in out source destination
1 2 112 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9999 to:10.0.3.3:22
여기서 자신이 설정한 인터페이스 eth0
가 맞는 지와 dpt:9999 to to:10.0.3.3:22
로 설정되어 있는지를 확인해주도록 합니다. 만약, 자신이 지우고자 하는 내용이 맞다면 num
열에 있는 값을 확인해서 아래의 명령을 쳐서 지워주도록 합니다.
# num이 1이므로 1이라고 치도록 한다.
sudo iptables -t nat -D PREROUTING 1
자세한 내용은 자료2를 참고해주시길 바랍니다.
cgroup의 설정
메모리 제한
cgroup은 컨트롤 그룹으로 컴퓨팅 리소스에 대한 자원 관리를 하는 데 사용됩니다. 이러한 cgroup을 통해서 컨테이너별로 적절한 컴퓨팅 자원의 배분을 진행할 수 있습니다.
아까의 test-container에서 free -m
을 통해서 총 메모리 양을 확인해보면 호스트와 동일한 것을 알 수 있습니다. 이를 8GB까지 줄이기 위해서 호스트에서 아래의 명령을 수행하도록 합니다.
lxc-cgroup -n test-container memory.limit_in_bytes 8G
그리고 호스트의 cgroup의 메모리 서브시스템에 들어가서 제대로 설정되었는 지를 아래의 명령을 통해서 확인을 해주도록 합니다.
cat /sys/fs/cgroup/memory/lxc/test-container/memory.limit_in_bytes
# 8589934592이 나옵니다.
마지막으로, test-container에 들어가서 free-m
을 치면 아래와 같이 8GB만 할당되어 나오는 것을 알 수 있습니다.
total used free shared buff/cache available
Mem: 8192 43 8019 0 129 8148
Swap: 2047 0 2047
추가로 읽어볼 만한 자료로 이것3이 있습니다.