고딩왕 코범석

Docker란? 본문

Infra/Docker

Docker란?

고딩왕 코범석 2021. 2. 21. 12:57
반응형

안녕하세요! 이번 시간에는 따라하며 배우는 도커와 CI환경 강의를 듣고 정리한 내용들을 포스팅해보겠습니다. 그럼 잘부탁드리겠습니다! 언제나 피드백은 환영해요!


Docker?????

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스로 제공하여 프로그램의 배포 및 관리를 단순하게 해줍니다.


Docker의 사용 이유


어떤 프로그램 인스톨러를 다운로드 할 때, 이 인스톨러는 본인이 사용하는 pc의 os에 영향을 받습니다. 인스톨러 다운로드 사이트를 들어갈 때, 윈도우용 exe, 맥용 exe, 리눅스용 exe 으로 나눠져 있는 것 처럼요. 인스톨러를 다운 받고 실행할 때, 자신의 환경이 맞다 하더라도 분명 에러가 발생할 가능성이 있습니다.


도커를 사용한다면 환경에 대해 구애받지 않고 프로그램을 쉽게 다운로드 받을 수 있습니다. 컨테이너, 이미지 같은 개념들이 등장하는데, 앞에서 이해해야 할 개념들이 있어서 이 설명들은 뒤에서 설명드리겠습니다.


가상화 기술


도커를 알기 전에 가상화 기술에 대해 짚고 넘어가야 이해하기 수월할 것 같습니다.저도 이번 강의를 들으면서 알게된 개념인데요, 하이퍼 바이저 기반의 VM의 구조는 다음과 같습니다.

image


  1. 어떤 프로그램이 실행되기 위해서는 프로그램을 사용할 pc의 자원을 할당 받아야 합니다. 한 프로그램만 사용하지 않기 떄문에 CPU의 여러 코어중 하나를 할당 받습니다.
  2. 하이퍼바이저란 VM을 생성하고 구동하는 소프트웨어 입니다. 하드웨어에서 OS를 통해 하이버바이저로 사용되는 물리 하드웨어를 호스트라고 불리며, 리소스(하드웨어 자원)을 사용하는 여러 VM들을 게스트라고 합니다.
  3. 하이퍼바이저는 할당되었던 리소스를 각 VM에 제공하고, 물리 리소스에 대해 VM 리소스의 일정을 관리합니다. 물리적 하드웨어는 계속해서 실행 작업을 수행하므로 하이퍼바이저가 일정을 관리하는 동안 CPU가 VM에서요청한 대로 CPU 명령을 계속 실행합니다.
  4. 서로 다른 여러 개의 운영체제를 나란히 구동할 수 있으며, 하이퍼바이저를 사용해 동일한 가상화 하드웨어 리소스를 공유하는 것이 가상화의 핵심적인 이점입니다.

도커의 컨테이너와 이미지


  • 컨테이너

앞의 가상화 기술 그림에서 예를 들어보겠습니다. 하나의 시스템 위에서 둘 이상의 소프트웨어를 동시에 실행시킬 때, 이 소프트웨어들의 종속된 라이브러리, 운영체제가 다를 경우 등등 다양한 문제가 발생할 수 있습니다. 이 소프트웨어들을 각각 실행시키기 위해 각각의 시스템을 준비해야 하는데, 이것을 효율적으로 해결한 것이 컨테이너 라는 개념입니다.


즉, 컨테이너는 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 의미합니다. 그렇다면 가상화 기술에서의 VM과 차이점은 무엇일까요?


VM의 안에는 애플리케이션을 실행시키기 위한 OS, 라이브러리, 등등 하드웨어 스택을 가상화하기 때문에 굉장히 무겁습니다. 하지만, 컨테이너는 운영체제 수준에서 가상화를 실시하여 다수의 컨테이너들을 OS 커널에서 직접 구동합니다. 컨테이너가 훨씬 가볍고 메모리를 적게 차지합니다

image


  • 이미지

이미지는 컨테이너 실행에 필요한 파일과 설정값들을 포함하고 있는 것으로, 상태값을 가지지 않고, 변하지 않습니다. 컨테이너는 이 이미지를 실행시킨 것이라고 볼 수 있습니다. 즉, 이미지의 인스턴스는 컨테이너라고 할 수 있죠! 한 이미지에서 여러 개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.


도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 갖고있기에, 용량이 큽니다. 처음 이미지를 받는데에는 큰 부담이 안되지만, 기존 이미지에 가벼운 파일 하나가 추가되었다고 가정하고 이 이미지를 다시 다운 받을때, 전체 이미지를 다시 다운받는 다는 것은 너무 비효율적이지 않을까요?


이런 문제를 해결하기 위해 도커에서는 layer라는 개념을 사용합니다. 이 개념은 그림과 함께 설명드리겠습니다.

image


우분투라는 이미지가 있고, 우분투 이미지 안에는 a, b, c의 집합이라면, 우분투 이미지를 베이스로 만든 nginx는 a, b, c, nginx가 됩니다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 a, b, c, nginx, webapp의 소스들로 구성됩니다. 만약 webapp 소스를 수정할 경우, 해당 소스 레이어만 다운받으면 되기에, 굉장히 효율적으로 구성할 수 있습니다.


컨테이너를 생성할 때도 레이어 방식을 사용하는데, 기존의 이미지 레이어 위에 Read-Write Layer를 추가합니다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 Read-Write Layer에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용합니다.

이제 기존의 가상화 기술과 도커에 대해 차이점을 보고 정리해보겠습니다.


제목 없음


기존의 가상화 기술은 하이퍼바이저를 통해 프로그램에 대한 모든 자원(OS, 라이브러리, 소프트웨어 등등)을 포함해 VM을 생성하지만, 도커는 호스트를 기반으로 운영체제 수준에서 가상화를 실시해 다수의 컨테이너들을 OS 커널에서 직접 구동합니다.


참조했던 글들

이상으로 도커에 대해 제가 공부한 것들을 정리해보았습니다. 피드백해주실 것이 있다면 꼭 부탁드립니다!

반응형