Docker

Docker - Docker 의 흐름 및 Vm,Docker 비교

존태 2022. 9. 3. 16:36

Docker를 사용할때 

 

1. 먼저 도커 CLI에 커맨드를 입력한다.

2. 그러면 도커 서버 (도커 Daemon)이 그 커맨드를 받아서 그것에 따라 이미지를 생성하든 컨테이너를 실행하든 모든 작업을 하게 된다.

 

실제로 CLI에서 커맨드를 입력해보기
1. docker run hello-world

 

설명 

1. 도커 클라이언트에 다가 커맨드를 입력하니 클라이언트에서 도커 서버로 요청을 보낸다.

2. 서버에서 hello-world라는 이미지가 이미 로컬에 cache가 되어 있는지 확인

3. 현재는 없기에  Unable to find image ~라는 문구가 2번째 줄에 표시

4. 그러면 Docker Hub이라는 이미지가 저장되어 있는 곳에 가서 그 이미지를  가져오고 로컬에 Cache로 보관한다. 

5. 그 후 이제는 이미지가 있으니 그 이미지를 이용해서 컨테이너를 생성한다.

6. 그리고 이미지로 생성 된 컨테이너는 이미지에서 받은 설정이나 조건에 따라 프로그램을 실행을 한다.

 

이제 hello-world 이미지가 캐쉬가 되어있으니 한번 더 docker run hello-world 하면 어떻게 될까? 

1. Unable to find image ~ 라는 문구가 없이 프로그램이 실행됨.

2. 결국은 캐쉬 된 이미지를 이용해서 컨테이너를 만든 후 프로그램을 실행.

 

이러한 가상화 기술에서 나온 컨테이너 가상화 기술

VM과 비교했을 때 컨테이너는 하이퍼바이저와 게스트 OS가 필요하지 않으므로 더 가볍습니다.

 

애플리케이션을 실행할 때는 컨테이너 방식에서는 호스트 OS위에 애플리케이션의 실행 패키지인 이미지를  배포하기만 하면 되는데 VM은 애플리케이션을 실행하기 위해서 VM을 띄우고 자원을 할당한 다음,  게스트 OS를 부팅하여 애플리케이션을 실행해야 해서 훨씬 복잡하고 무겁게 실행을 해야 합니다.
 

 

공통점 

도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법입니다.

 

차이점 

 

가장 큰 차이점은 격리된 환경을 얼마나 격리를 시키는지의 차이

 

도커 컨테이너에서 돌아가는 애플리케이션은 컨테이너가 제공하는 격리 기능 내부에 샌드박스가 있지만, 여전히 같은 호스트의 다른 컨테이너와 동일한 커널을 공유한다. 결과적으로, 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템(모든 프로세스를 나열할 수 있는 충분한 권한있음)에서 볼 수 있다.
예를 들어, 도커와 함께 몽고DB 컨테이너를 시작하면 호스트(도커가 아님)의 일반 쉘에 ps-e grep 몽고를 실행하면 프로세스가 표시됩니다.
또한, 컨테이너가 전체 OS를 내장할 필요가 없는 결과, 그것들은 매우 가볍고, 일반적으로 약 5-100 MB이다.


가상 머신과 함께 VM 내부에서 실행되는 모든 것은 호스트 운영 체제 또는 하이퍼바이저와 독립되어 있다. 가상 머신 플랫폼은 특정 VM에 대한 가상화 프로세스를 관리하기 위해 프로세스를 시작하고, 호스트 시스템은 그것의 하드웨어 자원의 일부를 VM에 할당한다. 그러나 VM과 근본적으로 다른 것은 시작 시간에 이 VM 환경을 위해 새롭고 이 특정 VM만을 위한 커널을 부팅하고 (흔히 다소 큰) 운영 체제 프로세스 세트를 시작한다는 것이다. 이것은 응용 프로그램만 포함하는 일반적인 컨테이너보다 VM의 크기를 훨씬 크게 만든다.
OS까지 가상화...  맥에서 윈도우를 깐다든지 리눅스에서 윈도우를 돌린다든지...
이러한 방법은 비교적 사용법이 간단할 수 있지만 굉장히 느리다.

 

컴퓨터에 실행되고 있는 프로세스들

위에서 보면 컨테이너들을 격리시키는데 어떻게 해서 도커 컨테이너를 격리를 시키는 걸까?

먼저 리눅스에서 쓰이는 Cgroup(control groups)과 네임스페이스(namespaces)에 대해서 알아야 합니다.

이것들은 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능들입니다. 

 

C Group


CPU, 메모리, Network Bandwith,
 HD i/o 등 프로세스 그룹의
시스템 리소스 사용량을 관리
=> 어떤 어플이 사용량이 너무 많다면
그 어플리케이션 같은 것을 C group에 집어넣어서 CPU와 메모리 사용 제한 가능

 

네임스페이스


하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술 
별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술