요구 사양

최소 사양 :

lxc-attach 사용을 위한 추가 사양 :

비특권 컨테이너 사용을 위한 추가 사양 :

추천 라이브러리 :

설치

대부분의 경우, 리눅스 배포판에 맞는 최신 LXC 버전은 배포판의 패키지 저장소 또는 몇몇 백포트 채널을 통해 찾을 수 있습니다.

처음 LXC를 사용하는 경우, 최신 버그 수정이 이루어진 LXC 1.0 버전과 같은 최신 지원 버전을 사용하는 것을 권장합니다.

우분투를 사용하는경우, 컨테이너 호스트로 우분투 14.04 LTS를 사용할 것을 권장합니다. LXC 버그 수정 버전은 공개된 직후 배포판 패키지 저장소를 통해 얻을 수 있습니다.

우분투는 안전한 비특권 LXC 컨테이너를 위해 필요한 모든 것을 포함하고 있는 몇 안되는 리눅스 배포판 중 하나입니다.

우분투에서는 다음과 같이 LXC를 간단하게 설치 할 수 있습니다.

sudo apt-get install lxc

사용가능한 모든 LXC 명령어, 모든 템플릿, LXC 스크립트에 필요한 pyton3 바인딩 등이 설치될 것입니다.

비특권 컨테이너 생성

비특권 컨테이너는 가장 안전한 컨테이너입니다. 컨테이너에서의 uid와 gid 범위를 할당하기 위해 uid와 gid 매핑을 사용합니다. 이는 컨테이너에서의 uid 0 (루트)가 실제로는 100000과 같은 uid를 사용함을 의미합니다. 그래서 뭔가 문제가 있거나 공격자가 컨테이너 밖으로 탈출을 시도하더라도, 실제로는 nobody 사용자정도의 권한만 가지고 있음을 알 수 있습니다.

불행히도 이것은 아래와 같은 일반적인 작업들을 수행하지 못함을 의미합니다.

위의 이유로 인해, 대부분의 배포판 템플릿은 동작하지 않을 것입니다. 대신 이러한 환경에서도 동작하는 미리 만들어진 배포판 이미지를 제공하는 "download" 템플릿을 사용하여야 합니다.

현재 최신 우분투 또는 그와 유사한 다른 리눅스 배포판 환경(최신 커널, 최신버전의 shadow, cgmanager, 기본 uid/gid 할당)에서는 다음과 같은 선행 동작이 필요합니다.

먼저, 해당 사용자가 /etc/subuid와 /etc/subgid에 정의된 uid/gid 매핑을 갖고 있어야 합니다. 우분투에서는 기본적으로 65536개의 uid와 gid할당이 모든 신규 사용자에게 할당되므로, 해당 매핑을 갖고 있을 것입니다. 만약 그렇지 않다면, usermod를 통해 할당해야 합니다.

그 다음은, /etc/lxc/lxc-usernet을 통해, 비특권 사용자에게 네트워크 장치 사용 할당을 설정해 주어야 합니다. 기본 값으로 사용자는 호스트에 어떤 네트워크 장치도 생성하지 못하게 되어 있을 것입니다. 설정 변경을 위해 아래의 내용을 파일에 추가하면 됩니다.

your-username veth lxcbr0 10

"your-username" 사용자가 lxcbr0 브리지에 연결되는 10개의 veth 장치를 만들 수 있게 허용했음을 의미합니다.

위의 작업이 끝난 후, 마지막으로 LXC 설정파일을 만들어 줍니다.

위 값들은 /etc/subuid and /etc/subgid에 있는 것과 동일하여야 합니다. 현재 우분투에서 첫번째 사용자인 경우라면 위와 같은 값을 가지고 있을 것입니다.

컨테이너를 만들기 전에, 사용자가 올바른 컨트롤 그룹에 위치하도록 로그아웃하고 다시 로그인하거나, 시스템을 재부팅하여야 할 것입니다. (LXC 설치 전에 cgmanager가 아직 설치되어 있지 않은 경우에만 요구됩니다.)

그리고 다음과 같이 컨테이너를 생성합니다.

lxc-create -t download -n my-container

download 템플릿은 선택할 수 있는 배포판 버전, 아키텍처 목록을 표시합니다. 좋은 예제는 "ubuntu", "trusty" (14.04 LTS), "i386" 입니다.

몇초 후 컨테이너가 생성될 것입니다. 다음과 같이 컨테이너 시작이 가능합니다.

lxc-start -n my-container -d

컨테이너의 상태를 다음과 같이 확인 할 수 있습니다.

lxc-info -n my-container
lxc-ls -f

다음과 같이 내부 쉘로 들어갈 수 있습니다.

lxc-attach -n my-container

컨테이너를 종료하려면 다음과 같이 수행합니다.

lxc-stop -n my-container

마지막으로 삭제는 다음과 같이 수행할 수 있습니다.

lxc-destroy -n my-container

root로 비특권 컨테이너 생성

시스템 전역적인 비특권 컨테이너를 실행하기 위해서는 (root가 비특권 컨테이너를 실행하는 경우), 위 단계중 일부만 따라해도 됩니다.

구체적으로 말하면, root에 uid와 gid를 /etc/subuid와 /etc/subgid로 할당할 필요가 있습니다. 그리고 /etc/lxc/default.conf의 lxc.id_map 항목에 위와 동일하게 범위를 설정해 줘야 합니다.

root의 경우 네트워크 장치 사용 할당은 설정해줄 필요가 없습니다. 그리고 전역적인 설정파일을 사용하므로 다음 단계가 필요하지 않습니다.

root로 위의 단계대로 생성한 컨테이너는 비특권 컨테이너로 실행됩니다.

특권 컨테이너 생성

특권 컨테이너는 root가 만들고 root가 실행할 수 있습니다.

리눅스 배포판에 따라서는 몇몇 캐퍼빌리티의 제거, apparmor 프로파일, selinux 컨텍스트 또는, seccomp 정책으로 보호될 수 있습니다. 하지만 프로세스는 여전히 root로 실행되고 있으므로 신뢰할 수 없는 사용자에게 특권 컨테이너 내에서 root 권한을 주지 말아야 합니다.

만약 특권 컨테이너를 만들어야 한다면 매우 간단합니다. 위에서의 여러 단계를 수행하지 않아도 특권 컨테이너를 만들 수 있습니다.

sudo lxc-create -t download -n privileged-container

위의 명령어는 download 템플릿의 이미지를 사용하여 "privileged-container" 라는 새로운 특권 컨테이너를 생성합니다.