가상머신 VS 컨테이너

우리가 기본적으로 아는 가상머신은, 하나의 호스트OS 위에 가상머신 (가상 하드웨어) 를 만들고, 거기에 운영체제를 설치하고 사용하는 것이다. 즉 각 가상머신머다 커널이 다르다.

가상머신 방식

컨테이너 기술은, 가상머신과 다르게 따로 가상 하드웨어를 만들지 않는다. (따라서 BIOS에서 설정하는 CPU 가상화 설정도 필요 없다!) 아래와 같이 하나의 호스트OS 위에 컨테이너 엔진을 설치하고, 그 위에 컨테이너를 만드는 것이다.

 

간단하게 말하면 호스트OS(물리적 서버) 위에 논리적인 구획(컨테이너) 를 만들고 어플리케이션을 작동하기 위해 필요한 라이브러리나 애플리케이션을 하나로 모아 컨테이너 안에 집어넣어 마치 컨테이너 하나가 별도의 서버인 것처럼 사용할 수 있게 하는 것이다. 

 

여기서 컨테이너는, 마치 가상머신처럼 운영체제도 있는것처럼 보이고, 원하는 프로그램도 깔려있고, IP도 있다. 가상머신으로 착각할 만 하다. 하나의 호스트OS에 여러개의 컨테이너를 올릴 수 있고, 해당 호스트OS의 자원을 나눠서 사용하게 된다. 즉 컨테이너 자체에는 OS가 없고, 호스트OS의 커널을 컨테이너가 공유받는다.

컨테이너 방식

가상머신과 컨테이너는 사용자가 봤을 때 기능상으로는 비슷하지만, 각 기술들은 서로 지향하는 바가 다르다.

- 컨테이너 기술은 애플리케이션의 실행환경을 모아서 이식성을 높이고 확장성이 좋은 환경에서 작동하는것을 지향한다.
- 가상화 기술은 서로 다른 환경을 어떻게 효율적으로 에뮬레이트할지를 지향한다.

 

각 기술마다 장단점이 있고 사용하는 적절한 용도가 있지만, 단순히 성능적으로 봤을 때는 가상화보다 컨테이너가 overhead(어떤 처리를 위해 추가되는 간접적인 처리시간) 가 적어 가볍고 고속으로 작동한다.


그래서, 도커란 무엇인가?

도커는 애플리케이션 실행에 필요한 환경을 이미지로써 만들어 모아두고, 이미지를 사용하여 다양한 환경에서 애플리케이션 실행환경을 구축/운용하는 컨테이너를 만들어 사용하는 오픈소스 플랫폼이다. 2013년 3월 오픈소스 프로젝트로 시작되었고 어떤제품보다도 파급력이 컸다.

 

컨테이너는 생각보다 오래된 기술이다. FreeBSD 라는 오픈소스 유닉스의 FreeBSD JAIL, 선마이크로시스템즈(현 오라클 합병됨)의 상용 유닉스 Solaris의 Containers (Zone), 그리고 리눅스에서는 리눅스 컨테이너 (Linux Container ; LXC) 라는 기술로써 컨테이너 기술이 있었다. 또한 구글은 직접 컨테이너 기술을 만들어 사용했다. (lmctfy ; Let Me Contain That For You)

 

도커는 리눅스 커널에 포함된 LXC 기능을 사용하여 컨테이너 기술을 사용한다. LXC가 제대로 사용되지 못한 이유는 사용 및 배우는 것이 복잡하고 어려웠기 때문. (LXC의 cgroups와 namespace 등이 사용하기 쉽지 않았다.) 도커를 통해 애플리케이션이 LXC를 사용하고, 사용자는 쉬운 도커 명령어를 사용하여 컨테이너 기술을 쓸 수 있도록 했다.


도커의 장점

1. 빠르고 편한 어플리케이션 설치
- 우분투는 apt-get을 사용하고, 레드햇은 yum install 을 사용하는 등 os 별로 설치 명령이 모두 다르다.
- 도커는 항상 동일한 명령을 사용하며 훨씬 빠르다.

2. 관리의 용이함
- 사내 문서 등으로 서버 변동 내역을 기록하는 것은 시간과 인력을 많이 사용하는 일이다.
- 도커는 이러한 기록을 코드화하여 일원화하므로 따로 관리를 할 필요가 없다.
- 또한 버전별로 컨테이너를 만들수 있으므로 버전관리 및 호환성 유지가 용이하다.
- 담당자가 세팅한 설정을 스크립트화 하여 자동화할 수 있다.

3. 효율적이며 자유로움
- 동일한 컨테이너 여러대를 한번에 배포할 수 있다.
- 필요한 프로그램들을 도커허브에서 이미지의 형태로 제공받을 수 있다. (github과 유사한 방식, open share)
- 해당 이미지를 받고 내가 원하는대로 수정 및 설정하여 다시 또 배포할 수 있다.

- 서버의 견고함을 보장하면서도 동적으로 바꿀 수 있는 유연함을 가진다.

- 수평적 확장(Scale out) 이 자유롭다.

 

# 참고 : Scale out과 Scale up

4. 여러가지 변경점이나 예외사항들을 배제하기 쉬움
- 도커는 통일된 환경에서 동일한 이미지를 가지고 어플리케이션을 가동한다.
- 따라서 몇년동안 운영한 동일한 서비스를 중간에 더 추가하거나, 다른 하드웨어끼리의 차이 등에 있어서 생기는 문제 자체가 발생하지 않는다.

5. 높은 이식성
- 환경에 상관없이 컨테이너를 통해 애플리케이션을 동일한 환경에서 가동 가능.
- 온프레미스<->클라우드, 클라우드<->클라우드 등의 마이그레이션을 쉽고 빠르게 수행할 수 있다. 예를들어, 어떤 퍼블릭 클라우드 서비스의 비용이 저렴해지면 그쪽으로 쉽게 넘어갈 수 있다.

6. 개발 환경에 최적화된 기능
- 환경에 따른 차이가 없어 개발,테스트,서비스 환경을 신경쓰지 않고 프로젝트 관리가 가능하다.
- 개발을 위한 인프라 환경설정, OS 환경설정, 미들웨어, 라이브러리 설정 등을 빠르고 편하게 할 수 있다.


도커 사용을 위한 버전과 플랫폼

* 도커 CE가 지원하는 플랫폼
- 서버OS용 : 우분투, 데비안, CentOS, 페도라, 레드햇 등
- 퍼블릭클라우드용 : azure, AWS
- 클라이언트OS용 : 윈10, 맥OS 

- 기타 : Synology NAS 등

 

# 참고 : x86이 아닌 다른 아키텍쳐에서 사용

IOT 디바이스같은 arm 아키텍쳐에서 작동하는 디바이스에서는 Docker Community Edition (ARM)을 사용할 수 있다. 우분투와 데비안을 지원한다. https://docs.docker.com/install 참고할 것.

* 도커 에디션

- 무료버전 (CE) : Community Edition이다. 로컬사용 및 상용 지원이 불필요한 환경에서 애플리케이션을 실행할 때 적합하다.
- 유료버전 (EE) : Enterprise Edition 이다.  상용 이용에 적합한 버전. EE는 BASIC, STANDARD, ADVANCED 3종류가 있다.
    - BASIC : 도커사의 지원 및 도커 스토어에서 인증이 끝난 컨테이너, 인증이 완료된 플러그인을 제공한다.
    - STANDARD : 베이직 내용에 더해, LDAP, Active Directory와 통합 가능한 도커 데이터센터를 이용할 수 있음.
    - ADVANCED : 보안 기능을 추가로 제공한다.

* 도커의 Release history

https://www.docker.com/blog/docker-enterprise-edition/

- 에디션에 따라 정기적으로 릴리즈가 있다.
- 버전 번호는 연도2자리, 월2자리로 나타난다. 2017년 3월에 릴리즈된 버전은 17.03이 된다.
- 도커CE는 매월 보안 지원과 버그 수정 지원인 EDGE의 릴리즈, 4분기별로 안정판인 STABLE이 릴리즈된다.
- 도커EE도 CE의 STABLE과 똑같은 시기에 릴리즈된다.


도커의 구성요소

도커는 다음과 같은 컴포넌트로 구성되어 있고, 이러한 컴포턴트들이 조합하여 어플리케이션 실행 환경을 구축한다. 


* Docker engine
- 도커의 핵심 기능. 도커 이미지를 생성, 컨테이너를 기동한다.
- docker 명령과 dockerfile 이미지 생성도 수행한다.

* Docker Registry (이미지 공개 및 공유)
- 컨테이너의 바탕이 되는 도커 이미지를 공개 및 공유하기 위한 레지스트리 기능
- 도커의 공식 레지스트리인 도커허브도 이 Docker registry를 사용한다.

* Docker Compose (여러 컨테이너 통합 관리)
여러 개의 컨테이너 구성 정보를 코드로 정의하고, 명령을 실행함으로써 애플리케이션의 실행환경을 구성하는 컨테이너들을 일원관리하는 툴

* Docker Machine ( 도커 실행 환경 구축)
- 로컬 호스트용인 버추얼박스등을 비롯하여 AWS EC2나 MS AZURE와 같은 클라우드 환경에 Docker 실행 환경을 명령으로 자동 생성하기 위한 툴.

* Docker Swarm (클러스터 관리)
- 여러 도커 호스트를 클러스터화하는 툴
- 클러스터를관리하거나 api를 제공하는 역할은 Manager 가 수행하며, 도커 컨테이너를 실행하는 역할은 node가 담당한다.
- 쿠버네티스와 비슷하지만, 쿠버네티스는 복잡하고 명령어도 많음. 간단하게 사용할 때는 Docker Swarm을 사용할 수 있다.

 

 

 

 

 

 

 

 

 

 

+ Recent posts