리눅스 운영체제는 그 종류가 매우 다양합니다. 우분투(Ubuntu)처럼 범용적으로 쓰이는 배포판이 있는가 하면, 특정 목적에 맞춰 설계된 배포판도 있습니다. 보안 진단에 특화된 칼리 리눅스(Kali Linux), 가벼운 주부투(Xubuntu), 심지어 한나 몬태나 리눅스(Hannah Montana Linux)까지 존재합니다. 일반 데스크톱 용도라면 표준 리눅스로도 충분하지만, 서버 구동과 같은 전문적인 작업이라면 용도에 맞게 최적화된 배포판을 선택하는 것이 좋습니다.
최근 들어 컨테이너 기술은 빠르게 대중화되고 있습니다. 과거 코어OS(CoreOS)로 알려졌던 컨테이너 리눅스(Container Linux)는 손쉬운 컨테이너 기반 배포를 위해 설계된 리눅스 운영체제로, 니치 시장을 겨냥한 최신 리눅스 배포판 중 하나입니다. 이번 글에서는 컨테이너 리눅스의 개념부터 직접 설치하고 사용해 본 후기까지 자세히 살펴보겠습니다.
컨테이너 리눅스 실습: 기본 개념 이해하기
컨테이너 리눅스를 본격적으로 알아보기 전에, 먼저 서버 아키텍처에 대한 간단한 개요를 짚고 넘어가겠습니다. 컨테이너 리눅스는 클러스터(cluster) 환경에서의 배포를 전제로 설계되었습니다. 클러스터 배포라는 말이 다소 어렵게 들릴 수 있지만, 개념 자체는 단순합니다. 컴퓨터 클러스터란 여러 대의 서버가 하나의 유닛 또는 시스템처럼 함께 작동하도록 묶인 구성을 의미합니다. 클러스터 내부의 개별 서버를 '노드(node)'라고 부르며, 각 노드는 동일한 역할을 수행합니다. 즉, 노드는 단일 머신이고, 클러스터는 협업하는 서버들의 집합입니다.
컨테이너 리눅스의 가장 일반적인 활용 사례 역시 클러스터 환경입니다. 코어OS라는 이름으로 불리던 시절부터 단 한 대의 머신만으로도 클러스터를 구성할 수 있는 기능을 제공했습니다. 그러나 컨테이너 리눅스를 정의하는 핵심 특징은 바로 컨테이너에 대한 의존입니다.
전통적인 데스크톱 운영체제와 달리, 컨테이너 리눅스에서는 모든 애플리케이션이 컨테이너 안에서 실행됩니다. 가상머신(VM)과 컨테이너 모두 가상화 기술을 활용하지만, 두 방식에는 중요한 차이가 있습니다. VM과 달리 컨테이너는 호스트 머신과 동일한 운영체제 커널(kernel)을 공유합니다. 컨테이너화된 앱과 호스트가 같은 커널을 사용하기 때문에 배포 효율이 크게 향상됩니다. 반면 가상머신 방식에서는 각 VM마다 애플리케이션과 게스트 운영체제를 모두 구동해야 하며, 이는 다시 호스트 운영체제와 하드웨어 위에서 실행됩니다.
컨테이너 기반 배포는 가상화 소프트웨어 위에서 앱을 각각의 컨테이너로 격리하여 실행합니다. 도커(Docker)가 여전히 가장 널리 쓰이는 컨테이너 소프트웨어이지만, chroot, LXC, Linux-VServer 등이 도커의 대안으로 꼽힙니다.
컨테이너 리눅스 실습: 왜 컨테이너를 사용해야 할까?
컨테이너가 일종의 가상화 방법이라는 것은 알겠는데, 굳이 컨테이너 환경을 선택해야 할 이유가 있을까요? 일반적으로 컨테이너는 더 나은 성능을 제공합니다. 별도의 운영체제를 구동하지 않고 공유 커널을 사용함으로써 CPU, 스토리지, 메모리의 효율을 극대화할 수 있습니다.
VM 환경처럼 여러 개의 운영체제 인스턴스를 띄울 필요가 없기 때문에, 동일한 자원으로 더 많은 컨테이너를 구동할 수 있습니다. 단 하나의 운영체제만 필요하다는 점이 곧 성능 향상의 원천입니다. 마찬가지로 컨테이너 생성 속도도 가상머신보다 훨씬 빠릅니다. 따라서 컨테이너는 민첩성(agility)을 유지하고 지속적 통합(CI)·지속적 배포(CD)를 실현하는 데 더욱 적합합니다.
애자일(Agile) 개발은 반복(iteration)과 예측 불가능성의 수용에 초점을 맞춥니다. 애자일 철학이 궁금하다면 애자일 선언문(Agile Manifesto)을 참고해 보시기 바랍니다. 다만 컨테이너에도 장점만 있는 것은 아닙니다. 컨테이너는 호스트 운영체제의 커널을 공유하기 때문에 보안상 위험이 존재합니다. 특정 컨테이너에 발생한 취약점이나 침해 사고는 곧바로 운영체제 전체로 이어질 수 있습니다. 이를 보완하는 방법으로는, 가상머신 안의 운영체제 위에서 컨테이너화된 앱을 구동하는 것이 있습니다. 이렇게 하면 호스트 머신의 운영체제와 컨테이너 호스트 운영체제가 분리되어 안전해집니다.
또한 컨테이너화는 모든 컨테이너가 동일한 운영체제를 사용해야 한다는 제약도 있습니다. 가상머신에서는 애플리케이션마다 고유의 운영체제를 가질 수 있지만, 컨테이너에서는 윈도우 서버용으로 만들어진 앱을 리눅스 컨테이너 환경에서 구동할 수 없으며 그 반대도 마찬가지입니다.
컨테이너 리눅스 실습: 컨테이너 리눅스란?
코어OS, 즉 지금의 컨테이너 리눅스는 오픈소스 리눅스 운영체제입니다. 클러스터 배포를 겨냥한 경량 배포판으로, 특히 간결하고 신뢰성 있으며 확장 가능한(scalable) 배포에 집중합니다. 패키지 매니저를 찾아볼 수 없는 것이 특징인데, 대신 모든 애플리케이션을 컨테이너 안에서 구동하도록 요구합니다. 컨테이너 리눅스는 크롬 OS(Chrome OS)를 기반으로 하기 때문에 상당히 가볍습니다. 실제로 필자는 노후화된 HP Envy m6-1205dx(AMD A10 탑재) 노트북의 가상머신에서 이 운영체제를 구동해 보았는데, 시스템 자원 소모량은 비교적 낮게 유지되었습니다.
컨테이너 리눅스는 전통적인 데스크톱 리눅스의 여러 기능을 과감히 생략했기 때문에 배포판이 가벼운 상태를 유지합니다. 데스크톱 운영체제와 달리 패키지 매니저가 없으며, 모든 애플리케이션은 도커 컨테이너로 실행됩니다. 이는 높은 이식성(portability)과 서비스 격리(isolation)를 보장합니다. 데스크톱 환경을 기대한다면 아쉽겠지만, 컨테이너 리눅스에는 GUI가 없습니다. 모든 작업이 명령줄(CLI) 기반으로 이루어집니다. 다만 CoreUpdate 대시보드를 통해 머신 상태, 실행 중인 서비스, 클러스터 건강 상태 등의 정보를 확인할 수 있는데, 이는 프리미엄 관리형 리눅스(Premium Managed Linux) 구독에 포함된 유료 기능입니다.
컨테이너 리눅스 아키텍처
컨테이너 리눅스는 경량화되어 있으며 컨테이너화와 클러스터링을 위해 설계되었습니다. 데스크톱 환경이 없기 때문에 CentOS나 우분투 같은 리눅스와는 설정 방식이 다릅니다. 최초 부팅 시 컨테이너 리눅스는 cloud-config 파일을 로드합니다. 사용자는 이 cloud-config 파일에 필요한 정보를 입력해야 하는데, 익숙하지 않다면 다소 까다로울 수 있습니다. 그러나 이 파일은 필수 서비스 로드, 파라미터 변경, 클러스터 관리 등 컨테이너 리눅스의 핵심 기능을 좌우하는 중요한 요소입니다.
또한 etcd와 fleet 데몬(daemon)은 컨테이너 리눅스의 핵심 구성 요소입니다. 두 서비스 모두 기본적으로 부팅 시 자동으로 시작됩니다. 부팅 시 cloud-config 파일은 호스트가 기존 클러스터에 합류하는 방법을 알려주는 역할도 합니다. etcd 데몬은 클러스터 내 호스트들을 위한 데이터를 분산 저장하며, 설정 유지와 서비스 디스커버리(service discovery)에 필수적입니다. fleet 데몬은 분산형 init과 유사한 역할을 하며, 클러스터 내 호스트들의 systemd init과 연결되어 서비스 스케줄링 같은 작업을 처리합니다.
fleet 클러스터의 각 시스템에는 fleetd 데몬이 하나씩만 실행됩니다. 이 데몬은 에이전트(agent)와 엔진(engine), 두 가지 역할을 동시에 수행합니다. 엔진으로서는 스케줄링 결정을 내리고, 에이전트로서는 유닛(unit)을 실행합니다. fleet 클러스터에서 etcd는 유일한 데이터 저장소입니다. 클러스터 존재 여부, 유닛 상태, 유닛 파일 등의 정보가 모두 etcd 데몬에 저장되며, fleet 에이전트와 엔진 간 통신의 매개체 역할도 담당합니다.
컨테이너 리눅스 실습: 누구에게 적합할까?
컨테이너 리눅스는 무료로 다운로드할 수 있고, 가볍고, 가상머신에 설치하기도 비교적 간단합니다. 빠르고 확장 가능한 컨테이너 기반 배포가 필요한 사람이라면 누구나 컨테이너 리눅스를 선택할 만합니다. 특히 시스템 관리자와 데이터베이스 관리자가 가장 큰 수혜자입니다. 데스크톱 환경이 없기 때문에 클러스터 관리와 서버 환경에 가장 잘 어울립니다. 리눅스 서버 운영체제를 찾고 있다면, 컨테이너 리눅스는 최고의 리눅스 서버 배포판 12선에 꼽힐 만한 선택지입니다.
Air Pair에는 코어OS 도입 이유를 다룬 훌륭한 글이 있습니다. 이 글에서는 높은 가용성(high availability), 프로덕션 환경 유지보수, 소프트웨어 버전 관리, etcd 등을 컨테이너 리눅스 사용의 주요 장점으로 언급합니다. 특히 헌신적인 오픈소스 커뮤니티도 큰 매력입니다. 다만 컨테이너 리눅스는 숙련된 리눅스 사용자를 위해 맞춰져 있습니다. 공식 문서가 방대하긴 하지만 어느 정도의 리눅스 지식을 전제로 하기 때문에, 입문자나 초보 사용자는 초기 설치 과정에서 어려움을 느낄 수 있습니다.
특히 cloud-config 설정이 걸림돌이 될 수 있습니다. 한 코어OS 설치 영상의 댓글에서 유튜브 사용자 Setyoso Nugroho는 "좋은 튜토리얼이다! 하지만 코어OS에서 #cloud-config 파일 설정을 배우는 건 꽤 헷갈린다"라고 밝혔습니다. 설정 자체가 극도로 어렵지는 않지만, 컨테이너 리눅스는 VIM 편집기 같은 리눅스 기능에 대한 탄탄한 이해를 전제로 합니다.
컨테이너 리눅스 실습: 설치 방법
컨테이너 리눅스를 설치하는 방법은 다양합니다. 코어OS 웹사이트에 따르면 공식 지원 플랫폼은 Amazon EC2, DigitalOcean, Microsoft Azure, 베어메탈(bare metal), OpenStack입니다. 오라클 리눅스, CentOS, SUSE와 함께 코어OS는 Azure와 호환되는 몇 안 되는 리눅스 운영체제 중 하나입니다. 또한 활발한 커뮤니티 덕분에 Packet, Rackspace, Brightbox, VirtualBox, VMware 같은 플랫폼도 지원됩니다. 필자가 가장 쉽다고 느꼈던 방법은 ISO 파일을 이용해 VirtualBox에 설치하는 것이었습니다. 아래에서 VirtualBox 사용법을 간단히 안내해 드리겠습니다.
VirtualBox 설정하기
VirtualBox를 열면 가상머신 이름, 운영체제 종류, 버전을 입력하라는 창이 나타납니다. 필자는 이름을 간단히 CoreOS로 정했습니다. 종류는 Linux를, 버전은 Linux 2.6/3.x/4.x (64-bit)를 선택한 뒤 '다음'을 클릭합니다.
다음으로 RAM을 할당해야 합니다. 코어OS는 최소 1024MB의 RAM을 권장합니다.
RAM을 선택한 후에는 가상 하드디스크를 추가해야 합니다. '지금 가상 하드디스크 만들기(Create a virtual hard disk now)' 옵션을 선택하세요.
다음 화면에서는 하드디스크 파일 유형을 묻습니다. VDI(VirtualBox Disk Image)를 선택합니다.
그다음에는 스토리지 공간을 설정합니다. 동적 할당(Dynamically allocated) 하드디스크 파일을 사용할 것을 권장합니다.
이제 파일 위치와 크기를 지정합니다. 필자는 이름을 기본값인 CoreOS로 두고, 파일 크기는 8GB로 설정했습니다.
CoreOS 가상머신 설정이 끝났다면 초록색 '시작(Start)' 버튼을 클릭합니다.
시작 버튼을 누르면 시작 디스크(start-up disk)를 선택해야 합니다. CoreOS ISO 파일이 있는 폴더로 이동한 뒤 계속 진행하세요.
컨테이너 리눅스 설정하기
CoreOS ISO를 시작하면 컨테이너 리눅스가 로드되기 시작합니다. 잠시 후 CoreOS 버전 정보와 함께 다음과 같은 명령줄이 표시됩니다:
core@localhost
다음 명령어를 입력합니다:
sudo openssl passwd -1 > cloud-config-file
명령줄에 config 파일을 열 수 없다는 경고가 표시됩니다. 원하는 비밀번호를 입력하고 계속 진행합니다. 다음으로 아래 명령어를 입력합니다:
cat cloud-config-file
긴 문자열이 반환되면서 새로운 cloud-config 파일이 생성됩니다. 이제 vi 편집기로 cloud-config 파일을 엽니다:
vi cloud-config-file
편집 가능한 cloud-config 파일이 로드됩니다. 코어OS는 고급 cloud-config 예제 파일도 함께 제공합니다:
필자의 설정 파일은 다음과 같았습니다:
#cloud-config
users: moe
passwd: [SSL password]
groups:
- sudo
- docker
다음 명령어로 cloud-config 파일을 확인할 수 있습니다:
cat cloud-config-file
설정 파일 내용이 반환됩니다. 문제가 없다면 코어OS 설치를 진행합니다:
sudo coreos-install -d /dev/sda -C stable -c cloud-config-file
CoreOS가 다운로드되고, 기록되고, 검증되고 있다는 메시지가 표시됩니다. 완료되면 "Success! CoreOS [version] is installed on /dev/sda."라는 메시지를 확인할 수 있습니다.
CoreOS 가상머신을 종료한 뒤 다시 시작합니다. 재시작할 때는 반드시 CoreOS ISO를 마운트 해제(unmount)하세요. 그렇지 않으면 라이브 CD가 다시 실행됩니다.
CoreOS가 로드되면 명령줄에 로그인 프롬프트가 나타납니다:
localhost login:
사용자 이름과 비밀번호를 입력하면 "Container Linux by CoreOS [version]" 메시지와 함께 새로운 명령줄이 열립니다.
컨테이너 리눅스 실습: 다음 단계
컨테이너 리눅스 설치가 완료되었다면 이제 컨테이너와 클러스터를 구성할 차례입니다. 코어OS 공식 문서에는 훌륭한 퀵스타트 가이드가 마련되어 있습니다. etcd를 활용한 서비스 디스커버리 정보와 도커를 이용한 컨테이너 관리 섹션도 참고할 수 있습니다. 필자는 "Hello World" 도커 풀(pull) 같은 간단한 테스트를 진행했고, 미디어 서버 애호가답게 Plex 도커 이미지도 설치해 보았습니다. 마지막으로 클러스터 관리를 위해 fleet도 설정했습니다.
가장 먼저 해야 할 일은 컨테이너 리눅스의 핵심 구성 요소를 설정하는 것입니다:
- etcd
- Docker
- Fleet
이 세 가지 기반을 설정해 두면 서비스 디스커버리, 클러스터 관리, 컨테이너 구성을 바로 시작할 준비가 됩니다. 이후 앱을 컨테이너화하고, 안전한 도커 컨테이너 안에서 데스크톱 앱을 테스트할 수도 있습니다.
컨테이너 리눅스 실습: 총평
필자는 컨테이너를 자주 사용하는 편은 아니지만, 컨테이너 리눅스는 배포 과정을 크게 단순화해 주었습니다. 샘플 설정 파일이 포함된 문서도 훌륭합니다. 초보자라면 비공식 설치 영상 튜토리얼들이 코어OS 설치를 한결 수월하게 만들어 줄 것입니다. 코어OS가 컨테이너 리눅스가 가볍다고 주장해서 처음에는 의심스러웠지만, 실제로 가상머신에서 구동해 보니 자원 소모가 상당히 낮았습니다. 정말 가벼운지 확인하고자 노후화된 HP 노트북을 사용했음에도 아무런 문제가 없었습니다.
다만 초기 설치 과정의 일부 단계는 초보자에게 다소 불친절합니다. 컨테이너 리눅스를 설치하고 설정하려면 탄탄한 리눅스 활용 능력이 필요합니다. 참고로 필자는 유료 프리미엄 기능인 CoreUpdate 대시보드는 사용해 보지 못했습니다. 명령줄 사용에는 전혀 문제가 없지만, 모니터링을 위한 그래픽 환경이 있다면 더욱 좋겠다는 생각이 들었습니다.
컨테이너 리눅스의 가장 큰 수혜자는 시스템 관리자와 데이터베이스 관리자입니다. 하지만 홈 서버 용도로도 클러스터 환경을 구축하는 간편하고 가벼운 수단이 될 수 있습니다. 게다가 컨테이너 리눅스는 단 한 대의 머신으로도 클러스터를 구성할 수 있습니다. 컨테이너 입문용으로도 훌륭한데, 도커와 컨테이너에 대해 배우고 싶다면 컨테이너 리눅스는 가상머신에서 원활하게 구동되며 시작에 필요한 모든 자원을 제공합니다.
컨테이너 입문자는 물론, 숙련된 DevOps 엔지니어, 시스템 관리자, 데이터베이스 관리자에게도 탁월한 즉시 사용 가능한(out-of-the-box) 솔루션입니다. 결국 코어OS의 컨테이너 리눅스는 확장 가능하고 효율적인 컨테이너화 환경을 구축하는 간결한 방법입니다.
이미 코어OS를 사용하고 계신가요? 사용할 계획이 있으신가요? 리눅스에서 어떻게 컨테이너를 활용하고 있는지 댓글로 알려주세요!