TIL

24/01/27 TIL __ 도커(1)

GABOJOK 2024. 1. 27. 23:57

 

 

 

팀 프로젝트에서 도커를 사용하기로 했다.

담당 파트는 아니였지만, 계속 함께 사용해야 할 듯 보여 공부했다.

 

 

 

 

개념적인 부분을 정리해 본다. 

 

 

 

 

🦊  가상화 기술

 

도커에 대해 말하기 전에 먼저 가상화 기술에 대해 적어보려 한다. 

하나의 컴퓨터를 가지고 여러대를 사용하는 것처럼 사용하는걸 가상화 기술이라고 하는데,

이는 서비스의 안정성을 위해 많이 사용된다.

 

하나의 프로그램이 버그가 발생한다면, 다른 애들은 먹통이 되기 때문이다. 

 

가상화 기술을 통해 사용자가 직접 리소스를 분배해 운영함으로 서비스가 안정적으로 작동할 수 있게 된다.

위와 같은 버그 상황이 똑같이 발생하더라도, 하나만 먹통되고 끝나기 때문이다. 

 

가상화 기술에는 하이퍼바이저, 컨테이너로 크게 나뉘어 진다. 

 

 

 

 

🐱 하이퍼바이저 가상화


"하이퍼 바이저 가상화" 는 

  • 물리적 서버에 호스트 os를 설치해, 이 운영체제 위에 하이퍼 바이저를 설치한다. 
  • 하이퍼바이저는  호스트 os의 자원을 격리 후 새로운 guestOS를 할당한다.
  • 여러 운영체제를 하나의 컴퓨터에서 동시에 실행할 수 있게 하는 기술이다. 
  • 가상 머신에 하드웨어 자원을 할당하고 관리하는 역할을 한다.
  • (이말은 가상머신 만들때마다 프로그램 디스크 공간을 차지한다는 말.)

 

만약 host os인 mac os에서 vm으로 window os를 설치하고 사용한다고 해보자.

이때 host os는 guest os가 요청한 시스템 콜을 처리할 수 없다. 

하이퍼바이저가 다른 커널간의 언어를 통역해 주는 통역가 역할을 한다. 

또한 각 os마다 격리된 공간을 만드는 역할도 하며 guest os와 host os가 분리된 역할을 한다. 

 

이렇게 다양한 레이어가 있다보니 구성, 실행시간이 길고, 하나의 guest os가 차지하는 오버헤드가 크다.

 

(커널 : os가 하드웨어 사용하기 위해 소통하고, 사용하도록 한다.)

(시스템콜: 하드웨어를 직접 조작할 수 없으니 커널에게 해달라고 하는 요청. 이 요청을 시스템 콜이라고 한다.)

 

 

 

🐱 컨테이너 가상화

  • 기존 하이퍼바이저 가상화 보다 훨씬 빠르다. 
  • 실행속도가 20배 가량 차이가 난다.
  • 리눅스 kernal이 제공하는 LXC 라는 자체 격리기술에서 출발했다고 하는데,
  • 이것을 사용하면 하이퍼바이저가 없어도 격리공간(컨테이너)을 만들수 있게 된다.
  • 정리해보자면, 하이퍼바이저 없이, 커널의 자체기술을 활용한 가상화이고,
  • 모든 컨테이너는 host os의 커널을 공유해 사용한다. 중간단계가 없다. 
  • (하이퍼 바이저는 분리해 사용)
  • 커널이 실제 격리를 수행해 주는 역할을 한다

 

 

🐱 Docker

  • 컨테이너 가상화 도구중 하나로, 커널의 컨테이너 가상화 기술을 쉽게 사용가능하도록 하는 애다.
  • 컨테이너 런타임
    • 직접 커널과 통신해 실제로 격리된 공간을 만드는 애다.
    • 도커에서는 runc 라는 컨테이너 런타임을 기본으로 지원한다.
  • 컨테이너 엔진
    • 사용자 요청을 받아 컨테이너를 관리하는 애 이다. 

 

 

🐱 Docker의 아키텍쳐

 

  • docker에서 제공하는 command line 도구인 docker CLI를 이용한다고 가정해보자.
  • 클라이언트가 명령을 입력하면, docker CLI가 api양식에 맞게 전달한다. 
    • (간단하게 api와 통신하도록 돕는다)
    • 컨테이너 실행, 조회, 삭제 와 같은 api가 있다.
  • 도커 데몬은 데이터를 받아서 클라이언트의 요청을 분석후
  • 커널을 통해 컨테이너 리스트를 불러와 클라이언트에게 결과를 전달한다. 
    • 이 도커 데몬은 host os에서 지속적으로 실행되며, 클라이언트 요청에  따라 컨테이너를 관리한다.
  • docker CLI는 받은 결과를 클라이언트에게 전달한다. 

 

 

 

🐱 Docker 컨테이너의 실행 흐름.

 

docker를 이용해 컨테이너를 만들고 클라이언트와 통신할 때에 어떤 플로우로 흐르는지 알아보자. 

  1. 먼저 도커를 설치한다. 
  2. "docker run -p 포트:포트 --name 컨테이너이름 nginx"   명령어를 이용해 cli가 클라이언트 명령을 api양식에 맞게 만든다.
  3. 이걸 도커 데몬에게 전달한다.
  4. 도커데몬은 들어온 요청을 분석 후 지정된 nginx를 기반으로 컨테이너 런타임을 통해 컨테이너를 생성한다.
  5. 컨테이너가 생성되고 나면 유저는 local host에 접속할 수 있고
  6. 컨테이너에 실행중인 nginx 프로세스에서 결과를 전달받아 웹페이지에 제공한다.
  7. 포트를 통해 호스트와 컨테이너의 연결이 설정되어 있기 때문에, 사용자의 요청은 컨테이너 내 실행 중인 nginx 서버로 전달

 

 

 

요약정리

 

하이퍼 바이저 가상화는

    물리적 서버의 자원을 가상화하여 여러 가상 머신(VM)이 각자의 운영체제를 가지고 독립적으로 실행될 수 있게 한다.

 

컨테이너 가상화는

   하나의 호스트에서 여러 컨테이너를 실행할 수 있고,

   각 컨테이너는 동일한 호스트의 커널을 공유하지만, 프로세스, 메모리, 파일 시스템 등에서는 독립적으로 작동한다.

 

컨테이너 런타임은 직접 커널과 통신해 실제로 격리된 공간을 만드는 애

컨테이너 엔진은 사용자 요청을 받아 컨테이너를 관리하는 애.

도커 데몬은 요청을 분석해 컨테이너 런타임을 통해 컨테이너 만든다.