Docker 가상화와 컨테이너

이영재·2024년 12월 25일
0

Infra

목록 보기
1/2

0. 도커란 무엇인가

도커는 컨테이너 기술을 기반으로 한 일종의 가상화 플랫폼이다.

가상화란 물리적인 하드웨어를 효율적으로 사용하기 위해서 하드웨어 공간 위에 가상의 머신을 만드는 기술이다.
컨테이너란 컨테이너가 실행되고 있는 Host OS 의 기능을 그래도 사용하면서 프로세스를 격리해 독립된 환경을 만드는 기술이다.

정리하면, 도커는 독립된 환경을 만들어서 하드웨어를 효율적으로 활용하는 기술이다.

🧐 먼저 가상화와 컨테이너에 대해서 좀 더 자세히 알아보자

1. 가상화와 컨테이너

1.1 가상화

가상화는 하나의 하드웨어를 여러개의 가상머신으로 분할해 효율적으로 사용할 수 있는 기술이다.
분리된 가상 머신들은 각각 독립적인 환경으로 구동된다.
이때 베이스가 되는 기존의 환경은 Host OS, 가상 머신으로 분할된 각각의 환경은 Guest OS 라고 부른다.

  • 가상 머신을 생성하기 위해서는 하이퍼바이저 또는 가상 머신 모니터라고 불리는 SW를 이용한다.
  • 하이퍼바이저는 호스트 하드웨어에 설치되어 호스트와 게스트를 나누는 역할을 하고, 각각의 게스트는 하이버바이저에 의해서 관리되며 시스템 자원을 할당받게 된다.

이렇게 Host OS, Guest OS 로 나눠서 관리하면서 얻는 이점을 뭘까?

환경이 완벽히 분리된다. 하이퍼바이저를 활용하면 마치 하드웨어가 여러 개인 것 처럼 하나의 서버를 여러 명이 나눠 쓸 수도 있고, 컴퓨터 한 대에서 서로다른 OS를 동시에 활용할 수 있다.

단점

하지만 가상 머신으로 무언가를 하려면 반드시 하이퍼바이저를 거쳐야 하기 때문에 속도 저하가 발생한다. 또 가상 머신은 해당 환경을 구동하는데 필요한 파일을 모두 포함하고 있기 때문에, 가상 머신을 배포할 때 만들어지는 이미지의 크기가 매우 커진다는 한계점이 있다.

1.2 컨테이너

하이퍼바이저와 달리 컨테이너는 가상의 OS를 만드는 것이 아니라 Host OS의 환경을 공유하면서 필요한 프로세스만 격리하는 방식으로, 커널을 공유하기 때문에 Host OS의 기능을 모두 사용할 수 있다.

  • Host OS에 종속적이며 다른 OS를 구동할 수 없다.
  • 격리시킬 애플리케이션과 필요한 파일, 라이브러리 등 만 포함하기 때문에 배포시 이미지의 크기가 작아진다.
  • 운영체제가 아닌 프로세스이며, 하이퍼바이저를 거칠 필요가 없어 실행 속도가 빠르다.

이미지는 가상 머신이나 컨테이너 또는 프로그램을 실행하는데 필요한 파일과 라이브러리, 설정 등을 가지고 있는 파일이다. 이미지는 레이어라는 계층 구조로 이루어져 있는데, 변경 사항이 생기면 새로운 레이어를 추가해서 기록한다. 이미지 전체를 새로 받지 않고 해당 레이어만 받는 것으로 이미지를 업데이트 할 수 있다는 장점이있다.

즉 이미지를 실행시키면 프로세스. 즉 컨테이너가 된다.

2. 그래서 도커란 무엇인가?

도커는 컨테이너 기반 가상화 플랫폼이다. 컨테이너를 잘 다룰 수 있게 도와주는 도구이다. 도커를 이용하면 이미지를 실행시켜 컨테이너로 만들거나, 생성된 컨테이너를 관리하거나, 컨테이너를 다시 이미지로 만드는 작업을 쉽게 할 수 있다.

이제 도커가 어떤 구조를 갖고 있는지 알아보자.

2.1 도커의 구조

그림을 살펴보면 내 OS 위에 Docker Engine이 실행되는데 이 Docker Engine 이 컨테이너를 관리한다.

  • 물리 서버 위에 동작하는 OS위에서 Docker Engin이 동작한다.

이 말은 우리가 일반적으로 생각하는 프로세스 처럼 운영체제 위에서 동작한다고 말할 수 있다. 더 구체적으로 말하면 Docker Engin은 백그라운드에서 실행되는 데몬 프로세스라고 이해하면 되겠다.

이 Docker Engin은 컨테이너의 생성/수정/삭제를 담당한다. 즉 컨테이너를 관리하는 상위 관리자 프로세스라고 볼 수 있다.

다음으론 Docker Engine 에 대해서 알아보자

2.1.1 Docker Engin 구성요소

  • Docker Daemon : 도커 엔진의 백그라운드 프로세스(데몬)로, 컨테이너와 이미지를 관리.
    - 컨테이너 생성, 실행, 중지, 삭제.
    - 이미지 빌드 및 다운로드 관리.
    - 네트워크 설정 및 데이터 볼륨 관리
  • REST API : Docker CLI와 Docker Daemon 간의 통신을 위한 인터페이스
    - JSON 기반 요청/응답 처리
    - ex) 컨테이너 시작, 정지, 상태 확인 등의 명령이 REST API 요청으로 전달.
  • Docker CLI : 사용자가 도커를 제어하는 명령어 도구==
    - docker run: 컨테이너 실행.
    - docker ps: 실행 중인 컨테이너 목록 확인.
    - docker build: 이미지 생성.
    - docker pull: 이미지 다운로드.

2.1.2 Docker Engin 동작 흐름

  1. 사용자가 Docker CLI를 통해 명령 실행 (docker run, docker build 등).
  2. CLI가 명령을 REST API 요청으로 변환하여 Docker Daemon으로 전달.
  3. Docker Daemon이 요청을 처리:
    • 컨테이너 생성/실행/관리.
    • 이미지 빌드 또는 다운로드.
  4. 작업 완료 후 결과를 CLI로 반환.

2.1.3 Docker Engine의 주요 기능

  1. 이미지 관리

    • Docker Hub 또는 로컬 레지스트리에서 이미지를 다운로드하거나 업로드.
    • 계층적 레이어 구조로 저장되어 효율적이고 빠르게 업데이트 가능.
  2. 컨테이너 관리

    • 컨테이너의 생성, 실행, 중지, 삭제를 처리.
    • 독립적인 실행 환경(격리된 파일 시스템, 네트워크, 프로세스)을 제공.
  3. 네트워크 관리

    • 여러 컨테이너 간 통신을 위한 가상 네트워크 생성 및 관리.
    • 네트워크 모드:
      • bridge: 기본 네트워크 모드.
      • host: 호스트와 네트워크 공유.
      • none: 네트워크 격리.
  4. 데이터 볼륨 관리

    • 데이터의 지속성을 위해 볼륨 생성 및 관리.
    • 컨테이너 간 데이터 공유 가능.

2.1.5 Docker Engine의 장점

  • 효율성: 컨테이너는 호스트 OS의 커널을 공유하므로 가상 머신보다 경량.
  • 이식성: 컨테이너로 애플리케이션과 환경을 묶어, 어디서든 동일한 방식으로 실행 가능.
  • 확장성: 컨테이너 오케스트레이션 도구(Kubernetes 등)와의 연동을 통해 확장 가능.
  • 속도: 하이퍼바이저를 사용하는 가상화보다 빠르게 실행.

자 이제 도커를 실행 시키는 Docker Engine에 대해서 알아보았다 그러면 이 Docker Engine 이 내 운영체제에서 어떻게 작동하는지 이해해보자. mac os를 사용중이다.

3. 기본적으로 '리눅스용' 이다

도커는 기본적으로 리눅스 운영체제에서만 동작한다. 리눅스 운영체제가 동작하는 것을 전제로 한다.
왜냐면 도커는 서버에 사용되는 경우가 많기 때문에 대부분 서버 환경을 전제로 구성하도록 되어있다.

즉, 도커는 리눅스 컴퓨터에서 독립적인 환경을 만드는 것이며, 리눅스에서만 동작하고 컨테이너에서 동작할 프로그램도 리눅스용 프로그램이다.

그러면 내 Mac OS 에서는 어떻게 동작하는 걸까?

이전에 가상화와 컨테이너에 대해서 학습 했던 ==가상화 기술==을 도입한다. Host OS 와 Guest OS 로 분리해 2개의 OS를 하나의 하드웨어에서 분리하여 사용할 수 있다.
이때 내 mac OS 는 Host OS가 되는 것이고, 도커 데몬 프로세스를 실행시킬 OS는 Guest OS 로 Linux OS 가 되는 것이다.

  • Docker Daemon 실행 시:
    • macOS에서는 Docker Desktop이 자동으로 Linux 기반 가상 머신을 생성하고 관리.
    • 가상 머신 내부에서 Docker Daemon이 실행되며, 사용자가 요청한 컨테이너를 생성하고 관리.
  • 자동화된 가상화:
    • 사용자는 가상화 기술을 직접 설정하거나 관리할 필요 없이, Docker Desktop을 통해 모든 과정이 자동으로 이루어진다.
  • 결과적으로:
    • macOS에서도 마치 Linux 환경처럼 Docker 컨테이너를 사용할 수 있다.

처음에 왜 도커를 '도커는 컨테이너 기술을 기반으로 한 일종의 가상화 플랫폼이다.' 라고 정의한 이유가 다른 환경에서도 Linux 환경의 어플리케이션을 실행시킬 수 있게 도와주는 기술이기 때문이다.

도커를 사용하려면 어떤 형태로든 리눅스 운영체제를 갖춰야 한다는 것을 기억하자!

0개의 댓글