본문 바로가기

Container/Docker

[Docker] 도커 기본 개념

728x90
반응형

도커를 사용할 때의 흐름

  1. 도커 클라이언트(CLI)에 원하는 명령을 위한 명령어를 입력함.
  2. 도커 서버(도커 데몬)가 도커 클라이언트에 입력한 명령어를 전달받으면 명령어에 따른 이미지를 생성하고, 컨테이너를 실행 그리고 해당 컨테이너에서 애플리케이션을 실행함.

이 흐름을 이용해 hello-world 프로그램을 실행 시켜보자.

터미널에 다음과 같은 명령어 입력.

# docker가 설치되어 있는 환경
docker run hello-world

도커로 프로그램을 실행 시킬 때 도커 내부에서 처리되는 과정

  1. 도커 클라이언트에 명령어를 입력하면 클라이언트에서 도커 서버로 요청을 보냄.
  2. 서버에서 hello-world라는 이미지가 로컬에 이미 다운되어 있는지 확인.
  3. 기존에 내려받은 hello-world 이미지가 없기 때문에 "Unable to find image 'hello-world:lastest' locally"라는 문구가 출력.
  4. 도커 이미지가 저장된 도커 허브에서 hello-world 이미지를 가져오고, 로컬에 보관.
  5. 이제 hello-world 이미지가 있으니 그 이미지를 이용해서 컨테이너를 생성.
  6. 생성된 컨테이너는 이미지에서 받은 설정이나 조건에 따라 프로그램을 실행.

이미지가 캐시에 보관된 상태에서의 실행(Unable to find image 'hello-world:lastest' locally가 안뜸)

 

 

가상화

가상화 기술이 나오기전에는 한 대의 서버를 하나의 용도로만 사용했기 때문에 사용하고 남은 서버의 공간은 그대로 방치했었다.

이러한 방법은 안정적이지만, 사용하지 않는 공간이 많기 때문에 비효율적인 면이 있다.

 

이런 비효율적인 면을 개선하기 위해 하이퍼바이저 기반의 가상화 기술이 출현했다.

이 기술은 "논리적으로 공간을 분할하여 가상머신(VM)이라는 독립적인 가상 환경에서 서버를 이용하는 기술"이다.

하이퍼바이저는 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있게 하는 소프트웨어이면서, 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자이기도 한다.

 

하이퍼바이저의 종류

네이티브 하이퍼바이저

  • 하이퍼바이저가 하드웨어를 직접 제어함.
  • 자원을 효율적으로 사용할 수 있음.
  • 별도의 호스트OS가 없으므로 오버헤드가 적음.
  • 여러 하드웨어 드라이버를 설치해야 하므로 설치가 어려움.

 

호스트형 하이퍼바이저

  • 일반적인 소프트웨어처럼 호스트 OS 위에서 실행됨.
  • 하드웨어 자원을 VM 내부의 게스트 OS에 에뮬레이트 하는 방식임.
  • 오버헤드가 크나 게스트 OS 종류에 대한 제약이 없고 구현이 다소 쉬움.
  • 많은 사람들이 주로 사용함.

 

호스트형 하이퍼바이저의 구조

 

 

도커와 기존 가상화 기술

도커와 기존 가상화 기술은 구조가 비슷하고 공통점을 살펴보면 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치한다는 점이 공통점이다. 차이점을 살펴보면 격리된 환경을 얼마나 격리시키는지가 다르다.

도커 컨테이너에서 구동되는 애플리케이션은 컨테이너가 제공하는 격리 기능 내부에 샌드박스가 존재하지만, 같은 호스트의 다른 컨테이너와 동일한 커널을 공유함.

 

이러한 특징 덕분에 컨테이너에서 실행되는 프로세스는 호스트 시스템에서 볼 수 있다. 또 컨테이너가 전체 OS를 내장할 필요가 없기 때문에 컨테이너는 매우 가볍고 일반적으로 용량이 아주 작다.

 

가상머신과 함께 가상 머신 내부에서 실행되는 모든 것은 호스트 OS 또는 하이퍼바이저와 독립되어 있다. 시작 시각에 가상 머신 환경을 위한 커널을 부팅하고 운영체제 프로세스 세트를 시작해야한다. 

 

이러한 특징 때문에 응용프로그램만 포함하는 일반적인 컨테이너보다 VM의 크기를 훨씬 크게 만든다.

 

 

도커 컨테이너의 구조

 

 

각 도커 컨테이너가 격리시키는 원리를 알아보자.

먼저 리눅스에서 쓰이는 Cgroup(control group)네임스페이스(namespace)에 대해 알아야한다. Cgroup과 네임스페이스는 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널의 기능들이다. 도커 컨테이너는 이 커널 기능을 이용해 컨테이너와 CPU 등을 격리한다.

 

Cgroup은 CPU, 메모리, 네트워크 대역폭, HD I/O 등 프로세스 그룹의 시스템 리소스 사용량을 관리한다.

ex. 어떤 어플리케이션의 사용량이 너무 많은 경우, 그 애플리케이션을 Cgroup에 배치하여 CPU와 메모리 사용을 제한

 

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

 

이렇게 컨테이너에서 프로세스를 작동시키는 데 필요한 양만큼 하드웨어를 할당할 수 있다.

 

 

도커로 응용 프로그램을 실행하는 데 필요한 것들

도커로 응용 프로그램을 실행할 때 실행할 명령어와 실행하고자 하는 프로그램을 구성하는 파일 스냅숏이 필요하다.

명령어를 입력하면 컨테이너가 시작된다. 이 때 도커 이미지는 명령어를 가지고 있어야 한다. 그리고 파일 스냅숏(디렉터리나 파일을 복사한 것 == 파일을 실행하는데 필요한 파일들)이 필요하다. 

 

도커 이미지를 통해 컨테이너가 실행되는 과정

 

1. 도커 이미지에 있는 파일 스냅숏을 컨테이너에 있는 하드디스크로 옮겨준다.(컨테이너 안에서 애플리케이션을 설치하고 실행해야 하므로)

 

2. 도커 이미지에서 가지고 있는 명령어(컨테이너가 실행될 때 사용할 명령어)를 컨테이너에 전달한다.

 

3. 컨테이너가 실행될 때 명령어를 이용해 hello-world 애플리케이션을 실행한다.

 

 

다른 OS에서 Cgroup과 네임스페이스를 사용할 수 있는 이유

Cgroup과 네임스페이스는 리눅스 환경에서 사용되는 것인데 windows나 MacOS 환경에서 사용되어 컨테이너 격리가 가능한 이유는 다음과 같다.

 

도커 서버는 리눅스 VM 환경에서 동작 하므로 다른 OS를 사용하더라도 Cgroup과 네임스페이스를 사용하여 컨테이너를 격리할 수 있다.

728x90
반응형