Skip to content

KR_가상화

somaz edited this page Oct 31, 2024 · 12 revisions

1. 가상화란?

가상화는 시스템 내에서 물리적 장치 또는 리소스의 가상 버전을 생성하는 기술이다.

이 프로세스를 통해 물리적 구성 요소를 논리 단위로 추상화할 수 있어 리소스 사용의 유연성과 효율성이 향상된다.

가상화는 하드웨어 플랫폼, 저장 장치, 네트워크 리소스, 운영 체제 등 다양한 시스템 측면에 적용될 수 있다.

RAID와 LVM

RAID 및 LVM과의 비교는 IT 인프라의 더 넓은 범위 내에서 가상화를 상황화하는 데 도움이 된다.

RAID(Redundant Array of Independent Disks): 이 기술은 향상된 중복성과 성능을 위해 하드 드라이브와 같은 여러 물리적 저장 장치를 단일 논리 장치로 결합한다. 일반적으로 Windows 시스템과 연관되어 있지만 RAID는 Windows 시스템에만 국한되지 않으며 다양한 환경에서 구현될 수 있다.

LVM(논리 볼륨 관리자): Linux 시스템에서 주로 사용되는 LVM은 물리적 저장 장치의 공간을 보다 유연하게 할당할 수 있는 저장소 관리 방법이다. 이는 물리적 스토리지에 대한 추상화 계층을 제공하여 디스크의 물리적 레이아웃에 제한을 받지 않고 스토리지 공간의 크기 조정 및 관리를 허용한다.

전 가상화 vs. 반 가상화

하드웨어 에뮬레이션 수준과 게스트 OS와 하이퍼바이저 간의 상호 작용에 중점을 둔다.

전 가상화:
  • 하드웨어 에뮬레이션: 전체 가상화에는 각 가상 머신의 하드웨어를 완전히 에뮬레이션하는 작업이 포함된다. 게스트 OS는 시뮬레이션된 하드웨어 환경과 상호 작용하므로 수정이 필요하지 않다.
  • 게스트 OS: 마치 실제 하드웨어에서 실행되는 것처럼 수정되지 않은 운영 체제를 실행할 수 있다.
  • 하이퍼바이저 역할: 하이퍼바이저는 하드웨어를 관리하고 추상화하여 각 VM에 가상 하드웨어 계층을 제공한다.
반가상화:
  • 다이렉트 하이퍼바이저 인터페이스: 반가상화에서 게스트 OS는 자신이 가상화된 환경에서 실행되고 있음을 인식하고 하이퍼바이저와 직접 통신한다.
  • 게스트 OS: 더 나은 성능을 위해 하이퍼바이저 API와 상호 작용할 수 있도록 게스트 OS를 수정해야 한다.
  • 성능: 일반적으로 오버헤드가 낮기 때문에 특히 I/O 작업에서 전체 가상화보다 더 나은 성능을 제공한다.

호스트 가상화 vs. 컨테이너 가상화 vs. 하이퍼바이저 가상화

가상화 계층이 위치하는 위치(OS 상단, OS 공유 또는 하드웨어 직접)와 운영 효율성 및 사용 사례에 따라 차별화된다.

호스트 가상화(유형 2 하이퍼바이저):
  • 계층화: 호스트 운영 체제 위에서 실행됩니다. 하이퍼바이저는 OS에 설치된 소프트웨어 계층이다.
  • 사용 사례: 일반적으로 개발, 테스트 및 교육 목적으로 사용된다.
  • : VMware 워크스테이션, Oracle VirtualBox.
컨테이너 가상화:
  • OS 공유: 컨테이너는 호스트 OS 커널을 공유하지만 애플리케이션과 해당 종속성을 사용자 공간에 격리한다.
  • 리소스 효율성: 전체 OS를 에뮬레이션할 필요가 없으므로 VM보다 리소스 효율성이 더 높다.
  • : Docker, Kubernetes.
하이퍼바이저 가상화(유형 1 하이퍼바이저):
  • 다이렉트 하드웨어 인터페이스: 시스템 하드웨어에서 직접 실행되어 하드웨어를 제어하고 게스트 운영 체제를 관리한다.
  • 성능: 일반적으로 호스트 가상화보다 더 나은 성능과 효율성을 제공한다.
  • : VMware ESXi, Microsoft Hyper-V.

Reference


2. Docker & DockerFile & Docker Compose

Docker는 소프트웨어 컨테이너 내에서 애플리케이션을 배포하기 위한 오픈 소스 플랫폼이다. 리눅스의 운영체제 수준 가상화에 대한 추가적인 추상화 및 자동화를 제공한다.

Docker는 리눅스 커널의 리소스 격리 기능(예: cgroups 및 커널 네임스페이스)과 유니온 파일 시스템(OverlayFS와 같은)을 사용하여 단일 리눅스 인스턴스 내에서 독립적인 컨테이너가 실행될 수 있도록 하여 가상 머신을 시작하고 유지하는 오버헤드를 방지한다.

Docker의 주요 특징

  1. 컨테이너화: 애플리케이션과 그 의존성을 컨테이너에 패키징하여 개발, 테스트 및 프로덕션 환경에서 일관성을 보장한다.
  2. 경량성: 컨테이너는 기계의 OS 커널을 공유하고 애플리케이션당 OS를 요구하지 않아 가상 머신보다 더 가볍다.
  3. 이식성: Docker로 컨테이너화된 애플리케이션은 Docker를 지원하는 모든 플랫폼에서 어디에서나 실행될 수 있다.
  4. 격리: Docker는 각 컨테이너가 격리되도록 보장한다. 컨테이너는 자체 파일 시스템, 네트워킹 및 고유한 프로세스 공간을 가진다.
  5. Docker Hub: Docker Hub는 Docker 이미지를 위한 저장소이다. 사용자는 Docker Hub에서 이미지를 가져와 애플리케이션의 기반으로 사용할 수 있다.

Dockerfile

Dockerfile은 이미지를 조합하기 위해 사용자가 커맨드 라인에서 호출할 수 있는 모든 명령어를 포함하는 텍스트 문서이다. docker build를 사용하면 연속적인 커맨드 라인 지시어를 수행하는 자동화된 빌드를 생성할 수 있다.

Dockerfile의 기본 구조
  • FROM: 기반 이미지를 지정한다.
  • RUN: 현재 이미지 위에 새 레이어에서 명령을 실행하고 결과를 커밋한다.
  • COPY: src에서 새 파일, 디렉토리 또는 원격 파일 URL을 복사하고 컨테이너의 dest 경로에 추가한다.
  • CMD: 실행 중인 컨테이너에 대한 기본값을 제공한다. 마지막 CMD만 효과가 있다.
  • EXPOSE: Docker에게 컨테이너가 런타임에 지정된 네트워크 포트를 사용한다고 알린다.
  • ENV: 환경 변수 <key>를 값 <value>로 설정한다.
  • ENTRYPOINT: 실행 가능한 컨테이너를 구성할 수 있도록 한다.
Dockerfile 예시
# 공식 Python 런타임을 부모 이미지로 사용(Docker Hub 다운로드)
FROM python:3.7-slim

# 컨테이너 내의 작업 디렉토리 설정
WORKDIR /usr/src/app

# 현재 디렉토리의 내용을 컨테이너의 /usr/src/app에 복사
COPY . .

# requirements.txt에 명시된 필요한 패키지 설치
RUN pip install --no-cache-dir -r requirements.txt

# 컨테이너 외부에서 포트 80 사용 가능하도록 설정
EXPOSE 80

# 환경 변수 정의
ENV NAME World

# 컨테이너가 시작될 때 app.py 실행
CMD ["python", "./app.py"]
  • 해당 Dockerfile은 Python 환경을 만들고, 작업 디렉토리를 설정하고, 현재 디렉토리의 내용을 복사하고, 의존성을 설치하고, 포트를 공개하고, 환경 변수를 설정하고, 컨테이너 시작 시 명령어를 지정한다.

Docker Compose

Docker Compose는 여러 컨테이너를 정의하고 실행하기 위한 도구입니다. docker-compose.yml 파일을 사용하여 애플리케이션의 서비스, 네트워크 및 볼륨을 구성할 수 있다.

Docker Compose 예시
version: "3"
services:
  web:
    image: "webapp:latest"
    ports:
      - "5000:5000"
  db:
    image: "postgres:latest"
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
  • 해당 docker-compose.yml 파일은 웹 애플리케이션 서비스와 PostgreSQL 데이터베이스 서비스를 정의한다. 웹 서비스는 5000 포트에서 실행되며, db 서비스는 환경 변수를 통해 구성된다.

Reference