Docker

김준영·2023년 5월 30일
1

Code States

목록 보기
30/33

컨테이너 방식의 장점


의존성 충돌 문제를 해결해 준다.

  1. 개발과 배포 환경을 일치시킨다.
  2. 수평 확장을 쉽게 해 준다.
  3. 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다.

컨테이너 기술을 바탕으로 한 컴퓨터 안에 여러 대의 컨테이너가 존재하고, 이를 통해 애플리케이션 실행 환경이 격리되어 있다.

  1. 프로세스
    • 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스할 수 있습니다.
    • 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없습니다.
  2. 네트워크
    • 기본으로 컨테이너 하나에 하나의 IP 주소가 할당되어 있습니다.
  3. 파일 시스템
    • 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있습니다. 그래서 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있습니다.
  • OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있습니다.
  • 개발을 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경 하에 개발을 진행할 수 있습니다.

동일한 애플리케이션 구성(이미지)을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고, 로드 밸러서에 이 서버를 추가하기만 하면됩니다.

이러한 기술을 응용하여, 새로운 버전의 애플리케이션을 여러 서버 중 몇 대에만 운영하여 테스트하는 방법도 가능합니다. 이를 통해 새 버전의 애플리케이션에서 발생할 수 있는 문제들을 미리 확인하고, 이러한 문제가 사용자 전체에게 영향을 끼치지 않도록 만들 수도 있습니다.

핵심 키워드


컨테이너

애플리케이션이 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고, 도커라는 기술 위에 실행될 수 있도록 만든 애플리케이션 상자입니다.

이미지

실행되는 모든 컨테이너는 이미지로부터 생성됩니다. 이미지는 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿으로, 이를 이용해 즉시 컨테이너를 만들 수 있습니다.

이미지를 이용해 여러 개의 컨테이너를 생성할 수 있습니다. 이를 이용해 애플리케이션의 수평 확장이 가능합니다.

이미지는 기본 이미지(base image)로부터 (마치 git을 사용하는 것처럼) 변경 사항을 추가/커밋해서 또 다른 이미지를 만들 수도 있습니다. 예를 들어 스프링부트 기반의 애플리케이션을 이미지로 만들고 싶은 경우, 스프링부트 초기 세팅 이미지를 기본 이미지로 삼고 내가 만든 애플리케이션을 추가해 넣고, 이미지화할 수 있습니다.

레지스트리

이미지는 레지스트리에 저장됩니다. 대표적인 이미지 레지스트리로는 Docker Hub, Amazon ECR이 있습니다. 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 존재하지 않는다면, 기본 레지스트리로부터 다운로드하게 됩니다.

컨테이너와 VM의 비교

컨테이너 기술과 가상 머신(VM)은 둘 다 프로세스, 네트워크, 파일 시스템을 격리할 수 있다는 장점을 공유합니다. 하지만, 이 둘의 작동원리는 많이 다릅니다.

VM을 사용해 본 경험이 있다면, VM을 만들고 실행하는 과정이 많은 컴퓨팅 자원을 필요로 한다는 점을 체감하였으리라 생각됩니다. 이에 비해, 도커는 한 호스트 컴퓨터에 여러 개의 컨테이너를 띄워도 크게 컴퓨터에 무리가 가지 않습니다.

또 하나의 특징은, Docker Hub Registry를 통해 이미지를 살펴보면, 도커 이미지는 (운영체제 이미지도 존재하지만) 보통 애플리케이션 단위로 만들어져 있음을 알 수 있습니다. 반면 VM을 사용하기 위해서는 해당 VM 위에 운영체제(OS, Operating System)를 설치해야 하는 과정을 반드시 거치게 되어 있습니다.


왼쪽의 VM의 구성 요소에 OS가 존재하는데 비해, 오른쪽의 도커 컨테이너에는 OS를 포함하고 있지 않습니다. 다만, 도커라는 플랫폼 위에 컨테이너들이 올라가 있고, 그 아래 호스트 OS가 존재합니다.

이를 통해, 각 컨테이너는 호스트 OS의 커널(Kernel, 시스템 콜과 같이 OS의 핵심 기능을 구현한 프로그램)을 공유하고 있음을 짐작할 수 있습니다.

도커는 애플리케이션을 컨테이너 화해서 실행하는 데에 주목적이 있으므로, 특별히 컨테이너에 OS를 올려서 사용하지 않습니다. 호스트 OS의 입장에서 컨테이너 하나는 프로세스 하나에 불과합니다.

컨테이너에 OS를 올리지 않는데, Docker Hub에 존재하는 각종 OS 이미지는 무엇인가요?

잘 알려진 리눅스 배포판인 우분투, CentOS 등은 결국 동일한 리눅스 커널 위에서 만들어진 것입니다. 각자가 고유의 디렉토리 구조, 패키지 시스템(apt, yum), 쉘(bash, zsh) 등을 사용했을 뿐입니다. OS 이미지는 컨테이너 내 애플리케이션 구성의 편의를 위해 존재하는 이미지입니다. 우분투, CentOS 이미지를 사용한다고 해도 결코 컨테이너에 커널 수준의 OS가 올라가지 않습니다.

윈도우나 macOS용 도커를 살펴보면 컨테이너 안쪽은 리눅스로 작동됩니다. 윈도우나 macOS는 리눅스가 아닌데, 어떻게 컨테이너 안에서 리눅스 기반으로 작동하는 것인가요?

윈도우나 macOS는 근본적으로 리눅스 커널을 쓰고 있지 않으므로, 해당 운영체제의 경우 리눅스 커널을 VM의 형태로 실행시키는 하이퍼바이저(Hyper-V, LinuxKit, HyperKit)를 자체적으로 구동합니다. 윈도우용 또는 macOS용 도커는 하이퍼바이저 위의 리눅스 커널을 사용하는 것입니다.

profile
ㅎㅎ

0개의 댓글