** 포스팅을 읽기전에
- Docker, Container, Image, Layer 등의 사전지식이 필요합니다.
0. 개요
스터디 중 Container 기술과 Virtual Machine(앞으로 VM) 에 대한 차이 이야기가 나오는 도중에 나온 의문점에 대한 이야기입니다.
우리가 인지했던 두 기술의 차이점은
- VM은 하이퍼바이저 위에 GuestOS 가 있어야한다는 점
- Container는 별도의 GuestOS를 설치할 필요 없이 HostOS의 커널을 공유한다.
요약하자면 이정도이지만 문제는 Dockerfile을 작성하는 부분에서 의문점이 생습니다.
'From 으로 BaseOS 이미지를 받아서 Image Layer를 구성하는데 VM이랑 차이가 뭐지??'
이런 의문점에서 차이점에 대해 좀 더 알아보게 되었습니다.
1. 개념
우선 각 기술을 RedHat 에서 정의한 내용은 다음과 같았습니다.
a. Container
컨테이너는 마이크로서비스 또는 애플리케이션과 이를 실행하는 데 필요한 모든 것이 포함되어 있습니다.
컨테이너에 있는 모든 것은 '이미지'라고 하는 모든 라이브러리와 종속성을 포함하는 코드 기반 파일에 저장됩니다.
이 이미지는 RPM 패키지 및 구성 파일과 함께 제공되므로 이 파일은 Linux 배포 설치로 간주될 수 있습니다.
컨테이너는 너무 작기 때문에 일반적으로 수백 개가 서로 느슨하게 결합되어 있으므로 컨테이너 오케스트레이션 플랫폼을 사용하여 컨테이너를 프로비저닝하고 관리합니다.
b. VM
하이퍼바이저라고 하는 소프트웨어는 리소스가 파티셔닝되어 VM 전용으로 할당될 수 있도록 리소스를 물리 머신에서 분리합니다.
사용자가 물리 환경의 추가 리소스를 요구하는 VM 명령을 발행하면 하이퍼바이저는 이 요청을 물리 시스템으로 전달하고 변경 사항을 캐싱합니다.
VM은 물리 서버처럼 보이고 작동하므로 애플리케이션 종속성 및 대규모 OS 설치 공간(단일 애플리케이션이나 마이크로서비스를 실행하는 데는 거의 필요하지 않음)의 단점을 증대시킬 수 있습니다.
c. 그러면??
위 내용과 찾아본 내용을 요약하자면...
- Container는 리눅스 패키지로 및 구성파일을 이미지 파일로 만들어 Linux 배포 설치로 인식 시킨다.
-> 애플리케이션 관점 - VM은 물리 머신에 대한 가상화 공간 분리를 통해 구역을 나누고, Hypervisor가 Application 이 구동될 GuestOS와 Host Computer 간의 중계 역할을 한다.
-> 인프라스트럭처 관점
정도로 요약해 볼 수 있겠습니다.
2. 차이점
다시 돌아와서 처음에 의문을 가졌던,
'Container 도 BaseOS를 사용하는데 VM과 무슨 차이일까?' 를 두 기술의 차이점을 보면서 확인해보겠습니다.
Hypervisor 의 종류에 따라 VM 구조에 대한 부분이 조금 다를 수 있겠지만,
일반적으로 우리가 설치하여 사용하는 구조는 Hypervisor 를 설치하는 Host OS가 아래 한 층 더 구성되어있는 편입니다.
표로 정리하였을때 아래와 같은 차이를 보이는데,
VM | Container | |
가상화 | 기반 물리 인프라를 가상화 | 운영체제를 가상화 |
캡슐화 | 운영 체제, 그 위의 모든 소프트웨어 계층, 그리고 여러 애플리케이션을 포함합니다. | 애플리케이션 또는 애플리케이션 구성 요소를 실행하는 데 필요하며 운영 체제보다 상위에 있는 소프트웨어 계층입니다. |
기술 | 하이퍼바이저는 기반 운영 체제 또는 하드웨어와 조율됩니다. | 컨테이너 엔진은 기반 운영 체제와 리소스를 조율합니다. |
지원 OS | 대부분 지원 | Linux 계열 |
마지막 부분의 지원 OS 부분의 이유가 우리가 가졌던 의문이 해결되는 지점입니다.
위의 개념부분에서 'Container는 리눅스 패키지로 이미지를 만들고 리눅스 배포로 인식한다' 하였습니다.
이때 Docker 같은 Container Engine은 BaseOS 로 경량화 리눅스를 가지고 있는데,
-> 이미지 빌드 시점, Dockerfile의 FROM 부분에 OS를 리눅스 계열을 작성하게 되고,
-> BaseOS 와 비교하여 From 의 OS와 추가 구성을 Packaging 합니다.
실질적으로 이미지에는 리눅스 패키지 파일 및 구성정보,
애플리케이션에 대한 파일 형태로 그를 구동하는 OS는 BaseOS 라는걸 알 수 있습니다.
그렇기에 VM의 경우 Hypervisor 위에 GuestOS를 구성해야하는데
반면 Continer는 Linux BaseOS 에서 이미지 파일들을 컨테이너 형태로 구동시키는 방식이기에
더 경량화이면서 BaseOS 위에서 구동되기 때문에 확장성 면에서 좀 더 유연한 특징을 가집니다.
3. 마무리
위에서는 Container가 더 좋은 기술처럼 보일 수 있겠지만 VM과 Container의 특징이 명확하기에 각 상황에 맞게 인프라 구성을 하는게 좋습니다.
특히 BaseOS 단일 위에서 여러 컨테이너들이 작동하는 구조이기에 BaseOS의 해킹 성공 시 모든 컨테이너에 영향을 받을 수 있는점이 대표적인 단점입니다.
어떤 구성이든 정답이 아니라 조금 더 만들고자 하는 서비스와 현황에 맞는 기술을 찾는다 라는 생각으로 봐주셨으면 합니다.
추가적으로 Docker Contianer로 MacOS를 설치하는 프로젝트가 있다해서
혹시 관심있으시면 아래 링크로 확인해보시면 좋을 듯합니다!
https://www.lesstif.com/container/docker-osx-106856663.html
docker로 OSX 를 구동하는 신기한 프로젝트
RHEL/CentOS 8 나 fedora 를 사용한다면 docker 대신 podman 을 사용해야 합니다. 아니면 다음 에러가 발생합니다. docker: Error response from daemon: OCI runtime create failed: this version of runc doesn't work on cgroups v2: unknow
www.lesstif.com
마지막으로 스터디 하면서 생겼던 의문점으로
이번에 조사하면서 어렴풋이 알기만했던 내용에 대해 좀 더 깊게 이해하게된 좋은 계기였던 것 같습니다.
혹시 잘못 알고있는 부분이 있다면 언제든 댓글 달아주세요!
4. 참고자료
https://www.redhat.com/ko/topics/containers/containers-vs-vms
컨테이너와 VM 비교 및 차이점: VM vs Container
Linux Container와 VM(가상 머신)은 다양한 IT 요소를 결합해 시스템의 나머지 부분으로부터 격리하는 패키징된 컴퓨팅 환경을 뜻합니다.
www.redhat.com
https://aws.amazon.com/ko/compare/the-difference-between-containers-and-virtual-machines/
컨테이너와 VM 비교 - 배포 기술 간의 차이점 - AWS
컨테이너와 가상 머신을 사용하면 여러 환경에서 실행할 수 있도록 애플리케이션을 완전히 격리할 수 있습니다. 컨테이너와 가상 머신은 기본 인프라를 가상화하거나 추상화하므로 사용자가
aws.amazon.com
https://dololak.tistory.com/312
[Linux] 리눅스 RPM이란? 패키지 관리 및 RPM 사용법
RPM(RedHat Package Manager) RPM이란 RedHat Pacage Manager의 약자로 레드햇 계열의 리눅스 배포판에서 사용하는 프로그램(패키지) 설치 관리 도구 입니다. 현재는 RPM Package Manager의 재구적 약자로 사용되어
dololak.tistory.com
https://mosei.tistory.com/entry/Docker-Container%EC%9D%98-OS-vs-VM%EC%9D%98-OS
[Docker] Container의 OS vs VM의 OS
docker를 사용하다가 생긴 의문. - Container 에서도 Guest OS를 사용하는데? docker는 VM을 사용할 때 생기는 쓸데없는 자원낭비(OS의 오버헤드) 를 줄이는데 획기적이다. docker를 쓰는 가장 큰 이유이다. do
mosei.tistory.com
'DEV > Container' 카테고리의 다른 글
[Docker] Root Dir 변경 및 sudo 없이 사용 (with. Ubuntu) (1) | 2025.01.06 |
---|---|
[Docker] Spring Boot DockerFile. (0) | 2024.11.16 |
[Kubernetes] kubectl 설치 (feat. minikube) (0) | 2023.11.24 |
[Docker] docker compose - MariaDB 작성 방법 (1) | 2023.03.27 |
[Docker] Dockerfile 작성 방법 (1) | 2023.03.24 |