[서버] 가상화 기술과 도커에 대해

최동근·2023년 5월 17일
0

docker

목록 보기
3/4
post-thumbnail
post-custom-banner

이번 포스팅에서는 가상화 기술에 대해 깊게 알아보고 HypervisorDocker 에 대해 알아보겠습니다❗️

🐳 가상화 기술이 나오기 전

혹시 무어의 법칙 을 아시나요?

무어의 법칙이란 인텔의 공동설립자 무어가 내놓은 이론으로 반도체 직접회로의 성능이 2년마다 2배씩 증가하>고, 컴퓨팅 성능은 18개월마다 2배씩 향상되며, 컴퓨팅 가격은 18개월 마다 반으로 떨어진다는 법칙입니다.

이 무어에 법칙대로라면 지금 시점에서 반도체의 직접회로 성능은 약 10억배, 컴퓨팅 성능은 약 1조배, 컴퓨팅 가격은 1조배나 떨어졌다고 볼 수 있습니다.
가상화 기술이 탄생하기 전인 과거에는 한대의 서버를 하나의 용도로만 사용하는게 일반적이였습니다.
그 이유는 컴퓨팅 자원이 딱 그정도만큼의 퍼포먼스만 가지고 있었기 때문입니다.
이로 인해 각 서버의 자원 활용이 낮았고, 여러 대의 서버를 운영하려면 물리적 서버가 필요했습니다.
즉 하나의 서버에 하나의 운영체제(OS), 하나의 프로그램을 운영하는 것이 일반적이였습니다.

하지만 위에 무어의 법칙처럼 하드웨어 성능이 엄청나게 발전된 지금 하나의 서버에서 하나의 어플리케이션을 동작하는 것이 어떤가요?
이는 안정적일 수는 있었지만, 하드웨어 자원 측면에서 매우 비효율적이죠 😒

이런 문제점을 해결하기 위해 가상화 기술이 탄생했습니다 ❗️
: [가상화] 가상화란 무엇인가?

🐳 가상화 기술에 대해

가상화의 의미

가상화는 컴퓨터 리소스를 추상화한다는 광범위한 의미를 가집니다.
앞에서도 살펴보았듯이, 옛날 가상화 기술이 존재하기 전에는 한 개의 서버에 한 개의 운영체제 및 애플리케이션만을 구동시킬 수 있었으나, 가상화 기술이 등장한 이후에는 동일한 서버 위에 여러 개의 운영체제를 구동시킬 수 있게 되었습니다.

즉, 가상화 기술이란 하드웨어를 추상화하여 하나의 하드웨어(호스트 머신) 위에 여러 운영체제를 동시에 실행할 수 있게 하는 기술입니다.

가상화 기술 종류

1. Host OS 형

Host OS 형 은 호스트 머신에서 돌아가는 호스트 운영체제 위에 가상 머신과 게스트 운영체제을 작동시키는 방식입니다.
호스트 OS 바로 위에 게스트 OS 을 구동시키는 방식으로 이해하면 좋을 것 같습니다.
대표적인 예시로는 VMWareVirtual Box 가 있습니다.

2. 전가상화 방식

전가상화 방식 은 중간에 Hypervisor 라는 소프트웨어를 통해 가상화 하는 방식입니다.

Hypervisor 는 가상화 기술에서 필수적인 역할을 합니다.
Hypervisor는 호스트 머신으로부터 VM 과 VM 의 애플리케이션을 추상화하고 격리하며 이를 관리하는 역할을 합니다.

호스트 OS 을 필요로 하지 않으며, Hypervisor 위에 각각의 게스트 머신에 게스트 운영체제를 설치해서 움직이게 합니다.
앞서 살펴본 Host OS 형 과 다른 점은 게스트 머신이 마치 독립적인 Host 시스템처럼 동작한다는 것입니다.
복수의 게스트 머신이 서로 간섭하지 않도록 하는 것이 Hypervisor 의 역할이기 때문에, 처리 오버헤드가 발생하지 않습니다.

Hypervisor 을 구동하면 DOMO 라는 관리용 가상 머신이 실행되며, 모든 게스트 머신들의 하드웨어 접근이 DOMO 을 통해서 이루어집니다.
즉, 모든 명령에 DOMO 가 개입을 하게되는 형태입니다.
게스트 머신의 각각의 게스트 OS 는 커널에서 사용하는 규칙이 모두 다르기 때문에 게스트 OS 는 직접 호스트 머신의 하드웨어 자원을 사용할 수 없으며, DOMO 에서 번역을 한 후에 Hypervisor 에 요청을 날리면 Hypervisor 가 하드웨어에 전달을 해줍니다.
이렇게 중간에 Hypervisor 가 중재를 하기 때문에 처리 속도가 느리다는 단점이 있습니다.

3. 반가상화 방식

반가상화 방식 이란 Xen에서 전가상화 방식 의 가장 큰 문제점인 성능 문제를 해결하기 위해 나온 기술로,
하드웨어를 완전히 가상화하지 않는 기술입니다.
게스트 OS 의 일부를 수정하여, 특권 명령이 수행될 때 Hypercall 을 호출하여 Hypervisor가 실행되도록 하는 기술입니다.

앞서 전가상화 방식 에서는 각 게스트 OS 에서 사용하는 명령의 방식이 모두 달라 DOMO 에서 번역을 거쳐서 호스트 머신의 하드웨어에 전달한다고 했었는데, 반가상화 방식 에서는 직접 각각의 게스트 머신에서 번역을 해서 Hypervisor 에게 전달해주는 방식입니다.

4. 컨테이너 방식

컨테이너 방식 의 가상화는 앞서 살펴본 가상화 방식들 처럼 하드웨어를 가상화하는 방식이 아닙니다.
OS 을 가상화하지 않고, 소프트웨어을 바로 가상화하는 기술입니다.
프로세스 단위로 격리하기 때문에 가볍고 빠르게 동작하며, CPU 나 메모리는 프로세스가 필요한 만큼 할당되기 때문에 성능적으로도 거의 손실이 없습니다.
또한 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 주지 않고 독립적으로 실행되기 때문에 마치 성능 좋고 가벼운 게스트 머신을 사용하는 느낌입니다.

대표적인 컨테이너 방식의 가상화 기술로는 Docker 가 있습니다 ❗️

: 하드웨어 가상화(Virtualization) 뜻, 가상화 기술 종류 4가지, 가상머신(Virtual Machine)의 단점 3가지

🐳 컨테이너 가상화 기술인 도커(Docker) 란?

도커(Docker) 란 애플리케이션을 신속하게 구축,테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 컨테이너는 라이브러리, 시스템 도구, 코드 등 소프트웨어 실행에 필요한 모든 것이 포함되어 있습니다.
도커를 통해 애플리케이션을 실행하면 독립적인 환경에서 일관된 결과를 보장합니다.

Docker 는 컨테이너형 가상화를 구현하기 위한 상주 애플리케이션과 이를 관리하는 명령형 도구로 구성됩니다.

컨테이너(Container) 란?

컨테이너(Container) 기술 은 앞에서도 언급한 바와 같이 격리된 공간에서 프로세스가 동작하는 기술입니다.
또한 컨테이너이미지(Image) 가 실행된 결과인데, 기존의 가상화 방식은 OS 를 가상화하는 방식이였지만 컨테이너를 통헤 프로세스를 격리하는 방식으로 가상화합니다.
원하는 어플리케이션을 구동시키기 위해 최소한으로 필요한 구성 요소들을 Dockerfile build 라는 패키징을 합니다. 이때 패키징 결과는 이미지입니다 ❗️

컨테이너는 애플리케이션을 언제든 실행 가능하도록 필요한 모든 요소를(소스 코드, 구성 요소, 종속성 등) 하나의 런타임 환경으로 패키징한 논리적 공간이며, 운영 시스템을 가상화한 경량의 격리된 프로세스입니다.

즉, Micro VM 이라고 생각하면 되며, 운영체제 수준의 가상화을 제공합니다.
또한 독립성을 갖기 때문에 다른 컨테이너에 영향을 주지 않는 Stateless 환경을 제공합니다.

컨테이너는 개인 테스크탑 뿐만 아니라 기업 내의 On-Promise 서버에서 AWS 와 같은 퍼블릭 클라우드까지 언제 어디서든 빠르고 효율적으로 배포 가능하며, 확장성 또한 가집니다 ❗️

[컨테이너 기술의 장점]

  • 개발 속도의 측면
    컨테이너를 사용하면 동료 개발자 혹은 자신의 환경이 다름에 구애받지 않고, 훨씬 더 빠르게 개발을 진행할 수 있습니다.

  • 운영의 효울적 측면
    컨테이너는 OS 이미지를 담고 있지 않아 필요한 컴퓨팅 리소스만 사용합니다. 이는 효율적인 애플리케이션 구동을 할 수 있게 합니다.

  • 폭넓은 구동 환경
    컨테이너는 거의 모든 곳에서 구동할 수 있습니다. 즉 이식성이 뛰어납니다.
    Docker 가 설치되어 있다면 Docker 이미지를 이용해 개인 환경이던 클라우드 환경이던 어떤 OS 든지 동작 가능합니다.

[컨테이너 기술의 특징]

  • 컨테이너 자체 애플리케이션 환경에 대한 관리만 요구되므로, 지속적 서버관리 비용을 절감할 수 있습니다.
  • 개발팀운영팀 의 업무 분리로 각자의 엄무와 세분화된 관리에 집중할 수 있습니다.
    즉 컨테이너는 DevOps Workflow 에 구성에 최적입니다.

[컨테이너 기술 사용 사례]

  • 대규모 애플리케이션 서비스부터 앱 서비스까지 여러 기업의 다양한 애플리케이션 환경에서 사용 중입니다.

    • 구글 웹,앱 서비스
    • 에어비앤비 추천 서비스
    • 넷플릭스 추천 서비스
    • 당근마켓 딥러닝 기반 추천 서비스
    • 엔씨소프트 개임 서비스
    • 삼성전자 헬스 케어 서비스
    • 타다 배차 서비스
    • 토스 금융 서비스

이미지(Image) 란?

이미지(Image) 는 컨테이너 실행에 필요한 파일과 설정을 포함하고 있는 것입니다.
이미지는 상태값을 가지지 않고 변하지 않습니다. 앞서 설명한 컨테이너 는 이러한 이미지를 실행한 상태입니다.
만약 기존 이미지에 추가되거나 변하는 값이 있다면 이는 컨테이너에 저장됩니다.
같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 삭제되어도 이미지는 변하지 않고 그대로 남아있습니다.
잘 알려진 도커 이미지는 Docker Hub 에 등록되어 있습니다.

  • 하나의 도커 이미지 용량은 보통 수백 MB ~ 수 GB 이지만 이는 VM 에 비하면 작은 용량입니다.

  • 불변의 성격을 가집니다.

  • 하나의 이미지를 통해 여러개의 컨테이너를 생성할 수 있고, 컨테이너를 삭제한다고 해서 이미지가 변하지 않습니다.

  • 이미지는 Docker Hub 를 통해 버전 관리 및 배포가 가능합니다.

  • 도커는 DockerFile 이라는 파일로 이미지를 만듭니다.

Dockerfile 이란?

Dockerfile은 이미지를 만들기 위한 파일로써 DSL 언어를 이용해 이미지를 생성할 수 있습니다. 개발자로써 우리는 이미 완성된 이미지를 가져와서(pull) 해서 사용하기도 하지만 기존의 이미지를 토대로 새로운 이미지를 만들어서 사용하기도 합니다.
이때 Dockerfile 을 사용합니다 🐶

<Dockerfile 의 장점 >

  • 이미지가 어떻게 만들어졌는지를 기록합니다.

    • 보통 사람은 완성된 이미지를 가져다 사용하며 어떻게 이미지가 만들어졌는지에 대해서는 알 필요가 없습니다. 하지만 개발자의 경우 해당 이미지가 설치 되기 위한 과정은 어떠한지, 중간에 어떤 과정을 수정해야 하는지 등을 알아야 하는 경우가 있습니다. ❗️
  • 배포에 용이합니다.

    • 어떠한 이미지를 배포할 때, 보통 수 백 MB ~ 몇 GB 에 이릅니다.
      따라서 이미지 파일 자체를 배포하기 보다는 이미지를 만들 수 있는 스크립트인 Dockerfile 만 배포한다면 매우 편리합니다.

Dokerfile 을 생성할 때 사용하는 명령어에 대해 알아보겠습니다.

명령어 이름수행 동작
FROM베이스 이미지를 결정합니다.
RUN새로운 레이어에서 명령어를 실행하고, 새로운 이미지를 생성합니다.
WORKDIR작업 디렉토리르 지정합니다. 없으면 새로운 디렉토리를 생성합니다. 생성하면 그 후로부터는 해당 디렉토리를 기준으로 동작합니다.
COPY이미지 build 명령 중간에 호스트의 파일 또는 폴더를 이미지에 가져오는 명령입니다.
ENTRYPOINT컨테이너를 생성 및 실행할 때 실행할 명령어입니다.

표에 제시된 명령어는 핵심 명령어입니다. 추가적인 명령어가 궁금하시다면 Dockerfile 에 대해 을 참고해주세요 😉

이렇게 Dockerfile 로 이미지를 생성할 수 있는 스크립트 파일을 만들었다면 빌드 과정을 통해 이미지를 생성하고 컨테이너를 생성하면 됩니다.

docker build -t [이미지 이름 : 이미지 version][Dockerfile 경로]

docker run [옵션] --name [container 이름] -d -p [호스트 포트 : 컨테이너 포트 ]

🐳 Docker vs Virtual Machine(VM)

앞서 살펴본바와 같이 도커가 있기 이전부터 가상화 기술은 존재했습니다.
도커 이전의 대표적인 가상화 기술이 VM 인데, 도커와 VM 을 비교해봅시다 🔥

도커와 VM의 동작 원리

도커의 컨테이너는 호스트의 OS 커널을 공유합니다.
여기서 커널 이란 하드웨어 자원을 관리하고 하드웨어와 프로세스 사이의 인터페이스 역할을 수행하는 OS 의 핵심 구성 요소중 하나입니다.
커널 은 주어진 컴퓨팅 자원을 가상화하고 필요한 프로세스에게 이를 할당합니다. 🧑‍
💼

생성된 컨테이너가 호스트의 OS 커널을 공유하기 때문에 호스트 시스템에서도 컨테이너 내부의 프로세스를 볼 수 있습니다.

하지만 VM 은 Host OS 를 기반으로 Guest OS 를 만듭니다 🐳
만약 VM 을 통해 n 개의 가상화 소프트웨어를 만든다면 기존의 Host OS 는 n 개의 Guest OS 를 만들게 됩니다.
Guest OS 는 서로 독립적이며 여러개의 OS 를 동시에 가동시켜야 하기에 자원의 효율성 측면에서 도커보다 떨어집니다.

도커의 실제 원리

위의 이미지는 도커와 VM 을 간단하게 비교하기 위한 이미지입니다.
하지만 해당 이미지에는 몇가지 오류가 존재합니다 🥲

앞서 살펴본바와 같이 도커는 하나의 Host OS 커널을 공유하고 이는 리눅스 커널의 Cgroup 과 네임스페이스 기능을 이용해서 구현되어 있습니다.
즉 이와 같은 기능을 통해서 다른 프로세스 사이에 벽을 만듭니다.
실제, 컨테이너는 커널을 공유하고 커널에서 자원고 프로세스 격리가 이루어지므로 이미지는 다음과 같아야 합니다.

그러나 여기에도 오류가 있습니다 🥲 (이는 도커의 동작원리를 정확하게 이해하기 위한 과정입니다..ㅎ)

만약 Host OS 가 리눅스가 아니라 Mac/Window 라면 어떻게 컨테이너를 분리할 수 있을까요? 저희가 배운거에 따르면 도커는 리눅스 Host OS 기반으로 운영되는데 말이죠

실제로는 Host OS 는 따로 존재하고(Mac / Window / Linux) 그 위에 Docker Engine 이 존재하는데 이는 또다른 VM 이라고 생각하면 됩니다. 그리고 VM 는 Guest OS 를 가지는데 Docker 에서 Docker Engine 의 Guest OS 가 바로 Linux 입니다 ❗️

그리고 이 위해 쌓이는 컨테이너에는 더이상 Guest OS가 깔리지 않습니다.
결론은 처음 도커에 입문한 분이라면 첫번째 이미지를 통해 전체적인 동작 원리를 이해하고 좀 더 구체적인 원리가 궁금하다면 아래 그림을 통해 이해하기를 바랍니다 👨‍💻


참고

[Docker] Docker와 기존 가상화 기술의 차이 알아보기
Virtualization(가상화)란 무엇인가? | Hypervisor(하이퍼바이저)
하이퍼바이저란 무엇입니까? | 하이퍼바이저와 VM의 정의, 사용 이유, 구현 사항
[Docker] 도커란? - 도커 개념 정리
도커와 VM의 차이
Docker 와 VM 차이점

profile
비즈니스가치를추구하는개발자
post-custom-banner

0개의 댓글