도커(Docker)란 무엇인가? Container와 VM의 차이점

김도현·2023년 7월 13일
0

서버 관리의 어려움

서버를 관리하는 일은 매우 복잡하고 어려운 작업이다. 만약 서버를 개발할 때 개발 환경이 바뀌게 된다면 컴퓨터 세팅이나 프로그램 등을 처음부터 다시 설정해야 한다. 시스템 환경, 방화벽, 네트워크 설정, Dependency, 각종 개발 프로그램 설정 등... 이러한 방식은 매우 번거롭다는 문제점이 발생한다.

특히 DevOps나 MSA가 유행하면서 Micro Service들이 잘게 나뉘면서 관리가 더욱 복잡해지게 되었따. 게다가 새로운 툴은 끊임없이 나오고, 클라우드의 발전으로 설치해야 할 서버가 매우 많아지는 상황에서 서버 관리 방식의 변화가 필요했다.

이러한 상황 속 어려움을 해결해줄 도커(Docker)가 등장하게 되었다.

MSA란?
MSA는 MicroService Architecture의 줄임말로 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크라고 할 수 있다.
스프링으로 예를 들면 MSA는 보통 여러 개의 독립적인 스프링 애플리케이션으로 시스템을 구성하는 아키텍처를 가리킨다. 각 애플리케이션은 자신만의 데이터베이스와 비즈니스 로직, 그리고 API를 가지고 있으며, 서로 통신하여 전체 시스템을 이루고 있다.

도커(Docker)란 무엇인가?

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 화물선에 담긴 컨테이너를 떠올리면, 딱 맞는 규격에 여러 화물을 실어 쉽게 운송할 수 있다는 사실을 알 수 있다.

도커 또한 비슷한 개념이다. 다양한 프로그램들과 실행환경을 컨테이너로 규격화시켜 프로그램의 배포 및 관리를 단순화할 수 있다. 프로그램의 코드뿐만 아니라 실해에 필요한 모든 dependency들도 컨테이너에 담기 때문에 다른 환경에서도 빠르게 애플리케이션을 실행할 수 있다. 또한 어떠한 프로그램이라도 컨테이너로 규격화할 수 있기 때문에 편리하다.

개발/실행 환경이 달라도 컨테이너로 규격화한 프로그램들이 정상적으로 작동할 수 있는 이유는 무엇일까? 그것은 바로 도커 컨테이너들이 (정확히는 도커 이미지들) 도커 엔진 위에서 실행되기 때문이다. 이 덕분에 도커가 설치되어 있는 곳이라면 실행환경에 상관없이 모든 환경에서 동일하기 작동할 수 있다.

이것은 마치 기존의 가상머신(VM)과 비슷해 보인다. 하지만 둘은 다음과 같은 차이점이 존재한다.

도커와 같은 컨테이너 기술은 App layer에서의 추상화이다. 즉, 여러 컨테이너들이 똑같이 하나의 머신 위에서 OS 커널을 공유한다. 물론 user space에서 독립적인 프로세스로서 존재한다. 이렇게 하나의 머신 위에서 OS 커널을 공유하기 때문에 보통 수십~수백 MB의 작은 크기를 차지한다. 이는 마치 가벼운 가상 머신을 사용하는 것과 같은 느낌을 주게 된다.

하지만 가상머신은 하나의 머신 혹은 하드웨어를 여러 개의 OS로 나누어 점유하게 된다. 하나의 머신 위에서 동작하지만, 사실상 다른 머신인 것처럼 각자 OS, 애플리케이션, 라이브러리들을 가지고 있기 때문에 하나당 수 GB를 차지 하게 된다. 또한, 부팅하는데 오랜 시간이 걸린다는 단점도 존재한다.

따라서 성능상에 있어 컨테이너가 좀 더 유리하다.

도커 이미지 (Docker Image)

도커에서 서비스 운영에 필요한 서버 프로그램, 코드 및 라이브러리, 컴파일된 실행 파일 등을 묶는 형태를 도커 이미지라고 한다. 즉, 컨테이너 생성(실행)에 필요한 모든 파일과 환경을 가진 것으로, 더 이상 Dependency 파일을 컴파일하거나 이것저것 설치할 필요가 없는 상태의 파일을 뜻한다.

예를 들어 우분투(Ubuntu) 이미지는 우분투를 실행하기 위한 모든 파일과 dependency들을 포함한다. 이러한 도커 이미지는 컨테이너의 상태가 바뀌거나 삭제되더라도 변하지 않는다. 따라서 다른 환경 혹은 서버에서 미리 만들어 놓은 도커 이미지를 다운로드하고 컨테이너를 생성하면 쉽게 원하는 환경을 구축할 수 있다.

이러한 도커 이미지를 실행하면 도커 컨테이너가 된다고 볼 수 있다. 도커 이미지는 도커 파일이라는 파일로 만들어지는데, 이러한 도커 파일에는 소스코드와 함께 의존성 패키지 등 사용한 설정 파일을 관리하기 쉽도록 명시된다.

도커 레이어(Docker Layer)

도커 이미지는 레이어라는 개념을 사용한다. 즉, 여러 개의 레이어를 나누어 이미지를 구성하게 된다. 예를 들어 apache 이미지를 만든다고 하면, 기존의 ubuntu 이미지를 base Image로 이용하고, 그 위에 필요한 다른 레이어들을 얹어서 만들 수 있다.

이렇게 레이어 방식을 사용하면 기존의 이미지 레이어를 이용해 다양한 이미지를 새로 만들 수 있다. 또한, 기존 이미지를 이용하기 때문에 용량을 절약할 수 있다.

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

도커 허브

도커는 도커 허브(Docker Hub)를 통해 수많은 공개 이미지를 무료로 관리해준다.

호스트들은 도커 허브에서 도커 이미지를 pull 해와서 실행시킬 수 있다. 용량이 매우 큰 이미지들도 도커 허브에서 관리해주기 때문에 사용자는 부담 없이 도커 이미지를 사용할 수 있다.

정리

도커를 사용하면 많은 이점이 있다. 가상머신 처럼 다른 프로세스와 격리되어 사용할 수 있지만, 성능 저하가 거의 없다. 환경에 구애받지 않고 실행할 수 있으며 배포도 간단하다. 이러한 방식은 최근 MSA 방식과 잘 어울린다고 할 수 있다.

오픈 소스이기 때문에 특정 회사에 종속되지 않는다는 점도 장점이다. 복잡한 기술을 몰라도 사용할 수 있으며, 레이어를 이용할 수 있다.

참고
https://code-lab1.tistory.com/236
https://myjamong.tistory.com/297

profile
Just do it

0개의 댓글