최근 IT의 핫 이슈중의 하나인 Docker에 대한 이야기를 해보겠습니다.
Docker란 무엇일까? 도커 < 컨테이너
*컨테이너는 예전부터 있던 개념이었으며, 기존의 컨테이너는 각각의 OS 내에서 작동하는 경량화된 VM의 구현이라는 목적이였으나 요즘 말하는 가성비가 매우 낮아 보편화되어 사용하기 어려운 기술이였습니다.
즉, 도커란? LXC(리눅스 컨테이너스)라는 커널 컨테이너 기술을 이용하여 만든 컨테이너 기술 중 하나 입니다.
ex)컨테이너의 종류: LXC, Solaris Zones, BSD Jails .
Docker는 개발자들이 다양한 OS에서 작동하는 동일한 개발환경을 구현하는 것을 목적으로 만들어졌습니다. Docker는 컨테이너 저장 및 이미지 관리를위한 보다 정교한 솔루션을 제공하며 사용하기도 용이하여, 2013에 처음 나왔지만 현재 대부분의 IT환경에서 알게 모르게 많이 도입되고 있습니다. Docker는 Windows에도 포팅이 가능하며 AWS, Azure, Google 및 IBM의 모든 주요 클라우드 공급 업체가 이제 Docker 를 기본으로 지원합니다.
Docker에는 이미지라는 개념이 있으며, 소프트웨어 실행에 필요한 모든 파일 Code, Runtime실행파일, System Tool, System Library 등을 포함하여 하나의 파일로 만들어 진것을 이미지라고 합니다.
ex)
Apache: 컴파일된 바이너리파일 + OS의 APR Library 파일 + Openssl 파일 등을 포함하여 이미지를 생성
Tomcat: Tomcat 바이너리 파일 + JRE를 포함하여 이미지를 생성
Docker에서 이 이미지를 프로세스로 실행한 상태가 Container입니다.
이를 통해서 하나의 호스트 내부에 독립된 VM 같은 실행환경인 컨테이너를 만들수가 있습니다.
컨테이너는 기본적으로 172로 시작하는 내부 IP를 할당 받고 포트도 독립적으로 사용할 수 있습니다.
컨테이너는 신기술이 아니다.
도커는 BSD와 솔라리스(Solaris)와 같은 유닉스(Unix) 운영체제에서 수십 년 간 사용되었던 개념이 현대적으로 재탄생된 최신 개념이다. 유닉스에서 사용되었던 개념이란 특정 프로세스를 운영체제의 나머지와 일정 수준 분리해 실행시킬 수 있다는 개념이다.
가상 머신은 운영체제 인스턴스 하나를 구획화(Compartmentalizing)가 필요한 애플리케이션 각각에 할당하는 방식으로 '분리(Isolation)'를 제공한다. 거의 완전하게 분리시킬 수 있는 방법이지만, 상당한 비용이 수반된다. 각 운영 인스턴스가 앱 자체에 더 효과적으로 할당할 수 있는 메모리와 프로세싱 파워를 소비하기 때문이다.
그런데 컨테이너는 접근법이 다르다. 각 애플리케이션과 종속물이 운영체제 리소스의 분리된 세그먼트를 사용하는 방식이다. (가장 많이 사용되는 도커를 중심으로) 컨테이너 런타임(container runtime)은 호스트 운영체제가 제공하는 저수준 컨테이너 서비스를 사용해 컨테이너를 셋업하거나 없앤다.
리눅스 컨테이너를 이해하기 위한 출발점은 cgroups(control groups) 및 네임스페이스(namespaces)이다. 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능들이다. IBM이 최초 개발한 리눅스 네임스페이스는 시스템 리소스들을 묶어, 프로세스에 전용 할당하는 방식으로 제공한다.
구글이 최초 개발한 리눅스 cgroups는 분리와 CPU, 메모리 등 프로세스 그룹의 시스템 리소스 사용량을 관리한다. 예를 들어, 과학용 컴퓨팅 애플리케이션 같이 많은 CPU 사이클과 메모리를 소비하는 애플리케이션을 운영하는 경우, 애플리케이션을 cgroup에 집어넣어 CPU와 메모리 사용량을 제한할 수 있다.
네임스페이스는 프로세스 하나의 리소스 분리를 처리하고, cgroups는 프로세스 그룹의 리소스를 관리한다. cgroups와 네임스페이스가 결합되면서 리눅스 컨테이너(Linux Containers, LXC)라는 컨테이너 기술이 탄생했다.
Docker 와 가상화
|
가상 서버 |
컨테이너 |
가상화 |
서버 가상화 VM 간 격리 |
호스트 자원 공유 네임 스페이스를 통해 앱 간 격리 |
이미지화 |
OS와 가상 디바이스 등도 포함되어 사이즈가 큼 |
필요한 앱과 bin/lib만 포함되어 사이즈가 매우 작음 |
플랫폼간 이식성 |
동일 하이퍼바이저 간 only |
이기종 물리, 가상, 클라우드 간 |
이기종 OS 사용 |
가능 |
불가능 (Host OS와 동일한 OS 계열이어야 됨) |
부팅시간 |
수십초~수분 |
수초~수십초 |
개발 환경 구축 |
수작업으로 앱 설치 및 삭제 필요 보통 하루 이상 소요 |
환경 구축의 수작업 요소 제거 수 분~수 십분 소요 |
직접도 |
물리 서버당 4~6 VM |
물리 서버당 20~30 컨테이너 |
앱 확장성 |
Low (수작업 요소 많음) |
High (완전 자동화 가능) |
OS Cost |
VM 당 |
Host 당 |
베어메탈 대비 성능 |
50~80% |
98% |
자원 할당 |
CPU, Memory, GPU, 네트워크, Storage 등 |
CPU, Memory, GPU, 네트워크, Storage 등 |
'IT이야기' 카테고리의 다른 글
CI/CD (0) | 2020.02.23 |
---|---|
갤럭시 기어 S3 프론티어 통신사 변경하기(s3 프론티어 번호변경) (0) | 2020.02.04 |
인터넷의 역사 (0) | 2018.07.07 |
오픈소스 클라우드 특징 (0) | 2018.07.07 |
AM과 FM의 차이 (0) | 2018.07.06 |