Kuma's Curious Paradise
[이룸] 도커Docker가 궁금해! - 가상 머신(VM) vs. 컨테이너(Container) 본문
CI/CD에도 사용하고 엘라스틱서치 설치에도 사용한 도커. 이름은 수없이 들었지만 정확히 도커가 무엇인지 알지 못한 채 사용하였다. 도커란 대체 무엇이며 어떻게 사용하면 좋을까? 컴퓨터를 모르는 사람도 이해할 수 있을 정도로 쉽게 설명해 보려 한다.
먼저, 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼 중 하나라는 점을 미리 이야기한다. 도커를 이해하려면 컨테이너를 먼저 이해해야 하고, 컨테이너를 이해하는 가장 쉬운 방법은 가상 머신과 비교하며 이해하는 것이기 때문에, 오늘은 가상머신과 컨테이너에 대해 적어 보겠다.
1. 하나의 컴퓨터에서 성격이 다른 소프트웨어를 실행하는 두 가지 방법
1) 성격이 다른 소프트웨어란?
식당 운영을 한다고 상상해 보자. 이 식당은 이탈리안 파스타도, 한국의 김치찌개도 만드는 이상한 식당이다. 이 두 요리는 필요한 재료도 도구도 다르기 때문에 함께 운영하기에 어려움이 있다. 성격이 다른 소프트웨어란 바로 이런 상황이 컴퓨터 세계에서 벌어질 때를 말한다. 웹 개발과 임베디드 시스템 개발 같이, 다른 환경을 필요로하는 소프트웨어를 한 컴퓨터에서 실행해야 하는 상황인 것이다.
하지만 파스타와 김치찌개를 동시에 만드는, 즉 성격이 다른 소프트웨어를 한 컴퓨터에서 동시에 작동시키는 방법이 있다. 바로 가상 머신과 컨테이너다. 이들은 시스템의 자원(RAM, CPU, 디스크, 네트워킹 등)을 가상화하며, 서로 다른 요구 사항을 가진 소프트웨어들이 동일한 물리적 하드웨어 위에서 격리되어 실행될 수 있게 한다. (이를 '가상화' 기술이라고 부른다.)
'가상 머신'이 전체 컴퓨터를 하드웨어 계층까지 가상화한다면 컨테이너는 OS 수준 위의 소프트웨어 계층만 가상화한다는 차이점이 있다.

2) 가상 머신 Virtual Machine(VM)
가상 머신은 실제 환경(host) 안에 별도의 가상 환경(guest)을 만드는 기술이다. 이를 통해 마치 이탈리안 식당 안에 독립적인 김치찌개 식당이 있는 것처럼, 한 대의 컴퓨터(host 컴퓨터) 안에 여러 대의 가상 컴퓨터(가상 머신)를 만들어 각각 독립적으로 운영할 수 있다. 각 가상 머신은 자신만의 가상 하드웨어(예: CPU, 메모리, 디스크 등)를 가지며, 서로 다른 운영 체제(OS)를 설치하고 실행할 수 있어, 한 대의 물리적 컴퓨터에서 Windows, Linux, MacOS 등 다양한 운영 체제를 동시에 구동하는 것이 가능하다.
하이퍼바이저(Hypervisor)는 컴퓨터에 가상 머신을 생성하고 실행시킨다. CPU, 메모리와 같은 물리적 리소스를 가상 머신들에 동적으로 할당하며, 가상 머신 간 네트워크 연결을 관리한다. 각 가상 머신은 독립적인 OS를 지니기 때문에, VM이 늘어날 때마다 전체 OS를 구축해야 하는 부담이 있다. 확장성이 낮은 편.
***JVM(Java Virtual Machine)은 가상 머신의 개념을 프로그래밍 언어인 Java에 적용한 것이다. JVM은 자바 애플리케이션을 실행시키며, 자바 코드를 해당 운영 체제가 이해할 수 있는 기계어로 변환한다. 이 과정을 통해 자바 애플리케이션은 OS 독립적으로 실행될 수 있다. JVM은 일반적인 가상 머신처럼 특정 하드웨어를 가상화하기보다는, 자바 애플리케이션을 다양한 운영 체제 상에서 동일하게 실행할 수 있도록 하는 소프트웨어 기반의 가상 머신이라고 볼 수 있다.
3) 컨테이너 Container
같은 주방을 공유하면서도 각 부스에서 독립적인 메뉴를 준비할 수 있듯, 컨테이너는 하나의 운영 체제(OS) 위에서 독립적으로 실행될 수 있는 애플리케이션의 환경(코드, 의존성, 환경 설정 등 애플리케이션 구동에 필요한 모든 것)을 패키징하여 담고 있다. 이러한 패키징은 애플리케이션을 어디에서나 (개인 컴퓨터든 클라우드든) 동일한 방식으로 실행할 수 있게 만든다.
컨테이너는 호스트 OS의 커널을 공유하고 필요한 애플리케이션 및 라이브러리만을 포함하기 때문에, 자원 사용이 적고 시작 시간이 빠르다. 따라서 VM보다 훨씬 가볍고 네트워크를 통해 주고받기도 매우 쉽다. (개발자들끼리 앱을 공유하기도 쉬워진다는 뜻!) 하지만 각 컨테이너는 완전히 독립적이지 않아서, 서로 영향을 줄 수 있으며 보안과 격리를 위한 추가적인 조치가 필요할 수 있다.
*** 더 자세한 내용은...
https://www.ibm.com/blog/containers-vs-vms/
Containers vs. Virtual Machines (VMs): What’s the Difference? - IBM Blog
Everything you need to know to understand the containers vs. VMs debate and why containers are growing in popularity. If you’ve only recently started learning about virtualization tools, you might wonder what the differences are in the technology conve
www.ibm.com
2. 도커란 무엇일까?
도커는 위의 그림 오른편, Host OS 위에서 돌아가는 'Container Engine'이다. 즉, 컨테이너를 생성하고 관리하는 소프트웨어로, 개발자들이 애플리케이션을 컨테이너에 패키징하고, 이 컨테이너를 통해 쉽게 배포하고 실행할 수 있도록 도와준다.
도커의 핵심 기능과 장점
- 호스트 OS와의 분리: 도커 컨테이너는 동일한 호스트 OS 위에서 여러 컨테이너를 동시에 실행할 수 있게 하며, 각 컨테이너는 서로 독립적이어서 충돌 없이 병렬로 실행된다.
- 빠른 소프트웨어 제공: 컨테이너 기술을 사용함으로써 소프트웨어의 배포와 업데이트 과정을 빠르고 효율적으로 만들어 준다. (웹 하나 구동하려고 이것저것 설치하느라 머리 아플 일이 없다!)
- 포괄적인 추상화: 백엔드 프로그램, 데이터베이스, 메시지 큐 등 거의 모든 유형의 애플리케이션을 컨테이너로 추상화할 수 있다. 화물 컨테이너를 옮길 때 내용물을 알 필요가 없듯이, 컨테이너로 추상화된 내용물을 알지 못해도 사용이 가능해진다.
- 멀티 플랫폼 지원: Linux, Windows, MacOS 등 다양한 OS에서 실행될 수 있으며, AWS, Azure, Google Cloud와 같은 클라우드 환경 뿐만 아니라, 개인 PC나 서버에서도 실행될 수 있다. 어디서든 배포가 가능하다는 뜻.
- 오케스트레이션 지원: 쿠버네티스 Kubernetes와 같은 오케스트레이션 도구와 통합되어 여러 컨테이너의 배포, 확장, 네트워킹을 자동화할 수 있다. 이는 복잡한 어플리케이션을 구성하는 여러 컨테이너를 효율적으로 관리할 수 있도록 도와준다.

다음 글에서는 도커 사용 시나리오와 함께 도커에서 사용되는 주요 개념들을 살펴보겠다.
'이룸 프로젝트' 카테고리의 다른 글
[이룸] elasticsearch 관련 트러블슈팅 1 - config에 ssl 관련 설정 삽입 (0) | 2024.04.17 |
---|---|
[이룸] 검색 기능 고도화 3 - kibana / spring boot와 es 연동하기 (0) | 2024.04.17 |
[이룸] 검색 기능 고도화 2 - 엘라스틱 서치란 무엇인가? + 설치하기 (0) | 2024.04.09 |
[이룸] 검색 기능 고도화 1 - 현재 상황 점검 및 전문 검색 기능 도입 (0) | 2024.04.03 |
[이룸] 전역 에러 처리 리팩토링 (0) | 2024.03.27 |