가상화란? (feat. 도커)

가상화란 뭘 의미할까..? 그동안 도커를 배우면서 이미지, 컨테이너 등등 여러 개념들을 구현하면서도 이 가상화라는게 컴퓨터적으로 어떻게 이루어져있는지 너무 궁금했다. 그래서 찾아보고 정리해보자한다.

컴퓨터란 H/W 영역과 S/W영역으로 나누어져있다. 그리고 S/W는 운영체제같은

시스템 소프트웨어와 User mode영역 Application 소프트웨어로 나뉜다.

윈도우같은 운영체제에서의 모든 프로세스는 자신만의 고유한 영역, 다시말해 Memory를 보장받는다. 바꿔말해, 운영체제가 보장을 받는다고도 할 수 있겠다.

이때 Memory라고 하는 것은 Virtual Memory(가상메모리)이다.

가상메모리란. 주기억장치인 RAM과 더불어 HDD같은 2차메모리를 함께 싸잡아서 하나의 메모리를 추상화하는 것이다.

만약 Process가 예를들어 32bit인 경우, 운영체제가 Process한테 4GB의 가상메모리가 있으니 그안에서 쓰라고 한다.(실제쓸수있는건 대략 1.7GB)

여기서 가상메모리 공간의 중요한 특징은 Process 마다 독립적인 공간이라는 것이다. 예를들어 MS word#1, MS word#2 두개가 실행되고 있으면 개별프로세스다. MS word#2에서 편집을 하고 정보입력하면 MS word#2에서 쓰는 가상메모리에만 적립이 된다. 이처럼 독립적으로 개별화시켜서 여러 프로그램이 작동될 수 있도록 운영체제가 지원한다. 이를 멀티태스킹 운영체제라 한다.

멀티태스킹 환경에서는 각각의 프로세스가 가상메모리라는 체계를 활용하고 있다.

가상머신인 Vmware을 설치했다고 해보자.

컴퓨터에 네트워크 인터페이스카드(NIC)는 하나뿐이고, Device Driver, TCP/IP, Socket, Process 등등이 구성되어있을 것이다. (네트워크 포스팅들 참고)

여기서 중요한건 실제 물리적 NIC은 ‘한개’ 있다. 그리고 작업관리자를 켜보면 Intel같은 실제 하드웨어를 움직이는 Device driver또한 있을 것이다.

이런 컴퓨터에 Vmware를 깔아버리면 갑자기 Device driver가 더 생겨버린다.

( VMnetwork, Virtual NIC Driver#2, Virtual NIC Driver#3 ……)

자 그럼, 현재 쓰고있는 운영체제가 윈도우인데 리눅스도 같이쓰고 싶으면 Vmware로 윈도우 안에다가 또다른 리눅스를 설치할 수 있는데 이는 어떻게 작동할까?

컴퓨터 세상이라고하는 User mode / Kernel mode / 하드웨어 세 영역을 Host OS(윈도우)User mode, Kernel mode영역에다가 구현한 것이다.

여기서 차이점은 하드웨어이다.

Guest OS(VMware에 설치한 리눅스)의 NIC은 진짜 물리적인 NIC이 아니라, Software NIC이다. 즉 하드웨어를 소프트웨어로 구현했다.

그럼 또 궁금한게 VMware에 깐 리눅스의 NIC은 하드웨어가 아니라 소프트웨어 NIC인데 .. 어떻게 인터넷이 되는걸까?

Guest OS(VMware에 설치한 리눅스)의 NIC들은 일명 Virtual NIC Driver라는 것에 연결이 되어있다. 이또한 실체하는게 아니라 Driver만 있는 소프트웨어다.

재밌는건 Guest OS의 Software NIC은 Host OS의 Virtual NIC Driver을 마치 L2 Switch처럼 쓴다는 것이다. 그래서 Guest OS에서 크롬같은 브라우저를 띄우면 계층을 타고내려가면서 Virtual NIC Driver에 간후 VMnetwork로 간다.

이 VMnetwork는 Host OS의 Device driver와 통신한다. 그렇게 Host OS의 NIC을 타고 인터넷으로 나갈 수 있게된다. 당연히 반대로 들어올수도 있다ㅎㅎ

이렇게하면 가상화기술을 활용해서 컴퓨터하나로 여러개를 쓸 수 있는건 알았다. 그럼 도커(docker)는 왜 탄생하게 되었고 현재 핫한걸까?


지금까지의 내용 중 프로세스의 개수는 몇개일까 ?

  • Host OS Process
  • Host OS OS(윈도우)
  • Guest OS#1의 Process
  • Guest OS#1의 OS
  • Guest OS#1의 S/W NIC
  • Guest OS#2의 Process
  • Guest OS#2의 OS
  • Guest OS#2의 S/W NIC

총 8개가 나온다. 대충만해도 컴퓨터하나에 프로그램이 8개 이상 작동하고 있는셈이다. 여기서 생각해볼 것이 GuestOS는 Process들 때문에 가상머신을 쓰고 있는데 OS와 S/W NIC 은 꼭 필요한 것인가? 없어도 되지않을까?

그래서 탄생한게 도커(docker)다.

기본적으로 컴퓨터시스템이라고 하는것은 어플리케이션때문에 윈도우를 깔고 Cpu를 좋은것을 쓰던가한다. 그런데 이 위에다가 Vmware이나 Hypervisor같은 가상화기술을 적용해서 컴퓨터의 OS위에 또다른 컴퓨터 하나를 만들어냈다.

이때 운영체제가 같은 점을 활용해서 이를 묶어서 추상화를 해준다. 그리고 컨테이너라는 것으로 JVM비슷하게 대신해주는 구조를 만들어낸다. (JVM은 네트워크 포스팅 중 웹서비스 참고)

OS가 없어진게 아니라 이미있던 하나의 OS를 Container가 여러번 실행해하는 셈이다.

그 결과 Guest OS의 OS와 S/W NIC을 없애버릴 수가 있다. 이것이 도커!!

이게 어떻게 가능할까?

Guest OS의 Application가 실행될 때 구현상 필요로하는 것들, 외부에서 끌어다오는 라이브러리들을 한 묶음으로 Container라 그런다.

중요한건 Kernel과 H/W 역할을 도커엔진이 대신해주는데, Container가 Call하면 도커엔진이 Kernel과 H/W에 가서 응답을 가져오는 방식이다. 그래서 굳이 Application 작동시키자고 OS나 하드웨어 프로그램을 돌릴필요가 없어진다. 이로인해 효율이 급속도로 좋아졌다. 이로인해 너도나도 도커를 얘기한다.

그니까 웹개발만해도 Web Server 든 WAS server든 DB든 여러 종류가 있을 수 있는데 다 도커에 넣어서 실행시키면 효율이 뛰어날 것이다.

문제는 컨테이너라는것이 가끔식 맛이가기때문에 관리를 해야한다. 이에 탄생한 것이 쿠버네티스다.

출처: 쿠버네티스 공식홈페이지

쿠버네티스 공식홈페이지에 나오는 내용처럼 쿠버네티스는 여러 기능을 제공하지만 결국은 컨테이너를 관리해준다는 의미임을 기억하자.