1. 가상화와 컨테이너
1) 전통적인 배포
- 물리서버 기반 애플리케이션 실행
2) 가상화된 배포
- 단일 물리 서버의 CPU에서 여러 가상 시스템(VM) 실행
3) 컨테이너 배포
- VM과 유사, 격리 속성을 완화하여 애플리케이션 간에 운영체제(OS) 공유
2. 컨테이너의 장점
1) 기민한 애플리케이션 생성과 배포
- VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적
2) 지속적인 개발, 통합 및 배포
- 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고 이미지 불변성 덕분에 빠르게 수비게 롤백할 수 있음
3) 개발과 운영의 관심사 분리
- 배포시점이 아닌 build/release 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에 애플리케이션이 infra structure에서 결합도가 낮아짐
4) 가시성
- OS 수준의 정보와 메트릭에 머물지 않고 애플리케이션의 헬스와 그 밖의 시그널을 볼 수 있음
5) 개발, 테스팅 및 운영 환경에 걸친 일관성
- 랩탑에서도 클라우드에서와 동일하게 구동됨
6) 클라우드 및 OS 배포판 간 이식성
Ubuntu, RHEL, CoreOS, on-prem, Google Dubernetes Engine 및 다른 어디에서든 구동됨
7) 애플리케이션 중심 관리
- 가상 하드웨어의 OS에서 애플리케이션을 구동하는 수준에서 OS의 논리적인 자원을 사용하여 애플리케이션을 구동하는 수준으로 추상화 수준이 높아짐
8) 느슨한 결합, 분산, 유연하며 자유로운 마이크로 서비스
- 애플리케이션은 단일 목적의 멋니에서 모놀리식 스택으로 구동되지 않고 보다 작고 독립적인 단위로 쪼개져서 동적으로 배포되고 관리될 수 있음
9) 자원 격리
- 애플리케이션 성능을 예측할 수 있음
10) 자원 사용량
- 고효율 고집적
3. 컨테이너 오케스트레이션(Orchectration)
- 일반적으로 애플리케이션은 의도에 따라 애플리케이션이 실행되게 하기 위해 네트워킹 수준에서 정리가 필요한 개별적으로 컨테이너화된 구성요소(주로 마이크로 서비스)로 구성
- 컨테이너 배포 관리는 컨테이너 오케스트레이션
- 목적은 여러 컨테이너의 배포 프로세스를 최적화
- 애플리케이션은 더 이상 하나의 통일체가 아닌 특정 애플리케이션이 설계 의도대로 기능하도록 함께 작동해야 하는 수십 또는 수백개의 느슨하게 결합되고 컨테화된 요소로 구성
- Apache Mesos, Google Kubernetes, Docker Swarm 등의 플랫폼을든 각자 컨테이너 관리를 위한 자체적인 특별한 방식 보유
📝 Apache Mesos
- 수만대의 물리적 시스템으로 확장할 수 있도록 설계되어 있음
- Hadoop, MPI, Hypertable, Spark 같은 응용프로그램을 동적 클러스터 환경에서 리소스 공유와 분리를 통해 자원 최적화 가능
- Docker 컨테이너를 적극적으로 지원함
📝 Docker Swarm
- 여러 개의 Docker 호스트를 함께 클러스터링하여 단일 가상 Docker 호스트를 생성
- 호스트 OS에 Agent만 설치하면 간단하게 작동하고 설정이 쉬움
- Docker 명령어와 Compose를 그대로 사용
4. 컨테이너 오케스트레이션 기능
- 컨테이너형 애플리케이션의 배포
- 컨테이너 그룹에 대한 로드 밸런싱
- 스케일링/오토스케일링
- 컨테이너 장애 복구
- 컨테이너 그룹간 격리/연결
- 외부로 서비스 노출
- 서비스 디스커버리
- 로그 수집 집중화/자동화
- 모니터링 집중화/자동화
5. 컨테이너와 도커
- 도커는 BSD와 솔라리스(Solaris)와 같은 유닉스(Unix) 운영체제에서 수십년 간 사용되었던 개념이 현대적으로 재탄생된 최신 개념
- 각애플리케이션과 종속물이 운영체제 리소스의 분리된 세그먼트를 사용하는 방식
- 컨테이너 런타임(container runtime)은 호스트 운영체제가 제공하는 저수준 컨테이너 서비스를 사용해 컨테이너를 셋업하거나 없앰
도커 컨테이너 특징
1) '분리'와 '조절' 기능
- 도컨 컨테이너는 앱과 기반이 되는 시스템으로부터 계속 분리
- 동시에 더 쉽게 분리된 특정 애플리케이션의 CPU와 GPU, 메모리, I/O, 네트워킹 등 시스템 리소스 사용 방식을 규정
2) 이식성 제공
- 컨테이너 런타임 환경을 지원하는 모든 장치에서 실행
- 애플리케이션을 호소트 운영체제와 연결할 필요 없음
3) 결합성(Composability) 제공
- 대부분 비즈니스 애플리케이션은 웹 서버, 데이터베이스, 인-메모리 캐시 등 하나의 스택으로 구성되는 여러 별개의 구성 요소로 구성
- 컨테이너는 이런 조각들을 쉽게 변경할 수 있는 부품으로 구성된 기능 유닛으로 결합
- 애플리케이션 디자인의 마이크로서비스(Microservice) 모델
4) 오케스트레이션과 스케일링이 쉬움
- 컨테이너는 가볍고 오버헤드가 거의 없음
- 여러 시스템에서의 애플리케이션 스케일링, 수요 증가와 리소스 보존을 위한 서비스 증가 및 다운에도 컨테이너 사용
5) 가상머신이 아닌 도커 컨테이너
- 가상머신은 운영체제에서 자신의 인스턴스에서 실행되기 때문에 고수준의 프로세스 분리 기능을 제공
- 컨테이너는 호스트 운영체제에서 통제된 영역을 사용
- 많은 애플리케이션이 철저히 관리되는 방식으로 동일한 운영체제 커널 공유
6) 변경 불가능, 비저장성
- 컨테이너는 내용을 설명하는 이미지로부터 부팅 및 실행됨
- 이미지는 기본적으로 변경이 불가능함(생성되면 변경되지 않음)
7) 마이크로 서비스가 아닌 도커 컨테이너
- 컨테이너를 사용하면 더 쉽게 마이크로 서비스 애플리케이션을 구현할 수 있는 것
- 특정 애플리케이션을 가져와 컨테이너에 연결하면 자동으로 마이크로 서비스가 생성되는 것이 아님
- 애플리케이션을 마이크로 서비스로 변환하는 프로세스의 일부로 컨테이너화 할 수 있지만 이는 수 많은 방법 중 하나