가상화
가상화란?
물리적인 하드웨어 리소스나 운영체제를 소프트웨어적으로 추상화하여, 여러 개의 논리적 리소스처럼 보이게 하는 기술이다.
(예를 들어, 가상 메모리는 실제 디스크 공간을 메모리처럼 사용하여 물리적 메모리의 용량을 확장할 수 있다.)
가상화를 통해 한 대의 컴퓨터에서 여러 대의 OS를 가동할 수 있어, 자원의 효율적 사용과 비용 절감이 가능하다.
에뮬레이터
'모방자'라는 뜻의 영단어로, 특정 하드웨어의 동작을 소프트웨어로 모방한다.
특정 하드웨어에서만 동작하는 소프트웨어를 다른 하드웨어 환경에서도 실행할 수 있도록 한다.
(예를 들어, 게임기로 출시된 게임을 컴퓨터나 스마트폰으로 구동하도록 해주는 것이다.)
따라서 실제 하드웨어 동작을 소프트웨어적으로 흉내내기 때문에 발생하는 오버헤드 때문에 성능이 떨어질 수 있다.
(예를 들어, 메모리를 배열로 흉내 내어 사용하면 성능이 떨어진다.)
자바 가상 머신(JVM)은 자바 프로그램을 실행하기 위해 자바 바이트코드를 실제 CPU에서 실행할 수 있는 명령어로 변환하므로, 가상 머신보다는 특정 하드웨어를 모방하는 에뮬레이터에 가깝다.
서로 다른 아키텍처나 플랫폼에서의 소프트웨어 실행에 사용된다.
가상 머신
가상 머신은 실제 하드웨어 위에 소프트웨어적으로 완전히 독립된 컴퓨터 환경을 만드는 기술이다.
가상 머신은 각자 독립적인 운영체제(OS)를 포함하며, 물리적 하드웨어 위에서 실행된다.
따라서, 게스트 OS 전체를 포함하므로 컨테이너에 비해 무겁고, 리소스 소비가 크다.
하이퍼바이저(실제 하드웨어와 가상 머신 사이 중간 역할)를 통해 물리적 하드웨어를 가상화한다.
이렇게 가상화된 하드웨어를 사용하며, 자신만의 가상 하드웨어 리소스를 가지며, 이 리소스 위에서 독립적인 런타임 환경을 구축한다.
또한, 자체 커널을 가지므로, 강력한 격리와 독립성을 제공한다.
일부 특권 명령어(호스트의 커널만 실행할 수 있는 명령어) 사용이 제한된다.
(이러한 명령은 하이퍼바이저가 다른 명령어로 바꾸어 처리하지만 게스트 OS는 특권 명령어를 실행했다고 착각한다.)
특권 명령어를 가로채는 것 자체가 성능에 좋지 않기 때문에, 이를 해결하기 위해 반가상화가 사용되기도 한다.
반가상화란 게스트 OS가 가상화 환경에서 실행되고 있다는 것을 인식하고, 이를 최적화하는 방식이다.
이를 위해 게스트 OS는 하이퍼바이저와 직접 통신할 수 있다.
가상머신은 아키텍처의 차이(하드웨어의 구조적 차이)가 있다면 에뮬레이터가 필요하다.
서버 가상화, 테스트 및 개발 환경, 서로 다른 운영체제의 실행에서 사용된다.
컨테이너
컨테이너는 애플리케이션과 그 의존성을 독립된 환경에서 실행할 수 있도록 하는 기술이다.
호스트 OS의 커널을 공유하지만, 격리 기법(네임스페이스, cgroups, chroot 등) 통해 루트 디렉토리를 격리시키기 때문에, 독립된 파일 시스템, 네트워크, 프로세스 공간 등을 가진다.
(전용 루트 디렉토리를 부여받으며, 컨테이너 안에서는 root 계정 행세를 하지만, 호스트의 파일에 접근할 수 없다.)
따라서 호스트 런타임 환경에 영향받지 않고, 독립적으로 실행된다.
예를 들어, 컨테이너 없이 같은 호스트에서 서로 다른 버전의 Java로 개발된 프로그램을 동시에 실행하는 경우, 두 가지 자바를 모두 설치하고, 각자 알맞은 버전으로 빌드해야 한다. 하지만 컨테이너로 만든다면, 각자의 환경에서 하나의 자바만 설치해도 된다. 따라서 배포 환경을 일관되게 유지할 수 있다.
호스트의 커널을 사용하기 때문에, 다른 프로세스처럼 ps로 조회할 수 있고, kill로 종료할 수도 있다.
게스트 OS가 끼지 않고 호스트의 커널을 그대로 사용하므로, 가상머신보다 훨씬 빠른 실행속도와 간편성을 제공한다.
마이크로서비스 아키텍처, 애플리케이션 배포, DevOps 환경에서의 일관된 개발 및 배포에서 사용된다.
가상 머신과 컨테이너의 차이
'💠개발 도구 및 환경 > 시스템 관리' 카테고리의 다른 글
[가상 머신] 웹훅 가져오고, top/free 명령어로 데이터 추출하여, 쉘 스크립트 작성하기 (2) (1) | 2024.09.04 |
---|---|
[가상 머신] 리눅스 운영체제 설치하고, 가상 환경을 설정하기 (1) (0) | 2024.08.28 |
[쉘 스크립트] 쉘 스크립트 기초 문법에 대해 알아보자 (1) | 2024.08.26 |
[ANSI Escape Code] ANSI Escape Code로 터미널 예쁘게 출력하기 (0) | 2024.08.26 |
[리눅스] 리눅스 명령어에 대해 알아보자 (2) | 2024.07.16 |