가상환경으로 패키지와 종속성을 격리하고 가상머신으로 리눅스를 사용하고 가상화로 구현된 도커로 컨테이너를 돌리고.. 가상가상가상이 반복되다보니 가상환경, 가상머신, 컨테이너는 왜 가상이란 이름이 붙었고 어떻게 동작하고 어떻게 다른 건지 문득 궁금해졌습니다..! 그래서 하나씩 무엇인지 알아보며 각각의 가상은 무엇을 말하고 싶은 건지 알아보려고 합니다.
제가 헷갈릴 때 다시 보려고 적는 거 맞습니다. 하하
python virtual environment 기준
A virtual environment is created on top of an existing Python installation, known as the virtual environment’s “base” Python, and may optionally be isolated from the packages in the base environment, so only those explicitly installed in the virtual environment are available.
python의 가상환경 생성 표준 라이브러리 venv에서는 가상환경을 기존 파이썬 위에 설치되지만 기본 환경의 패키지와 분리하여 종속성을 관리할 수 있는 것으로 설명하고 있습니다.
venv
, .venv
, .virtualenvs
등의 디렉토리에서 프로젝트의 패키지를 관리로컬과 공유하는 것
1. 파이썬 인터프리터
2. 기본 시스템 라이브러리 (sys, os 등)
3. 환경 변수
로컬과 공유하지만 가상환경의 파이썬과 패키지 우선 사용
로컬과 분리하는 것
1. 패키지+라이브러리: 가상환경 디렉토리 내부의*/site-packages
에 설치, 전역 환경의 site-packages와 분리
2. 파이썬 실행 파일:*/Scripts
의 파이썬 실행 파일 사용
3. 패키지+라이브러리를 사용하는 스크립트 및 커맨드 (ex. django-admin, pytest 등)
= 물리적 컴퓨터 하드웨어를 보다 효율적으로 활용할 수 있도록 해주는 프로세스, 클라우드 컴퓨팅의 기반
하드웨어를 가상 머신이라고 하는 다수의 가상 컴퓨터로 분할 할 수 있도록 하는 컴퓨터 하드웨어 상의 추상화 계층 구축
1. 가상화가 없던 전통적인 배포 방식
= 물리적 컴퓨터의 가상화된 환경
물리적인 컴퓨터 시스템 내에서 소프트웨어로 컴퓨터 안에 가상 컴퓨터를 만들어서 독립적으로 동작할 수 있도록 합니다.
물리 컴퓨터를 가상화하는 시스템 가상 머신과 응용 프로그램의 프로세스를 지원하는 프로세스 가상 머신(JVM 등)이 있는데 이 글에서는 시스템 가상 머신을 가리킵니다.
가장 쉬운 예를 들어서 VirtualBox를 생각하면 VirtualBox에서 저장 공간, 메모리, CPU 등을 할당하고 OS를 설치하여 부팅하면 기존 컴퓨터 안에 기존 컴퓨터의 영향을 받지 않은 초기화 상태의 새로운 가상 컴퓨터를 사용할 수 있습니다.
먼저 가상머신이 실행되는 물리적 머신을 호스트, 호스트에서 실행되는 가상머신을 게스트라고 부른다. 그리고 가상화로 물리적 머신을 가상 머신으로 분리하도록 도와주는 기술이자 소프트웨어로 하이퍼바이저가 있습니다.
먼저 하이퍼바이저와 가상화 유형은 크게 두가지로 나뉩니다.
1형 하이퍼바이저 = 베어 메탈 하이퍼바이저 - 베어 메탈 가상화
물리적 서버의 최상위에 위치하여 하드위어 리소스에 직접 접근하고 호스트 시스템에 베어 메탈 하이퍼 바이저 설정으로 설치된 운영체제가 없다. 호스트 OS 없이 하드웨어에 하이퍼바이저를 설치하여 하드웨어를 가상화한다.
장점: 호스트OS 불필요로 오버헤드 감소, 하드웨어 직접 관리로 효율적인 리소스 활용
단점: 관리를 위한 콘솔 등 필요ex. Linux KVM, Microsoft Hyper-V, Xen 등
2형 하이퍼바이저 = 호스트형 하이퍼바이저 - 호스트 가상화
호스트 OS에 설치된 하이퍼바이저 프로그램으로 내장형 하이퍼바이저라고도 부른다. 소프트웨어 애플리케이션과 마찬가지로 컴퓨터 리소스를 완벽하게 제어할 수 없지만 시스템 관리자가 호스트형 하이퍼바이저의 리소스를 할당하고 가상머신에 배포한다. 호스트 OS 위에서 가상화하여 게스트 OS를 구동한다.
장점: 호스트 OS에 제약사항이 없음
단점: 호스트 OS로 지연 시간 발생 가능, 호스트 OS 안정성에 영향ex. VMware Workstation, VMware Player, Virtual Box, QEMU 등
효율과 확장을 위해서는 1형, 관리의 용이성을 위해서는 2형이 적절합니다.
1형 하이퍼바이저는 하드웨어 가상화 정도에 따라 다시 관리용 가상머신인 DOM0로 하드웨어에 접근하는 전가상화와 Hyper Call 인터페이스로 하이퍼바이저에게 요청하는 반가상화로 나눌 수 있습니다.
가상화를 통해 호스트의 하드웨어를 여러 가상 머신으로 나누어서 개별적으로 사용할 수 있고 여러 워크로드를 필요에 따라 하나의 물리적 컴퓨터에 통합할 수 있어 자원 활용도를 높이고 비용을 절감할 수 있습니다. 더하여 하이퍼바이저로 하드웨어 리소스를 동적 할당 할 수 있는 것으로 추상화하면 각 가상머신에 할당된 호스트의 하드웨어를 필요에 따라 프로비저닝하고 게스트 가상머신에 동적 할당할 수 있어 효율성과 유연성이 높아집니다.
= 어떤 환경에서나 실행하기 위해 필요한 모든 요소를 포함하는 소프트웨어 패키지
컨테이너는 소프트웨어 실행을 위해 필요한 해당 소프트웨어의 프로그래밍 언어 런타임과 라이브러리/패키지 등과 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지입니다. 컨테이너는 컨테이너 이미지를 실행시켜 동작하고 이미지는 실행을 위한 소스 코드과 종속성, 실행 환경 세팅 등을 위한 내용 등을 포함하고 있습니다.
컨테이너를 위한 가상화는 호스트(하드웨어, OS) 위에 컨테이너 런타임(컨테이너 실행을 담당하는 엔진, 소프트웨어)을 두어 구현하고 이를 통해 애플리케이션을 서로 격리된 환경에서 실행할 수 있습니다.
컨테이너 가상화는 하드웨어를 가상화하여 격리하는 하이퍼바이저와 달리 파일 시스템, 네트워크, 프로세스 공간 등을 격리하는 프로세스 수준의 경량화된 가상화 방식입니다. cgroup, namespace, overlayFS 등의 리눅스 기능으로 리소스를 제한하거나 네트워크와 파일 시스템 등을 격리할 수 있습니다.
컨테이너 런타임에는 Docker Engine, containerd, runc 등이 있고 OCI (OPEN CONTAINER INITIATIVE) 오픈소스 단체에서 표준을 만들었습니다.
컨테이너와 컨테이너 런타임을 더 알아보고 싶으시다면 다음 글을 읽어보시는 것도 좋을 것 같습니다. 컨테이너란? 리눅스의 프로세스 격리 기능
컨테이너 가상화가 가상머신의 가상화와 다른 점은 가상머신의 가상화는 하드웨어를 할당받아 자체적으로 OS를 가지고 독립적인 커널을 가지지만 컨테이너 가상화는 OS 수준에서 가상화되어 하나의 컴퓨터 위에서 돌아가는 컨테이너 모두가 호스트의 OS 커널을 공유합니다. 커널 공유의 장단점은 아래와 같습니다.
커널 공유 장단점
- 장점:
- 가벼움/빠름 - 컨테이너가 OS를 않아도 되며 이미지의 크기도 작아질 수 있다.
- 이식성 - 이미지의 크기가 작아지지만 애플리케이션의 실행 환경을 보장하므로 이식성이 뛰어나다.
- 효율적 - 커널 공유로 리소스를 효율적으로 사용할 수 있고 관리가 용이하다.
- 단점:
- 관리 필요 - 프로세스 수준의 격리로 컨테이너 간의 충돌 또는 보안 문제가 발생할 수 있으며 하나의 컨테이너 때문에 호스트에 문제가 발생한다면 다른 컨테이너에게도 영향을 준다.
위의 장단점과 더불어 컨테이너의 장점은 아래와 같습니다.
컨테이너 장단점
- 장점:
- 책임 분리: 개발/운영의 책임을 분리하고 운영팀이 배포와 관리에 집중 가능
- 이식성: 애플리케이션 구동 환경을 보장하고 이미지로 관리하여 높은 이식성
- 애플리케이션 격리: 논리적으로 격리된 OS 환경으로 애플리케이션을 격리 가능
- 단점:
- 러닝 커브: 컨테이너로 애플리케이션을 배포하고 관리하기 위해서는 추가적인 학습이 필요
- 데이터 지속성: 컨테이너는 이미지를 실행하는 무상태성에 적합한 구조를 가지고 있어 데이터 지속성을 위해서는 볼륨 등의 추가 관리가 필요
추가적으로 컨테이너를 활용하면 쿠버네티스 등을 활용한 오케스트레이션으로 확장성을 챙길 수 있습니다.
아니요! 간단히 이야기하면 가장 큰 차이점은 아래와 같습니다.
가상머신 (하드웨어 수준 격리) ↔️ 컨테이너 (프로세스 수준 격리)
간단히 예를 들면 가상머신은 자체적으로 OS를 가지고 있지만 컨테이너는 구동에 OS가 필요하다면 FROM ubuntu:22.04
처럼 Dockerfile에 정의하여 OS를 이미지로 불러와서 실행합니다.
가상머신과 컨테이너(프로세스)의 명확한 구분을 위해 다음 글을 꼭! 읽어보시면 좋을 것 같습니다. 도커 컨테이너는 가상머신인가요? 프로세스인가요?
공통점: 독립된 환경을 제공함으로써 효율을 챙김
차이점:
자료 출처:
venv — Creation of virtual environments
[Kubernetes] 쿠버네티스란 무엇인가?
[IBM] 가상화란?
[Google Cloud] 가상 머신이란?
[AWS] 하이퍼바이저란 무엇인가요?
[Google Cloud] 컨테이너란?
틀린 부분은 언제든 지적해주시면 감사하겠습니다!