한 장 요약
가상화
물리적인 하드웨어(HW) 장치를 논리적인 객체로 추상화 하는 것
- 프로세서(CPU), 메모리(Memory), 스토리지(Storage), 네트워크(Network) 등의 컴퓨팅 자원을 쪼개거나 합쳐서 사용
- 자원을 효율적으로 사용 및 분산처리 가능
가상 머신(VM)
가상화를 통하여 구현되는 복제된 컴퓨팅 환경, 물리적 컴퓨터와 동일한 기능을 제공하는 소프트웨어 컴퓨터
- 가상 머신이 제공하는 환경과 자원에 제한을 받음
- 하나의 물리 자원(컴퓨터) 위에 하나의 환경(OS)만 있는 것을 효율화 ▶ 가상화층 생성 ▶ OS 새로 설치
시스템 가상 머신(하드웨어 가상 머신)
- 완전한 운영체제(OS) 제공
- 물리 컴퓨터 다중화(multiplex), 모든 하드웨어 자원 가상화
게스트 운영 체제 같은 물리 컴퓨터에서 실행되는 각각의 운영 체제를 가지는 여러 개의 가상머신 - 다른 장치가 충돌을 피하기 위해 각 장치에서 실행하기 위한 서버 통합(server consolidation)에서 사용 - 제품 품질의 고립 (QoS 고립)
- 하이퍼바이저(가상 머신 모니터 VMM) ▶ 하드웨어 또는 호스트웨어 체제 위에서 그대로 실행 가능
하이퍼바이저
- 가상화를 제공하는 소프트웨어 계층
- 호스트 컴퓨터에서 다수의 운영 체제를 동시에 실행시키기 위한 논리적 플랫폼
- VMWare, Red Hat(KVM), Paraellels, Oracle Virtualbox 등 다양한 하이퍼바이저 존재 ▶ OpenStack을 설치하기 위해서는 Red Hat의 KVM(Kernel-based Virtual Machine)이 표준
☁ TYPE 1 - 베어메탈 기반 가상화: 하이퍼바이저가 하드웨어를 직접 제어하여 게스트 OS를 올리는 방식
☁ TYPE 2 - 호스트 기반 가상화: 하이퍼바이저가 일반 프로그램과 같이 호스트 운영체제에서 구동
장점
✔ 같은 컴퓨터에서 운영 체제가 서로 독립적 ▶ 멀티부팅 어려움X, 관리 용이, 테스트 환경 적합
✔ 실제 컴퓨터가 제공하는 것과 다른 형태의 명령어 집합 구조(ISA) 제공
단점
✔ 독립적인 플랫폼 생성 시 OS 작업 반복 ▶ 확장성 감소
✔ 자원이 유동적으로 관리되지 않아 비효율적
프로세스 가상 머신
- 응용 프로그램 가상 머신 ex) 자바 가상 머신 (JVM)
- 운영 체제 안에서 일반 응용 프로그램을 돌리고 단일 프로세스를 지원
- 플랫폼 독립성 허용, 기초가 되는 하드웨어나 운영 체제의 상세한 부분을 가져오는 독립 프로그래밍 환경 제공
컨테이너
실행의 독립성을 확보하는 운영체계 수준의 격리 기술 ▶ 개별 소프트웨어의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 다른 환경의 간섭을 막음
- 애플리케이션과 실행에 필요한 라이브러리, 바이너리, 구성 파일 등을 패키지로 묶어서 배포 ▶ 운영 환경이 바뀌어도 실행에 필요한 파일이 같이 존재 ▶ 오류 최소화
- OS 레벨에서 프로세스 격리 ▶ 모듈화된 프로그램 패키지 수행
- 📢 운영체제가 포함되어 있지 않음 ▶ 가벼움
장점
✔ 가상머신보다 가벼움⬆, 리소스 효율성⬆, 이식성⬆, 회전 속도⬆ ▶ 하나의 물리 서버에 더 많은 응용 프로그램을 더 쉽게 구동
Docker
컨테이너의 대표적인 기술
- Docker 컨테이너는 여러 image(하나의 패키지로 묶인 바이너리)들의 레이어로 구성
- 개발한 애플리케이션 실행에 필요한 모든 것이 포함된 Docker 이미지 작성 ▶ Docker 설치 환경에서 모두 작동
Docker Image 애플리케이션 실행에 필요한 파일이 저장된 디렉토리
Base image: 컨테이너의 운영체제 포함 ▶ 호스트의 OS와 다를 수 있음 > 완전한 운영체제 X > 파일 시스템과 바이너리만 포함 > Base image 위에 다수의 이미지가 올라감
- 유니온 파일 시스템: 각각의 레이어 별로 하나의 복사본만 local에 보관 가능
ex) 컨테이너1: a, b, c 레이어 컨테이너2: a, b, d 레이어 ▶ local 또는 repository: a, b, c, d 각각 하나의 복사본만 저장
ex) 위 그림에서 Image2는 Image1과 같은 부모 이미지 공유 + 2개의 레이어를 부가적으로 가짐
Docker 기능
- Build: Docker 이미지 생성
- 애플리케이션 실행에 필요한 프로그램 본체, 라이브러리, 미들웨어, OS, 네트워크 설정 등을 Docker 이미지로 생성
- 하나의 이미지 = 하나의 애플리케이션 ▶ 여러 컨테이너를 조합하여 서비스 구축
- Docker 명령어로 수동 생성 또는 Dockerfile로 설정 파일을 생성하여 자동으로 이미지 생성 ▶ 지속적인 관리를 위해서는 Dockerfile 권장
- Ship: Docker 이미지 공유
- Docker 이미지는 Docker 레지스트리에서 공유 가능
- Base Image에 미들웨어, 라이브러리, 애플리케이션 등을 넣은 Image를 겹쳐 독자적인 Docker Image 생성
- Docker hub에 자유롭게 이미지 공개 가능
- Run: Docker 컨테이너 작동
- Docker Image가 있으면 Docker가 설치된 환경이라면 어디서든 컨테이너 작동 가능
- Docker Image를 가지고 여러 개의 컨테이너 가동 가능