Docker & Container

[Docker] Virtual Machine(VM) & Docker(Container) 정리

아무일도없었다 2023. 4. 17. 20:20

VM (Virltual Machine)

 

VM Hypervisor 기반의 가상 시스템으로 Host와 완전히 분리된 환경을 구축하고 실행할 수 있도록 해주는 기술이다.

 

VM은 보통 Type1Type2 두 가지로 나뉘는데 둘의 차이점은 아래와 같다.

 

 

VM (Type1)

VM - Type1

 

Hypervisor가 H/W 위에 직접 설치되며 기존의 방식(Type2)과 비교하여 H/W 접근성이 훨씬 효율적으로 설계되었기 때문에 성능과 확장성, 안정성을 확보할 수 있다. (Hypervisor 자체가 불안정하면 모든 게 불안정한 문제가 있다.)

 

이처럼 H/W 위에 직접 Hypervisor가 설치되는 것베어메탈 하이퍼바이저(Bare Metal Hypervisor)라고 부른다. (대표적으로 Xen, Hyper-V가 Type1에 속한다)

 

VM (Type2)

 

VM - Type2

 

Hypervisor가 H/W 위에 설치된 OS(Host)에 설치가 된다. Type1과 비교하여 HostOS를 통해서만 H/W에 접근할 수 있으므로 효율이 좋지 않다. 하지만 사용하고 있던 Host가 있다면 Host를 건드리지 않고 가상화 환경을 설치할 수 있다는 장점이 있다.

 

이처럼 Host OS에 Hypervisor가 설치되는 것 호스티드 하이퍼바이저(Hosted Hypervisor)라고 부른다. (대표적으로 VMware Workstation, Oracle VM Virtual Box가 Type2에 속한다.)

 

 


 

Container

 

Container 기반 가상화

 

VM에서 Type1 혹은 Type2로 가상화를 하는 타깃은 OS였다면, Container의 경우 가상화하는 타깃이 프로세스로 줄어든다.

(당연하게도 Container Engine이 실행 중인 OS가 Hypervisor 위에 올라가 있을 수도 있다.)

 

Container 소프트웨어 서비스를 실행하는데 필요한 요소를 포함하는 경량 패키지이다. (OS, Library, Applicaion ...)

 

기존 가상화 방식(VM) OS를 가상화하고 Application을 그 위에서 실행시켰다면, Container의 경우 HostOS를 공유하면서 프로세스를 격리시켜서 Application을 서로 다른 환경(OS)에서 실행하는 것처럼 독립적으로 실행하는 기술을 사용하였다.

 

이러한 Container 기술을 최고로 응용하면서 등장한 도구가 바로 Docker이다. (Container 기술은 Docker가 처음 만든 것이 아니다 !)

 

Docker 초창기 Linux에서 개발되었던 LXC(Linux Container)라는 기술을 활용하여 Container들을 관리할 수 있는 도구를 만든 것이며, 추후에는 자체적으로 libcontainer를 개발하여 사용하였고 현재는 go언어로 개발한 runc를 사용하고 있다.

(https://github.com/opencontainers/runc/tree/main/libcontainer)

 

GitHub - opencontainers/runc: CLI tool for spawning and running containers according to the OCI specification

CLI tool for spawning and running containers according to the OCI specification - GitHub - opencontainers/runc: CLI tool for spawning and running containers according to the OCI specification

github.com

 


 

Docker

Docker Container 기반의 가상화 플랫폼으로 하나의 HostOS를 공유하며 여러 서비스(Application)에 필요한 환경을 구축하고 실행할 수 있도록 해주는 도구다.

(여러 OS에서 개발을 진행 중이지만 실제로 운영하는 대부분은 Linux 기반 Container이며, 비교적 최근 Windows Container도 등장하였다.)

 

즉, Docker는 여러 종류의 프로세스가 동일한 기반의 OS를 공유하며 독립된 환경에서 실행되는 환경을 제공한다.

(이 외에도 Image 개발 및 관리 & 배포, Container 관리 등 제공하는 기능이 정말 다양하다.)

 

Docker = Container가 아니다.

Red Hat에서는 Docker를 대체할 수 있는 Podman이라는 도구를 개발하였으며, 일정 버전 이상의 Red Hat 기반 OS에서는 Podman을 기본으로 제공하고 있으니 Docker와의 차이점은 아래 링크를 확인하면 된다.

(Docker와 Podman의 차이점)

 

[Kubernetes] Docker vs Podman

Kubernetes가 Docker를 사용하지 않으려고 계속 노력하는 중이다. 그 이유에는 여러 가지가 있지만 kubernetes 설치 시 docker 설치가 필요 없어졌고, image 개발 시에도 굳이 docker를 사용하지 않아도 되었

hackerpark.tistory.com

 


Image

Container라는 독립된 환경에서 서비스가 실행 가능하도록 필요한 요소를(서버 환경, 실행 파일, 라이브러리, 구조 등...) 하나의 패키지 형태로 묶는 형태 Image라고 한다.

 

Docker는 Dockerfile을 통해 image를 개발 및 관리할 수 있는 기능을 제공한다. (Dockerfile 문법은 추후에 정리할 예정이다.)

 

Dockerfile을 작성(개발)하고 Docker를 통해 image를 build & commit 할 수 있고, github 같은 DockerHub를 통해 push & pull 하여 버전관리도 가능하다.

 

최근에는 vscode 또는 Jetbrains의 IDE을 사용하여 Dockerfile & Image를 손쉽게 관리할 수 있다. 자세한 내용은 아래 글을 참고.

(Jetbrains IDE를 사용하여 Docker & Kubernetes 연동하기)

 

[K8S] Jetbrains IDE를 활용한 Docker + Kubernetes 연동 (Clion, InteliJ, Goland ...)

2023-02-10 기준으로 작성된 글이기 때문에 작성된 날을 기준으로 멀지 않은 미래에는 포스팅 내용에 대한 추가적인 검증이 필요합니다. Jetbrains의 여러 IDE를 사용하고 있지만, 본 포스팅에서는 gola

hackerpark.tistory.com

 

추가로 DockerHub가 아닌 온프라미스 환경의 Docker Registry도 구축이 가능하다. (Nexus에서는 이 모든 걸 제공한다 !)

 

 

반응형