• Home
  • About
    • 검은색 잉크 블로그 photo

      검은색 잉크 블로그

      github GIST → https://gist.github.com/BlaCkinkGJ입니다.

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[LXC] LinuX Container(LXC)의 사용법

29 Jun 2020

Reading time ~4 minutes

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이 있습니다.

참고 문헌

  1. https://lng1982.tistory.com/267 ↩

  2. https://www.cyberciti.biz/faq/how-to-iptables-delete-postrouting-rule/ ↩

  3. https://www.redhat.com/ko/topics/containers/whats-a-linux-container ↩



container Share Tweet +1