본문 바로가기
공부/개발자를 위한 쉬운 Docker

[Docker] 가상화 기술과 도커

by 도리언 옐로우 2024. 11. 11.

1. 가상화 기술

가상화 기술은 물리적인 컴퓨팅 환경 내부에서 논리적인 컴퓨팅 환경을 만들 수 있는 기술이다. 쉽게 표현하면 실제로 존재하지 않는 컴퓨터 환경을 마치 존재하는 것처럼 만들어주는 기술이라고 할 수 있다. 가상화 기술을 활용하면 하나의 컴퓨터에 여러대의 논리적인 컴퓨터 OS환경을 만들 수 있게 된다.

 

가상화 기술이 필요한 이유를 살펴보자. 현대의 IT환경에서는 소프트웨어를 하나의 OS에서 운영하는 것은 피하는게 좋은데, 특정 소프트웨어가 비정상적으로 자원을 과도하게 소비하게 되면 전체 시스템의 안정성과 성능에 영향을 미치게 되기 때문이다. 가상화 기술을 활용하면 하나의 물리적 컴퓨터에서 독립적으로 운영되는 여러 개의  논리적인 OS환경을 생성할 수 있고, 사용자가 직접 리소스를 분배하고 관리할 수 있게 된다.

2. 가상화 기술의 유형 : 하이퍼바이저와 컨테이너

https://www.netapp.com/ko/blog/containers-vs-vms/

(1) 하이퍼바이저 가상화

하이퍼바이저는 물리적 서버의 자원을 분리하여 여러개의 가상머신(VM)을 실행하는 방식이다. 물리적 서버에 설치된 호스트OS에 하이퍼바이저를 설치하여 가상환경을 만들 수 있는데, 하이퍼바이저는 호스트OS의 자원을 격리하고 각 가상머신에 자원을 분배한다. 이렇게 가상머신은 독립적으로 운영되며 서로의 영향을 받지 않고 게스트OS를 비롯한 여러 프로세스를 실행할 수 있게 된다. 

 

호스트OS와 상이한 게스트OS를 어떻게 실행할 수 있는 것일까? 이 질문은 "호스트OS와 게스트OS가 다른 경우에 호스트OS가 어떻게 게스트OS에서 전달받은 시스템콜을 처리할 수 있는 것일까"로 치환될 수 있다. 해당 질문을 이해하기 위한 개념을 먼저 살펴보자.

 

프로세스는 OS를 통해서만 하드웨어 자원을 사용할 수 있다. 운영 체제는 하드웨어와 소프트웨어 간의 중재 역할을 하며, 이 과정에서 커널이라는 구성 요소가 사용된다. 커널은 하드웨어 리소스를 관리하고, 프로세스가 하드웨어에 접근할 수 있도록 시스템 콜을 통해 요청을 처리한다. 즉, 프로세스는 OS의 커널에게 하드웨어 리소스를 요청하기 위해 시스템 콜을 사용한다. 이때 운영 체제마다 서로 다른 커널을 사용하기 때문에 시스템 콜도 각각 다르다. 따라서 호스트 OS와 게스트 OS가 다르면, 호스트 OS는 게스트 OS에서 전달받은 시스템 콜을 직접 처리할 수 없을 것이다.

여기서 하이퍼바이저의 역할이 등장한다. 하이퍼바이저는 서로 다른 커널 간의 "언어"를 통역해주는 역할을 수행한다. 즉, 하이퍼바이저는 게스트 OS에서 발생한 시스템 콜을 호스트 OS가 이해할 수 있는 형식으로 변환하여 처리할 수 있도록 돕는다. 이를 통해 호스트 OS와 다른 게스트 OS를 동시에 실행할 수 있게 된다.

(2) 컨테이너 가상화

컨테이너는 기존 하이퍼바이저 방식의 단점을 극복한 가볍고 빠른 가상화 기술이다. 이는 리눅스 커널이 제공하는 LXC라는 자체 격리기술에서 출발하였는데, 리눅스 커널의 네임스페이스와 Cgroups기능을 활용하여 구현되었다. 여기서 네임스페이스는 리소스를 나누는 기준의 역할을 하고, Cgroups은 리소스의 사용량을 배분하는 기술이다.

 

해당 기술을 활용하면 하이퍼바이저 없이 커널의 자체기능만을 사용하여 격리된 공간을 만들 수 있는데, 이 각각의 격리된 공간을 컨테이너라고 한다. 커널의 격리기능을 활용하였으므로 모든 컨테이너는 호스트OS의 커널을 공유해서 사용하게 된다. 이것이 컨테이너 가상화의 가장 중요한 특징이다. 각 컨테이너들은 자체적인 커널이 없고 호스트OS의 커널을 공유한다는 특징으로 인해 중간단계가 없어 오버헤드가 적고 속도가 빠르다는 장점이 있다. 다만 커널을 공유하기 때문에 보안성이 다소 낮다고 할 수 있다.

3. 도커 (Docker)

도커는 컨테이너 가상화 기술을 쉽게 활용할 수 있도록 도와주는 컨테이너 플랫폼이다. 참고로 컨테이너 플랫폼은 사용자의 요청을 받아서 컨테이너를 관리해주는 역할을 수행하는 컨테이너 엔진과, 직접 커널을 통신하며 실제로 격리된 공간을 만드는 역할을 수행하는 컨테이너 런타임으로 구성된다.

 

https://heeya-stupidbutstudying.tistory.com/entry/MLOps-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B4%80%EB%A6%AC-%EB%8F%84%EA%B5%AC-%EB%8F%84%EC%BB%A4Docker

도커의 아키텍쳐에 대해 알아보자. 도커는 클라이언트-서버 모델로 실행되는데, 우선 클라이언트가 사용자의 명령을 도커 데몬에게 전달한다. 도커 데몬은 호스트os에서 지속적으로 실행되면서 클라이언트의 요청에 따라 컨테이너를 관리한다. 여기서 도커 데몬은 api를 제공하고 있는데, 사용자가 api를 직접 사용하는 것은 번거롭기 때문에 도커 CLI가 제공되고 있다. 사용자는 CLI를 통해 도커 데몬의 api와 쉽게 통신할 수 있게 된다.

 

실습 명령어 정리

  • docker version : 현재 설치된 도커의 버전 정보를 출력
  • docker info : 도커의 시스템 정보 및 설정 출력 (현재 실행중인 컨테이너, 이미지, 네트워크 등)
  • docker --help : 도커 명령어의 사용법과 옵션 확인
    특정 명령어에 대한 도움말은 docker <command> --help로 가능하다
  • docker run -p 80:80 --name hellonginx nginx : 호스트의 80포트를 컨테이너 80포트에 매핑하고 nginx 웹서버를 hellonginx라는 이름의 컨테이너로 실행
  • docker rm [컨테이너명/id] : 컨테이너 삭제. 실행중인 컨테이너는 -f 옵션을 추가하면 삭제가능

'공부 > 개발자를 위한 쉬운 Docker' 카테고리의 다른 글

[Docker] 도커 컴포즈  (0) 2024.11.22
[Docker] 도커 볼륨  (0) 2024.11.20
[Docker] 도커 네트워크  (0) 2024.11.19
[Docker] 이미지 빌드  (0) 2024.11.17
[Docker] 도커 이미지  (0) 2024.11.17