본문 바로가기
개발 지식/Docker

01. 가상화 기술

by gamdong2 2024. 12. 17.

📖 학습 목표

  • 애플리케이션 서버
  • 가상화 기술과 하이퍼바이저 가상화
  • 컨테이너 가상화
  • 도커
  • API

1. 애플리케이션 서버

1) 서버란?

하드웨어 or (하드웨어에서 실행 중인) 소프트웨어
 

2) 서버와 클라이언트

클라이언트가 서버에게 요청을 보냄 -> 물리적인 하드웨어를 통해 소프트웨어로 전달 -> 소프트웨어가 요청에 대한 기능을 수행 -> 클라이언트에게 결과 응답 

서버와 클라이언트

3) 서버의 종류

실행 중인 소프트웨어에 따라 종류가 나뉨

  • 파일 서버: 클라이언트에게 파일 공유 (파일 공유 소프트웨어가 설치된 서버)
  • DB 서버: 클라이언트에게 데이터 저장 기능 제공 (DBMS가 설치된 서버)
  • 웹 서버 (WEB): 클라이언트가 웹 브라우저를 통해 HTTP 요청을 보냄 -> 정적인 웹페이지를 제공 (프론트엔드)  
    • ex: Nginx
  • 웹 애플리케이션 서버 (WAS): 프로그래밍 언어로 개발된 백엔드 애플리케이션을 실행하는 서버
서버의 종류

4) 엔터프라이즈 서버 운영

기업에서 많은 양의 서버를 운영하는 방법

  • 베어메탈 (Baremetal): 서버를 구입 -> 서버 위에 OS 설치 -> 여러개의 소프트웨어를 실행시킴
    • 기업에서 운영하기엔 비효율적 
  • 하이퍼바이저 (Hypervisor)
  • 컨테이너 (Container)
엔터프라이즈 서버 운영 종류

 

2. 가상화 기술과 하이퍼바이저 가상화

1) 가상화 기술이란?

  • 실제로 존재하는 컴퓨터가 아니지만 마치 존재하는 것처럼 만들어주는 기술
  • 가상화 기술을 통해 한 대의 컴퓨터(실제로 존재 "물리적") 에서 여러 대의 컴퓨터(가상의 존재 "논리적")를 실행시킬 수 있음

2) 가상화 기술을 사용하는 이유

  • 소프트웨어를 하나의 OS에서 운영시, 소프트웨어 간의 간섭 문제 발생
    • 여러개의 소프트웨어 중, 하나에 문제가 생기면 나머지 소프트웨어 운영에도 영향; 기업 운영시 치명적
  • 가상화 기술을 통해 하나의 물리적 OS 환경에 여러개의 논리적 OS 환경을 만들 수 있음
    • 여러개의 소프트웨어 중, 하나에 문제가 생기더라도 나머지 소프트웨어 운영에 영향X
가상화 기술
  • 요즘 추세: 하드웨어 성능↑ & 소프트웨어의 요구사항↓
    • 기업 입장에선 높은 성능의 하드웨어 한대를 운영하는게 이득

3) 하이퍼바이저 가상화

  • OS 프로그램을 통해 가상화 환경들을 관리
  • 하이퍼바이저 제품: vmware, VirtualBox, Red Hat
  • 가상환경을 만들 때 마다 디스크 공간(Storage)을 차지, 실행시 지정한 만큼의 CPU, MEM를 사용 
    • 호스트 OS: 물리적 하드웨어 위에서 동작하는 운영 체제
    • 하이퍼바이저(s/w): 호스트 OS 자원을 가상화하여 게스트 OS를 실행하는 환경을 제공
    • 게스트 OS: 하이퍼바이저가 제공하는 가상 환경(=가상머신)에서 실행되는 독립된 운영 체제
    • 가상머신: 게스트 OS가 실행되는 논리적 가상 환경
    • 프로세스: 게스트 OS 내에서 실행 중인 프로그램
하이퍼바이저 가상화
[tip] OS(Operating System, 운영 체제)
- 정의: 컴퓨터 하드웨어와 사용자가 실행하는 소프트웨어 사이에서 중간 역할을 하는 소프트웨어. 컴퓨터 시스템의 자원을 관리하고, 사용자가 프로그램을 실행할 수 있도록 환경을 제공하는 핵심 소프트웨어
- 종류: 데스크톱/노트북 OS(Windows, macOS, Linux), 모바일 OS(Android, iOS), 서버 OS(Ubuntu Server, Window Server)

 

3. 컨테이너 가상화

1) 하이퍼바이저 가상화 vs 컨테이너 가상화

  • 컨테이너 가상화가 선호되는 이유: 가볍고 빠름

2) 컨테이너 가상화

  • 리눅스 커널의 자체 격리 기능 사용
[tip] 리눅스 커널 기능
컨테이너 기술의 핵심은 리눅스 커널에서 제공하는 두 가지 주요 기능
- Cgroups (Control Groups): 리소스(CPU, 메모리, 디스크 I/O 등) 제한 및 격리를 제공
- Namespaces: 프로세스, 네트워크, 파일 시스템 등의 격리를 제공
이러한 커널 기능은 컨테이너의 격리와 리소스 관리의 기반이 됨

* LXC (Linux Containers)
- LXC는 리눅스 커널의 Cgroups와 Namespaces 기능을 사용자 친화적으로 활용하기 위한 도구이자 라이브러리
- 사용자가 직접 리눅스 커널 기능을 다루지 않고도 쉽게 컨테이너를 생성하고 관리할 수 있게 도움
- 하이퍼바이저(VMware, VirtualBox 같은 별도 소프트웨어) 없이 리눅스 커널만으로 작동

* Docker
- LXC와 비슷하게 리눅스 커널의 기능(Cgroups, Namespaces)을 기반으로 동작하지만, 추가적인 레이어와 도구를 제공
[tip] 커널(Kernel)
컴퓨터 운영 체제(OS)의 핵심(Core) 부분으로, 하드웨어와 소프트웨어를 연결하는 중간 다리 역할을 함
리눅스 커널의 자체 격리 기능
  • 컨테이너: 격리된 공간
    • 모든 컨테이너가 하나의 커널(Host OS' Kernal)을 공유: 적은 오버헤드(하드웨어 리소스 사용 요청 효율↑), 빠른 부팅
    • Host OS와 다른 종류의 OS는 실행할 수 X
하이퍼바이저 가상화 VS 컨테이너 가상화
[tip] 오버헤드(Overhead)
시스템 자원을 사용할 때 추가적으로 발생하는 비용을 의미. 컴퓨터 시스템에서 오버헤드는 주로 성능, 시간, 메모리, 네트워크 대역폭 등과 관련된 추가적인 부하를 가리킴
  • 실제 격리를 수행하는 주체: Kernel 자체 (Docker 라는 s/w 가 X)
    • Docker: Kernel의 가상화 기술의 사용성을 높이는 보조 도구
[tip] Docker: LXC 기술을 기반으로 컨테이너를 쉽게 관리하고 배포할 수 있게 해주는 도구
- LXC 자체는 Docker 없이도 사용할 수 있는 컨테이너 기술. 리눅스 커널만 있으면 동작하며, 하이퍼바이저 같은 추가 소프트웨어가 필요 없음
- Docker는 LXC를 기반으로 발전했으며, 컨테이너의 사용성을 높이는 도구
  LXC Docker
레벨저수준 컨테이너 도구고수준 컨테이너 플랫폼
주요 사용 사례VM처럼 동작하는 컨테이너 생성배포, 개발, 오케스트레이션
관리 방식수동 설정 (고급 사용자용)자동화 및 간소화된 관리
이미지 지원기본 이미지 지원 부족Docker 이미지와 레지스트리 지원
네트워킹네트워킹 설정 직접 필요네트워킹 자동화
LXC에서 발전된 Docker

4. 도커

1) 개념

  • 도커: 컨테이너를 관리하기 위한 소프트웨어(컨테이너 플랫폼)
    • 컨테이너 플랫폼 ⊃ 컨테이너 엔진, 컨테이너 런타임
      • 컨테이너 엔진: 사용자의 요청을 받아 컨테이너를 관리
      • 컨테이너 런타임: 직접 커널과 통신하며, 실제로 격리된 공간을 만듦 (도커: RUNC 사용)

2) 동작 방식

  • 도커는 클라이언트-서버 모델로 실행됨
    • 클라이언트(Docker CLI): 사용자는 CLI에 간단한 명령어를 입력하여 Docker Daemon에 요청을 전달
    • 서버(Docker Daemon): 요청을 받아 컨테이너 생성, 실행, 중지, 삭제 등 다양한 작업을 처리
      • 실제로 컨테이너를 관리하는 서버(호스트 OS의 커널 기능을 활용)
      • 클라이언트가 컨테이너 관리 기능을 사용할 수 있도록 API 제공 
  • Docker CLI를 통해 명령어 한 줄로 API와 통신할 수 있음 
    • 커멘드 라인 클라이언트 툴 (CLI: Command Line Interface)
      • 매 작업마다 API 양식에 맞게 요청을 전달하는건 비효율
      • 클라이언트가 명령어를 입력 -> 서버(도커 데몬)의 API 양식에 맞게 만들어 대신 전달
Docker CLI로 명령 보내기

 

3) 예시로 이해하기

① 사용자: Docker CLI에 명령어 입력 ($ docker ps)
② Docker CLI: 사용자 명령을 API 양식에 맞추어 변환 -> Docker Daemon에 API 요청
③ Docker Deamon: 요청을 분석하여 Kernel을 통해 컨테이너 리스트를 불러옴 -> CLI에 JSON 형태로 결과 전달
⑤ Docker CLI: 사용자가 보기 편한 테이블 형태로 만들어 화면에 표시 

Docker CLI로 명령 보내기 예시

 

5. API

1) API 란?

상호간에 주고받는 데이터의 약속된 양식
 

2) 도커 데몬

  • 컨테이너 내에서, 컨테이너를 관리해주는 서버
  • 컨테이너를 관리하기 위해 API를 제공
    • 컨테이너를 생성/삭제 하려면 컨테이너 생성/삭제 양식에 맞는 API 요청을 보내야함
API 예시

 

3) Docker 공식 문서에서 API 살펴보기

  • 도커 엔진에게 요청을 보낼 때, API 양식에 맞게 보내야 함 
  • 컨테이너 목록 조회 API
    • HTTP 요청: 어떤 Method(GET)로, 어디에(/containers/json) 요청을 보내야하는지
      • Query Parameters: 요청 보낼 때의 추가 옵션 정보
    • 응답: JSON 포맷
컨테이너 목록 조회 API

 
 
 
 
 
 
Ref: 개발자를 위한 쉬운 도커 (데브위키 저)

'개발 지식 > Docker' 카테고리의 다른 글

04. [실습] 컨테이너 실행  (0) 2024.12.26
02. [실습] 가상화 기술  (0) 2024.12.22
00. 환경 준비  (0) 2024.12.19