-
Notifications
You must be signed in to change notification settings - Fork 0
KR_가상화
가상화는 시스템 내에서 물리적 장치 또는 리소스의 가상 버전을 생성하는 기술이다.
이 프로세스를 통해 물리적 구성 요소를 논리 단위로 추상화할 수 있어 리소스 사용의 유연성과 효율성이 향상된다.
가상화는 하드웨어 플랫폼, 저장 장치, 네트워크 리소스, 운영 체제 등 다양한 시스템 측면에 적용될 수 있다.
RAID 및 LVM과의 비교는 IT 인프라의 더 넓은 범위 내에서 가상화를 상황화하는 데 도움이 된다.
RAID(Redundant Array of Independent Disks): 이 기술은 향상된 중복성과 성능을 위해 하드 드라이브와 같은 여러 물리적 저장 장치를 단일 논리 장치로 결합한다. 일반적으로 Windows 시스템과 연관되어 있지만 RAID는 Windows 시스템에만 국한되지 않으며 다양한 환경에서 구현될 수 있다.
LVM(논리 볼륨 관리자): Linux 시스템에서 주로 사용되는 LVM은 물리적 저장 장치의 공간을 보다 유연하게 할당할 수 있는 저장소 관리 방법이다. 이는 물리적 스토리지에 대한 추상화 계층을 제공하여 디스크의 물리적 레이아웃에 제한을 받지 않고 스토리지 공간의 크기 조정 및 관리를 허용한다.
하드웨어 에뮬레이션 수준과 게스트 OS와 하이퍼바이저 간의 상호 작용에 중점을 둔다.
- 하드웨어 에뮬레이션: 전체 가상화에는 각 가상 머신의 하드웨어를 완전히 에뮬레이션하는 작업이 포함된다. 게스트 OS는 시뮬레이션된 하드웨어 환경과 상호 작용하므로 수정이 필요하지 않다.
- 게스트 OS: 마치 실제 하드웨어에서 실행되는 것처럼 수정되지 않은 운영 체제를 실행할 수 있다.
- 하이퍼바이저 역할: 하이퍼바이저는 하드웨어를 관리하고 추상화하여 각 VM에 가상 하드웨어 계층을 제공한다.
- 다이렉트 하이퍼바이저 인터페이스: 반가상화에서 게스트 OS는 자신이 가상화된 환경에서 실행되고 있음을 인식하고 하이퍼바이저와 직접 통신한다.
- 게스트 OS: 더 나은 성능을 위해 하이퍼바이저 API와 상호 작용할 수 있도록 게스트 OS를 수정해야 한다.
- 성능: 일반적으로 오버헤드가 낮기 때문에 특히 I/O 작업에서 전체 가상화보다 더 나은 성능을 제공한다.
가상화 계층이 위치하는 위치(OS 상단, OS 공유 또는 하드웨어 직접)와 운영 효율성 및 사용 사례에 따라 차별화된다.
- 계층화: 호스트 운영 체제 위에서 실행됩니다. 하이퍼바이저는 OS에 설치된 소프트웨어 계층이다.
- 사용 사례: 일반적으로 개발, 테스트 및 교육 목적으로 사용된다.
- 예: VMware 워크스테이션, Oracle VirtualBox.
- OS 공유: 컨테이너는 호스트 OS 커널을 공유하지만 애플리케이션과 해당 종속성을 사용자 공간에 격리한다.
- 리소스 효율성: 전체 OS를 에뮬레이션할 필요가 없으므로 VM보다 리소스 효율성이 더 높다.
- 예: Docker, Kubernetes.
- 다이렉트 하드웨어 인터페이스: 시스템 하드웨어에서 직접 실행되어 하드웨어를 제어하고 게스트 운영 체제를 관리한다.
- 성능: 일반적으로 호스트 가상화보다 더 나은 성능과 효율성을 제공한다.
- 예: VMware ESXi, Microsoft Hyper-V.
Docker는 소프트웨어 컨테이너 내에서 애플리케이션을 배포하기 위한 오픈 소스 플랫폼이다. 리눅스의 운영체제 수준 가상화에 대한 추가적인 추상화 및 자동화를 제공한다.
Docker는 리눅스 커널의 리소스 격리 기능(예: cgroups 및 커널 네임스페이스)과 유니온 파일 시스템(OverlayFS와 같은)을 사용하여 단일 리눅스 인스턴스 내에서 독립적인 컨테이너가 실행될 수 있도록 하여 가상 머신을 시작하고 유지하는 오버헤드를 방지한다.
- 컨테이너화: 애플리케이션과 그 의존성을 컨테이너에 패키징하여 개발, 테스트 및 프로덕션 환경에서 일관성을 보장한다.
- 경량성: 컨테이너는 기계의 OS 커널을 공유하고 애플리케이션당 OS를 요구하지 않아 가상 머신보다 더 가볍다.
- 이식성: Docker로 컨테이너화된 애플리케이션은 Docker를 지원하는 모든 플랫폼에서 어디에서나 실행될 수 있다.
- 격리: Docker는 각 컨테이너가 격리되도록 보장한다. 컨테이너는 자체 파일 시스템, 네트워킹 및 고유한 프로세스 공간을 가진다.
- Docker Hub: Docker Hub는 Docker 이미지를 위한 저장소이다. 사용자는 Docker Hub에서 이미지를 가져와 애플리케이션의 기반으로 사용할 수 있다.
Dockerfile은 이미지를 조합하기 위해 사용자가 커맨드 라인에서 호출할 수 있는 모든 명령어를 포함하는 텍스트 문서이다. docker build
를 사용하면 연속적인 커맨드 라인 지시어를 수행하는 자동화된 빌드를 생성할 수 있다.
- FROM: 기반 이미지를 지정한다.
- RUN: 현재 이미지 위에 새 레이어에서 명령을 실행하고 결과를 커밋한다.
-
COPY:
src
에서 새 파일, 디렉토리 또는 원격 파일 URL을 복사하고 컨테이너의dest
경로에 추가한다. -
CMD: 실행 중인 컨테이너에 대한 기본값을 제공한다. 마지막
CMD
만 효과가 있다. - EXPOSE: Docker에게 컨테이너가 런타임에 지정된 네트워크 포트를 사용한다고 알린다.
-
ENV: 환경 변수
<key>
를 값<value>
로 설정한다. - ENTRYPOINT: 실행 가능한 컨테이너를 구성할 수 있도록 한다.
# 공식 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.yml
파일을 사용하여 애플리케이션의 서비스, 네트워크 및 볼륨을 구성할 수 있다.
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 서비스는 환경 변수를 통해 구성된다.