Docker 조금 파헤치기! 개념 위주!

김민우·2022년 9월 30일
1

docker

목록 보기
1/5

요새는 도커를 굉장히 많은 기업에서 사용하고 있다.
협업을 진행하는 개발자마다 환경이 다르기에 빠른 배포를 위해 사용하기도 하고, MSA(Micro Service Architecture)를 위해 도커와 컨테이너를 사용하기도 한다.

Docker란 뭘까?

도커는 컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구이며, 컨테이너 기반의 오픈소스 가상화 플랫폼이며 생태계이다.

컨테이너❓

서버에서의 컨테이너는 컨테이너 안에 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 하는 것이다.
또한, 프로그램을 손쉽게 이동 배포 관리를 할 수 있게 해준다.
AWS, Azure, Google cloud 등 어디에서든 실행할 수 있다.

그렇다면 도커를 왜 써야할까?

결론부터 말하자면, 어떠한 응용 프로그램을 다운 받고 실행하는 과정을 쉽고 간단하게 만들기 위해서이다.
일반적으로(도커 없이) 프로그램을 받을 때 사용자는 Installer를 다운 받고, 실행을 하게 된다.
하지만 이 과정에서 갖고 있는 서버, 패키지 버전, 운영체제 등에 따라 많은 에러들이 발생하고 뿐만 아니라, 설치 과정이 복잡한 경우도 많다.
도커는 이러한 단점을 보완하여 효율적으로 프로그램을 설치할 수 있다.

용어를 다시 한번 정리해보자.

  • 컨테이너
    - 코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨텅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위이다.
    - 간단하게 말하자면, 편리하게 프로그램을 실행 시켜주는 것으로 정의를 내릴 수 있다.

  • 컨테이너 이미지
    - 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지이다. 여기서 필요한 모든 것은 컨테이너가 시작 될 때 실행되는 명령어(ex. run kakaotalk)와 파일 스냅샷(디렉토리나 파일을 카피한 것)을 말한다.
    - 또한, 컨테이너 이미지는 런타임에 컨테이너가 되고 도커 컨테이너의 경우 도커 엔진에서 실행될 때 이미지가 컨테이너가 된다.
    - 리눅스와 윈도우 기반 애플리케이션 모두에서 사용할 수 있는 컨테이너화된 소프트웨어는 인프라에 관계없이 항상 동일하게 실행된다.
    - 컨테이너는 소프트웨어를 환경으로부터 격리시키고 개발과 스테이징의 차이에도 불구하고 균일하게 작동하도록 보장한다.

  • 도커 이미지
    - 도커 이미지는 프로그램을 실행하는 데 필요한 설정이나 종속성으 갖고 있으며, 도커 이미지를 이용하여 컨테이너를 생성한다.
    - 도커 컨테이너를 이용하여 프로그램을 실행한다.

도커와 기존의 가상화 기술과의 차이를 통해서 컨테이너를 이해해보자!

우선, 가상화 기술이 나오기 전에는 한대의 서버를 하나의 용도로만 사용했었다.
그러다보니, 남는 서버 공간은 그대로 방치가 됐고 하나의 서버에 하나의 운영체제, 하나의 프로그램만을 운영하였다.
어떻게 보면 안정적일 수는 있지만 굉장히 비효율적인 방식이였다.

이러한 비효율적인 기술을 극복하고자 하이퍼 바이저 기반의 가상화가 출현하였다.
논리적으로 공간을 분할하여 VM(Virtual Machine)이라는 독립적인 가상 환경의 서버가 이용 가능해졌다.

하이퍼 바이저 ❓

하이퍼 바이저는 Host 시스템에서 다수의 Guest OS를 구동할 수 있게 하는 소프트웨어이다. 그리고, 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자이다.
하이퍼 바이저에 대해서 조금 더 자세하게 알아보자!

하이퍼 바이저는 크게 네이티브 하이퍼 바이저와 호스트형 하이퍼 바이저 두 개로 나눌 수 있다.
현재 많이 쓰이고 있는 것은 호스트형 하이퍼 바이저이다.

  • 네이티브 하이퍼 바이저

    - 하이퍼 바이저가 하드웨어를 직접 제어하기에 자원을 효율적으로 사용 가능 하며, 별도의 호스트 OS가 없으므로 오버헤드가 적다.
    - 하지만, 여러 하드웨어 드라이버를 세팅해야하므로 설치가 어렵다.

  • 호스트형 하이퍼 바이저

    - 일반적인 소프트웨어처럼 Host OS 위에서 실행되며, 하드웨어 자원을 VM 내부의 Guest OS에 에뮬레이트 하는 방식으로 오버헤드가 크다.
    - 하지만, Guest OS 종류에 대한 제약이 없고 구현이 다소 쉽다.
    - 일반적으로 많이 이용하는 방식이다.

하이퍼 바이저 기반의 VM 구조로는 다음과 같다.

하이퍼 바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원을 할당받는다.
논리적으로 분리 되어 있어서 한 VM에 오류가 발생해도 다른 VM으로 퍼지지 않는다는 장점이 있다.

이러한 가상화 기술에서 나온 컨테이너 가상화 기술을 도표로 보자면 다음과 같다.

우선 두 기술의 공통점은 도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법이라는 것이다.
가장 큰 차이점으로는 격리된 환경을 얼마나 격리를 시키는 가에 있다.

VM과 비교했을 때 컨테이너는 하이퍼 바이저와 Guest OS가 필요하지 않으므로 더 가볍다.
Application을 실행할 때는 컨테이너 방식에서는 Host OS위에 Application의 실행 패키지인 이미지를 배포하기만 하면 되지만,
VM은 Applcation을 실행하기 위해서 VM을 띄우고 자원을 할당한 다음, Guest OS를 부팅하여 실행하기 때문에 훨씬 복잡하고 무겁다.

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

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

도커 컨테이너는 어떻게 격리시키는 걸까?

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

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

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

이러한 기능들을 이용하여 컨테이너의 격리가 가능해진다.

그렇다면, Linux에서만 사용할 수 있는 Cgroup과 네임스페이스를 도커 환경에서 쓸 수 있는 이유는 뭘까?

(docker가 설치되어 있다는 가정 하에) cmd 창을 열고 Docker version을 입력하면

OS가 linux임을 볼 수 있다.
이것을 내부적으로 살펴보자면 다음과 같다.

도표를 보면, 도커의 구조에 리눅스 VM이 설치되어 있음을 알 수 있다.
도커가 실행될때 도커의 클라이언트와 서버는 Linux 환경에서 돌아가고 있다.


REF

  • Inflearn 따라하며 배우는 도커와 CI환경
profile
Pay it forward.

0개의 댓글