본문 바로가기

Archive/독학기록

💚 [가상화] 컨테이너란? (feat. Docker, LXC)

728x90
반응형

Containers

 

개발자의 오랜 골칫거리가 하나 있다. 새로 만든 애플리케이션을 실제 작업한 노트북에서 테스트 환경으로, 다시 운영 환경으로 옮길 때마다 온갖 이상한 오류와 만나는 것이다. 환경마다 네트워크 기술과 보안 정책, 스토리지가 제각각이어서 그렇다. 예를 들어 로컬 설정이나 함수 라이브러리가 포함될 수 있다.

 

개발 환경의 설정이 테스트 환경 및 운영 환경의 설정과 다른 경우가 많은 것이다. 그래서 '소프트웨어를 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 이동하면서도 안정적으로 실행하는 방법이 없을까?' 라는 고민이 커졌고, 그 대답이 바로 컨테이너이다.

 

개념은 간단하다. 애플리케이션과 그 실행에 필요한 라이브러리, 바이너리, 구성 파일 등을 패키지로 묶어 배포하는 것이다. 이렇게 하면 노트북-테스트환경-실제 운영환경으로 바뀌어도 실행에 필요한 파일이 함께 따라다니므로 오류를 최소화할 수 있다. (Collection과 같은 개념)

 

OS를 제외한 애플리케이션에 필요한 모든 파일을 패키징한다는 점에서

OS 위에서 구현된 가상화, 즉, OS 레벨 가상화라고 부르기도 한다. 

 

(출처 https://www.itworld.co.kr/news/103469)

 

 

 

https://wiki.aquasec.com/download/attachments/2854029/docker-birthday-3-intro-to-docker-slides-18-638.jpg?version=1&modificationDate=1515522843003&api=v2

 

Virtual Machine Container
애플리케이션과 완전한 OS 시스템을 포함 애플리케이션과 부분적으로 필요한 OS 시스템 컴포넌트를 포함(ex. 라이브러리, 바이너리)
논리적 플랫폼인 하이퍼바이저가 가상화를 제공 컨테이너 엔진 OS가 자체 가상화를 제공
다수의 VM이 각각의 격리된 물리 서버에서 실행됨 하나의 OS에서 여러 컨테이너가 서로 격리되어 실행됨 

 

일반적인 VM과는 달리 컨테이너에는 운영체제나 커널이 포함 되어 있지 않다. 따라서 가상화된 OS가 아니다. 이러한 이유로 컨테이너는 기존 가상 머신보다 상당히 가볍다. 따라서 컨테이너는 서버 1대에서 실행할 수 있는 개수가 VM보다 최대 10배 이상 많고, OS 부팅이 필요 없어 불과 수초만에 서비스를 시작할 수 있다.

 

이러한 가상 시스템은 실제 VM이 아니기 때문에 이러한 맥락에서 애플리케이션 가상화(OS레벨 가상화)라고도 한다.

 

애플리케이션 컨테이너는 서로 다른 사용자 계정에서 프로세스로 격리되어 실행된다. 컨테이너가 동일한 시스템에서 실행될 경우 컨테이너 데몬(LXD)이 사용된다. LXD는 리눅스 컨테이너(LXC)를 기반으로 한 기술이다.

 


 

LXC(LinuX Containers)

 

LXC(LinuX Containers)는 단일 리눅스 시스템에 동작하고 있는 프로세스를 격리시켜 각 프로세스마다 독자적인 리눅스 시스템 환경을 구축하는 것을 의미한다. 일반적으로 가상화는 Hypervisor라는 논리적 플랫폼을 이용해 하나의 Host OS 위에 여러 Guest OS를 구동하는 기술이다. 이와 달리 LXC는 하나의 리눅스 시스템에서 프로세스들을 격리시켜 독자적인 시스템환경을 구축한다. 즉, 리눅스 컨테이너에서 가상화된 프로세스들은 모두 리눅스 시스템을 호환해야 한다.

 

(출처: 엑스테일즈)

 

 

 

리눅스 컨테이너의 장점

 

1. 전체 OS를 설치하는 것이 아니기 때문에 특정 애플리케이션 환경만 빠르고 간편하게 구축할 수 있다.

2. 프로세스를 격리하기 때문에 CPU나 메모리는 딱 프로세스가 필요한 만큼만 자원을 사용하고 성능 손실이 거의 없다.

3. 리눅스 컨테이너는 상대적으로 가볍다. Hypervisor를 이용해 가상화를 하지 않기 때문에 오버헤드가 적게 발생한다.


(출처: 엑스테일즈)

 

더불어 컨테이너의 뛰어난 확장성은 사용자 애플리케이션에 대한 용량을 매우 적절하게 조정할 수 있다. Apache Mesos나 Google Kubernetes와 같은 오케스트레이션 시스템 덕분에 대형 컨테이너 설정도 문제 없이 관리할 수 있다.

 

 

 

이미지(image)와 컨테이너

 

파일 시스템의 이미지가 각 컨테이너의 기초를 형성한다. 이미지란 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로, 상태값을 가지지 않고 변하지 않는다.

 

우리는 이미 만들어진 이미지를 사용할지, 아니면 직접 만들지를 선택할 수 있다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고, 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.

 

Ubuntu 이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있고, MySQL이미지는 Debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보를 가지고 있다. 말 그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다.

 

새로운 서버가 추가되면 미리 만들어놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다. 한 서버에 여러개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 문제없다.

 

(출처: https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html)

 

 

 

 


Docker 

 

하나의 서버에 여러개의 애플리케이션을 설치하는 것도 문제인데, 서로 사용하는 라이브러리의 버전이 다르거나 동일한 포트를 사용하는 경우 설치가 굉장히 까다로웠다. 차라리 서로 다른 서버에 설치하는게 나았고 그렇게 조립PC가 늘어나며 자원이 낭비되었다. 시간이 흐르면서 서버 환경은 계속 바뀌는데 CentOS에 익숙해지면 Ubuntu를 써야 하는 일이 생기고, AWS에 익숙해지면 Azure를 써야 하는 일이 생긴다.

 

DevOps의 등장으로 개발주기가 짧아지면서 배포는 더 자주 이루어지고 마이크로서비스 아키텍처가 유행하면서 애플리케이션은 더 잘게 쪼개어져 관리가 더 복잡해졌다. 새로운 툴은 계속 나오고, 클라우드의 발전으로 설치해야 할 서버가 수백, 수천대에 이르는 상황에서 등장한 것이 바로 도커(Docker)이며 서버관리 방식이 완전히 바뀌게 되었다.

 

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 컨테이너라 하면 배에 싣는 화물 수송용 박스를 생각할 수 있는데, 각각의 컨테이너 안에는 옷, 신발, 전자제품, 술과 같은 다양한 화물을 넣을 수 있고 규격화되어 컨테이너선이나 트레일러 등 다양한 운송수단으로 쉽게 옮길 수 있다. 

 

서버에서 이야기하는 컨테이너도 비슷하다. 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 백엔드 애플리케이션, DB 서버, 메시지 큐 등 어떤 애플리케이션이라도 컨테이너로 추상화할 수 있고, 조립PC, AWS, Azure, Google Cloud 등 어디에서든 실행할 수 있다. 

 

컨테이너를 가장 잘 사용하고 있는 기업은 Google이며, 구글은 모든 서비스들이 컨테이너로 동작하고 매주 20억개가 넘는 컨테이너를 구동한다고 한다.

 

(출처 https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html) > 매우매우 잘 정리되어있음!!

 

 

 

 

Docker Engine

 

도커는 거의 모든 운영체제에서 실행할 수 있는 가상화된 컨테이너 기반을 형성한다. 따라서 개발중이든 SaaS 클러스터를 확장할 때든 애플리케이션을 이식할 수 있고, 복잡하지 않다. 도커 엔진(Docker Engine)은 컨테이너 가상화의 주요 구성 요소이다. 소프트웨어는 호스트 리소스와 실행중인 컨테이너 간의 인터페이스를 제공한다. 도커 엔진이 설치된 모든 시스템은 도커 컨테이너를 사용할 수 있다.

 

원래 도커는 리눅스 시스템에서 사용하도록 설계되었지만, VMware 또는 Hyper-V를 통한 가상화에서는 이 엔진이 Windows 또는 MacOS 장치에서도 작동한다. 따라서 도커는 거의 모든 일반적인 시나리오에서 사용될 수 있다.

 

(출처: https://academy.hackthebox.com/)

728x90