본문 바로가기

DevOps/Docker

[Docker] 도커란 무엇인가?

안녕하세요!

 

두루뭉실 블로그의 주인장 두루뭉실 엔지니어입니다!

 

여태껏 게시물이

개인적으로 판단했을 때,

가독성이 떨어진다고 스스로 판단했습니다.

 

그래서 여러 페이지를 참조하여

새로운 템플릿으로 적어볼까 합니다!

열심히 하겠습니닷! ^^7


 

도커란 무엇인가?

 

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다.

 

우리는 바다에 갔을 때, 혹은 철로에서 컨테이너를 보았습니다. 우리 모두가 알다시피, 컨테이너는 엄청나게 큰 화물을 실어 나를 수 있는 큰 네모난 상자입니다. 화물 수송용 컨테이너와 비슷하게 도커에서의 컨테이너는 실행환경, 애플리케이션, 프로그램 등을 실어 여러 곳으로 운반하여 배포할 수 있다고 생각해주면 됩니다.

 

 

그러면 대체 왜 도커를 사용하는 걸까?

 

 

일반적으로 개발을 시작할 때, 우리는 환경 세팅을 가장 먼저 합니다. 서버도 똑같이 환경이 있겠죠. 그럼 서버는 어떤 환경이 있을까요? OS, 네트워크, Storage(DB) 등 무궁무진한 환경들이 존재합니다. 그렇기에 과거에 서버를 운영하고 관리한다는 것은 굉장히 힘들고 어렵고 섬세하게 다루어져야 했습니다.

 

DevOps의 등장으로 개발과 운영이 통합화되면서 개발 주기는 짧아지고 배포는 잦아졌습니다. 옛날에 애플리케이션을 수정하기 위해 전체 코드를 내리고 작업했던 시절과 달리 MSA(마이크로 서비스 아키텍처) 개념이 나오기 시작하면서 프로그램은 엄청 잘게 쪼개어져서 아키텍처는 더 복잡해지게 됩니다.

 

이때, 도커(Docker)가 등장하게 되고 복잡하고 어려웠고 섬세하게 다루어야 했던 서버 관리 방식이 180도 달라지게 됩니다. 도커의 컨테이너(Container)를 통해 다양한 프로그램, OS 및 실행환경 등을 컨테이너로 추상화하여 동일한 인터페이스를 제공하여 배포 및 관리를 단순화시킬 수 있게 됩니다. 즉, 컨테이너를 통해 배포가 가벼워졌고 프로그램, 서버 등의 환경 설정이 쉬워지게 됩니다. 도커의 등장으로 DevOps 문화와 MSA를 극대화시킬 수 있게 되었습니다.

 

 

Docker의 장점은?

 

그렇다면, DevOps와 MSA(마이크로 서비스 아키텍처)가 왜 극대화시킬 수 있는지에 대해 알아보겠습니다. 일반적으로, 도커는 5가지 정도의 장점을 가지고 있습니다.

  • 구성 단순화 : 도커는 모든 플랫폼에서 실행할 수 있습니다. Dockerfile에 전체 운영 환경변수를 담아 전달이 가능합니다.
  • 가볍고 빠른 배포 및 실행 : 컨테이너는 별도의 OS를 부팅하지 않고 애플리케이션을 실행하므로 컨테이너를 빠르게 만들고 실행할 수 있습니다.
  • 코드 관리 : 도커는 환경 자체를 배포하기 때문에 개발 및 코딩을 편하게 만들어줍니다.
  • 개발 생산성 향상 : 도커 컨테이너로 초기 개발환경을 배포하게 되면 프로젝트 개발 및 실행환경을 맞출 수 있습니다.
  • 공유 환경 제공 : Docker Hub를 통한 전 세계 개발자의 결과물을 얻을 수 있으며 본인의 결과물을 업로드하여 공유할 수 있습니다.

 

 

컨테이너는 무엇인가?

 

컨테이너는 애플리케이션과 애플리케이션을 구동하는 환경을 격리하는 공간을 뜻하며, 호스트 OS의 커널을 공유하면서 격리된 컴퓨팅 자원을 제공하는 가상화 기술입니다.

 

대체 무슨 소리일까요??

 

앞서, [도커란 무엇인가?]에서  "도커에서의 컨테이너는 실행환경, 애플리케이션, 프로그램 등을 실어 여러 곳으로 운반하여 배포할 수 있다고 생각해주면 됩니다."라고 설명드렸습니다. 여기서, 컨테이너는 실행환경, 애플리케이션을 실는 공간입니다.

 

여기서 조금 구체화시켜보겠습니다.

 

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이라고 하겠습니다. 이러한 격리된 공간은 당연히 독립적으로 실행될 것입니다. 독립적으로 실행되기에 관리가 편리하고 마이크로서비스를 빠르게 배포 및 실행이 가능하게 됩니다.

 

 

그러면, 가상화 기술인 VM과 컨테이너는 무엇이 다른 건가?

 

*하이퍼바이저 : 하드웨어에서 시스템의 운영 체제와 리소스를 분리해 VM에 할당하여 가상 머신을 생성하고 구동하는 소프트웨어

*도커 엔진 : 클라이언트와 서버 아키텍처를 따르는 애플리케이션으로 호스트 시스템에 설치되어 Server, Rest API, CLI(Command Line Interface)의 3가지 구성요소를 가짐

 

가장 큰 차이는 가상화의 대상입니다.

 

VM(Virtual Machine)하이퍼바이저를 이용해 여러 개의 운영체제를 하나의 Host OS에서 생성해서 사용하는 방식입니다. 우리가 흔히 VM환경에서 Ubuntu 설치하고 CentOS 설치하죠? 그것을 우리는 Guest OS라고 합니다. VM에서 설치된 Ubuntu와 CentOS가 서로 상호적인가요? 독립적인가요? 아무런 영향을 끼치지 않는 독립적인 속성을 지닙니다. 즉, 각 Guest OS는 다른 Guest OS와 완전히 독립된 공간과 시스템 자원을 할당받아 사용합니다. 비교적 사용법이 쉽지만 Guest OS가 지닌 정보들이 많기 때문에 무거워지고 느려져 운영환경(인프라 팀)에서 점차 사용성이 줄어들고 있습니다.

 

반면, 도커 컨테이너Host OS의 커널을 공유하여 커널 등이 포함된 VM 이미지에 비해 굉장히 작은 이미지를 가지며 하이퍼바이저를 거치지 않아 설치와 실행이 빠릅니다. 상단에 우측의 컨테이너 그림을 참조하면 OS와 Docker Engine이 컨테이너를 공유하는 체계이고 그 속에 존재하는 Kernel이 각각의 독립되고 격리된 컨테이너와 공유한 형태라고 볼 수 있습니다.

 

 

그렇다면 컨테이너는 어떻게 만들어져?  바로,  도커 이미지

 

도커 컨테이너가 실행되기까지 그렇게 많은 과정이 필요하진 않습니다.

 

  • [도커 파일] - (build) = 도커 이미지 생성
  • [도커 이미지] - (run) = 도커 컨테이너 생성

도커 파일을 빌드하여 도커 이미지를 생성하고 생성된 이미지를 run 하면 컨테이너가 생성됩니다. 그렇다면 도커 이미지는 뭘까요?

 

도커 이미지는 필요한 프로그램과 라이브러리, 소스와 같은 설정값을 지정하여 설치한 뒤 만든 하나의 파일입니다. 컨테이너를 만드는 설명이 포함된 읽기 전용(Read Only) 템플릿으로 상태 값을 가지지 않고 변하지 않는 특성을 가집니다. 같은 이미지에서 격리된 여러 컨테이너를 만들 수 있고 컨테이너의 상태가 바뀌거나 삭제되어도 이미지는 변함이 없습니다.

 

서버가 새로 추가된다면?

미리 만들어 놓은 이미지를 다운로드하고 컨테이너를 생성하면 환경 설정이 바로 끝나버립니다. 간편하죠?


오늘은 Docker가 무엇인지 알아보았습니다!

 

예~~~~~~~~

둠칫 둠칫

 

 

요약하자면,

 

1. Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

 

2. DevOps 환경과 MSA에 굉장한 장점을 가지고 있다.

 

3. VM환경에 비해 배포와 실행이 굉장히 빠르다.

 

4. 컨테이너를 만들려면 도커 파일을 이미지로 빌드해서 run 시키자.

 

 

이상 두루뭉실 엔지니어였습니다!

 

감사합니다!