DevOps/Docker

도커의 원리와 가상화

Code Maestro 2023. 5. 9. 17:53
728x90

1. Process

도커를 알아보기 전에 Process에 대해 알아보겠다. 프로세스는 프로그램이 실행된 단위이다.

 

작업 표시줄에 들어가보면 

위의 그림처럼 프로그램이 실행된 프로세스들을 볼 수 있다.

 

그러면 Chrome이 왜 여러 개 띄어져있을까? Multi- tasking 때문이다.

 

 

위의 사진처럼 크롬은 멀티 태스킹을 제공하여 여러 개의 브라우저 탭을 동시에 사용할 수 있다. 이 포스팅은 도커에 관한 포스팅이라서 멀티 태스킹의 자세한 설명은 생략하겠다.

 

다시 프로세스로 돌아가서

 

기존에는 프로세스가 위의 사진처럼 실행이 된다.

 

User 계층에서 프로세스가 실행되고, PID는 프로세스 고유의 ID를 나타낸다. Kernel 계층에서 프로세스를 관리하고, H/W 계층에서는 CPU와 RAM에 메모리를 할당받는다. 

 

그런데 Chrome 프로세스를 위의 사진처럼 따로 분리시키면 어떻게 될까? 

 

2. Docker Container

User+ Kernel 계층을 합쳐서 컨테이너로 만들면 process의 행위가 제한된다. 즉, 독립적으로 새로운 OS를 쓰는 것처럼 작동한다. 

 

도커가 성능이 좋은 이유가 무엇일까?

 

Host OS 입장에서 커널에서 실행되는 또 하나의 프로세스로 처리된다. 컨테이너로 만들면 자신만 다른 세상에서 떨어진 것처럼 따로 작동하여 격리가 된다. 비유하자면 애니메이션이나 영화에 나오는 '결계'라고 생각하면 된다.

 

바깥에 있는 애들이 통신하려면 어떤 절차를 따라야 하고, 어떤 난리를 쳐봤자 이 안으로 행위가 제한이 된다. 메모리 관리는 OS와 docker 시스템에서 알아서 관리해주고 있다. 그래서 도커가 커널을 공유하기에 성능이 좋은 것이다. 

 

OS는 프로세스 단위로 자원을 할당한다. 어떤 자원이 도커에 영향을 주냐? 메모리다. 그래서 메모리가 엉키지 않도록 OS가 강력한 영향을 끼친다. 당연히 도커는 가상 메모리(Virtual memory) 체계를 사용한다.

 

 

결론: 도커 컨테이너의 프로세스라는 것은 Host OS 입장에서 프로세스와 같다. Host 입장에서 프로세스가 죽으면 컨테이너 안의 프로세스도 죽는다. 커널을 공유하는데, 이걸 컨테이너라는 이름으로 격리시킨 것이다. 커널의 OS가 개별적으로 실행되니까 마치 독립 컴퓨터가 하나 더 생긴 것과 같은 현상이 나타난다. 

 

 

3. 가상화

1) 가상 메모리란?

 

모든 프로세스는 고유공간(Memory)를 OS에서 보장 받는다. 

 

 

이걸 Virtual Memory라고 한다. 가상 메모리는 RAM을 말하는 것으로 

HDD 같은 2차 메모리와 RAM 같은 주기억 장치를 합쳐서 하나의 메모리로 추상화한 것이 Virtual Memory이다. 

 

보통 OS는 프로세스마다 1.7GB의 가상 메모리를 제공한다. 그러나 실제로는 프로세스마다 1.7GB를 다 못쓴다. 몇십 몇백개의 프로세스가 띄어져있는데 40GB가 넘는 메모리를 제공한다? 말이 안 된다. 그럼에도 쓸 수 있는 이유는 가상 메모리 형태로 운영체제가 메모리 추상화를 해줬기 때문이다. 

 

가상 메모리 공간이라 하는 것은 Process마다 독립적인 공간을 뜻한다. 이다.

만약 개별 프로세스 Word#2에서 편집을 한다면 2번이 쓰는 가상 메모리에 저장이 된다. 1번이 쓰는 메모리에 침범하면 잘못된 연산이고, 절대 그러면 안 된다. 이렇게 독립적으로 동시에 작동될 수 있도록 운영체제가 지원하는 걸 Multi-tasking 운영체제라고 한다. 이미 Multi tasking 환경에서는 각각의 프로세스가 가상 메모리 체계를 활용하고 있다. 

 

2) vmware

NIC(네트워크 인터페이스 카드)가 한 개밖에 없다. 이런 환경에서 vmware를 설치하면

 

드라이버가 여러 개 생성된다. 기존에 Windows 운영체제가 설치됐는데 만약 linux 운영체제도 사용하고 싶다면.

 

 

위의 그림처럼 vmware로 linux를 설치할 수 있다.

리눅스 안에서의 NIC은 SW를 HW로 구현하게 된다.

 

그런데 NIC은 컴퓨터에서 한 개인데 어떻게 linux 안의 NIC은 작동이 되는걸까? 

 

리눅스 안의 NIC이 Virtual Nic Driver와 연결되기 때문이다. 그럼에도 Virtual Nic Driver는 실제 있는 게 아니라 Driver만 있는 소프트웨어이다. 

 

vmware를 설치한 컴퓨터를 host OS라 부르고

설치된 리눅스를 Guest OS라고 부른다.

 

Virtual Nic Driver를 마치 L2 스위치처럼 사용한다. 사실상 공유기를 SW적으로 설치한 것이다.

 

virtual Nic Driver는 NAT를 지원. 공유기 역할을 해준다. 그러면 NIC이랑 통신한다. 

 

이렇게 가상화 기술로 컴퓨터 한 개로 여러 개로 쓸 수 있다. 

 

 

 

 

그런데 만약 내가 게임을 하기 위해 컴퓨터를 사용한다고 가정해보면 어떤 목적으로 쓴다고 말할 수 있을까? 그냥 컴퓨터가 아닌 게임기 목적이나 다름없다. 이런 식으로 각각의 용도에 따라 엑셀, 계산기 등. 컴퓨터 정체성은 사용할 SW가 무엇이냐에 따라 결정된다

 

 

 

위의 그림에서 사용하는 프로그램 개수를 세보면 대충 8개임을 알 수 있다. 그런데 가상머신을 왜 사용할까?

사실상 3번, 6번을 사용하기 위해 가상머신을 사용하는거나 다름없다

 

그러면 4, 5, 7, 8번은 꼭 필요한 것일까요? 

 

3) Docker

 

기존의 배포는 App 때문에 운영체제와 CPU를 설치한다.

 

Virtualized Deployment는 가상화 기술을 적용해서 Hypervisor를 위에 올려놓고, 또다른 컴퓨터를 올려둔다.

근데 과연 App 하나 실행하고자 Operating System이 또 필요할까? 그런데 때마침 기존 OS와 가상머신의 OS가 같다면?

출처:쿠버네티스 공식문서

Container Deployment는 묶어가지고 추상화. Hypervisor는 Container Runtime으로 JVM 비슷하게 대신해준다.

출처:쿠버네티스 공식문서

 

OS를 여러번 실행한 것처럼 독립적으로 연결해준다. 

 

이렇게 4, 5, 7, 8번을 없애버릴 수 있다. 이렇게 탄생한 게 바로 도커이다

 

이게 왜 가능할까? 

도커를 사용하면 공통 부분을 제거. OS와 HW를 제거해서 효율이 급속도록 좋아질 수밖에 없다

 

 

가상화 기술을 사용하지 않고, 도커 기술을 사용하면 거의 효율이 2배 이상 좋아질 가능성이 크다. (무조건 2배 이상 좋아지는 게 아닌, 환경에 따라서 달라진다.) 이로 인해 너도나도 도커 기술을 사용한다.

 

또한 애플리케이션을 배포하기 너무 좋다. web, was, db를 한꺼번에 도커에 때려박아서 실행시킬 수 있기 때문이다. 

 

 

그럼에도 문제는 가끔 컨테이너들이 에러가 날 수 있는데... 이럴 때 탄생한 게 Kubernates이다. 

 

출처:https://people.wikimedia.org/

쉽게 말하면 쿠버네티스는 도커 컨테이너들을 쉽게 관리해준다. 

 

 

4. 정리

VMware 측면에서 4,5,7,8. 겹치는 측면들을 제거 => 똑같이 작동되게 만들어주자. 이게 도커이다.

 

도커는 호스트 운영 체제의 커널을 공유하여 리소스의 효율성을 높이기에 성능이 좋을 수밖에 없다. 

 

쿠버네티스는 이런 도커 컨테이너들을 관리해준다. 

 

 

 

출처:  쿠버네티스 공식 문서널널한 개발자 TV

728x90