[Docker] 도커(Docker)란? 도커의 역사
Programming

[Docker] 도커(Docker)란? 도커의 역사

728x90

도커의 귀여운 고래 로고

도커(Docker)~~~ Java, Spring 등의 기존 기술들에 비하면 상대적으로 최신기술이라고 볼 수 있는데요. 직접 사용해보지 않으셨더라도 한번쯤 이름은 들어보셨을 것 같아요. 그럼 오늘은 도커에 대해 알아보겠습니다~!


도커의 탄생

도커는 2013년 3월 산타클라라에서 열린 PyCon에서 Solomon Hykes가 "리눅스 컨테이너의 미래(The Future of Linux Container)" 라는 제목으로 세션을 발표하면서 알려지게 되었습니다.

 

Solomon Hykes는 dotCloud라는 PaaS 기업의 창시자였고 사내 프로젝트였던 도커를 공개적으로 발표를 한것이었죠. 발표 이후 도커는 엄청난 인기를 얻게 되었습니다. 그 후 2013년 10월에 회사명 자체를 Docker Inc로 바꾸고 2014년 6월에 마침내 Docker 1.0을 출시하게 됩니다.

 

도대체 도커가 어땠길래 이런 인기를 얻을 수 있었을까요?


도커의 정의

우리가 현실에서 보는 컨테이너

도커의 간단한 정의는 "컨테이너(Container) 기반의 오픈소스 가상화 플랫폼" 입니다.

 

네 우리가 아는 그 컨테이너랑 비슷한 개념입니다! 위에 도커 로고를 봐도 고래위에 여러개의 컨테이너가 있는 것을 확인하실 수 있는데요. 각기 다른 물건을 컨테이너에 넣어서 규격화시키고 화물로 옮기기 편하게 만드는 것과 비슷한 원리입니다.

 

의미는 비슷한건 알겠지만.. 정확히 도커에서 컨테이너는 무엇인가요? 왜 컨테이너에 뭘 넣어야하죠?? 음.. 컨테이너에 대한 설명으로 들어가기전에 먼저 가상화(Virtualization)에 대해 간단하게 짚고 넘어가봅시다.

** 혹시 가상화에 대해 아직 안보셨다면 여기를 먼저 보고 와주세요!

 

가상화를 간단하게 다시 요약하면, 하나의 물리적 하드웨어(서버)에서 마치 독립적인 여러개의 서버가 있는 것처럼 관리하고 동작하게 할 수 있는 기술이었죠! 따라서 컨테이너도 하나의 가상화된 서버라고 보시면됩니다.

위 그림처럼 하나의 물리적인 서버안에 여러개의 컨테이너가 존재하고, 이 컨테이너는 어떤 물리적인 서버에 들어가더라도 똑같이 실행될 수 있는것이죠!  

 

어?? 그럼 컨테이너는 VM인가요?

자! 정말 중요한 질문입니다. VM이라는 개념은 하이퍼바이저가 등장한 1960년대부터 존재했던 개념인데, 과연 2013년에 VM을 발표했다고해서 도커가 이렇게 인기가 많아질 수 있었을까요? 자 그럼 VM과 컨테이너를 비교하면서 컨테이너를 설명해보겠습니다.


가상머신(VM) vs 컨테이너(container)

컨테이너 구조 (왼쪽), 가상머신 구조 (오른쪽)

자 일단 이 글에서 가상화에 대한 글을 읽으셨다면 한가지 큰 차이점이 보이는게 있으실겁니다. 바로 하이퍼바이저의 유무죠!

가상머신(VM)은 예상대로 물리 하드웨어에서 하이퍼바이저를 통해 리소스를 각 VM에게 할당하고 물리 하드웨어와 지속적으로 통신을 하면서 각 VM이 개별적으로 동작을 할 수 있도록 도와줍니다. 서버가상화 급으로 운영체제까지 직접 Guest에 할당하여 독립적인 운영체제를 가질수도 있죠.

 

반면에 컨테이너(Container)는... 하이퍼바이저가 보이지 않죠. 그럼 도대체 어떻게 가상화를 할까요?

 

리눅스 컨테이너(Linux Container, LXC)의 등장

전에 말했듯 가상화와 하이퍼바이저는 1960년대에 등장했을 정도로 오래된 기술입니다. 따라서 하이퍼바이저를 이용하여 VM을 사용하는 방식은 가능은 하지만 성능면에서 오버헤드가 발생하는 이슈가 있었죠. 첫번째로 OS가 통째로 올라가기 때문에 구동되는데까지 시간이 오래걸리는 편이고, 매번 하이퍼바이저를 통해 리소스를 할당받고 사용해야하기 때문에 성능도 그다지 좋지 않다는 평이 많았습니다.

https://medium.com/@lhs6395/container%EC%99%80-vm%EC%9D%98-%EB%B9%84%EA%B5%90-84f6a8b7cd4c

따라서 리눅스에서는 프로세스를 격리하는 방안이 등장하였습니다. 물리 하드웨어의 리소스 전체를 관리하면서 그때마다 할당해주는 하이퍼바이저와는 다르게, 리눅스 커널에서 하드웨어 자원을 cgroups를 통해 할당하고 namespace를 활용하여 별도의 프로세스 공간을 만드는 형태입니다. 기술면에서는 조금 복잡할 수 있어도 요약하면... 빠릅니다! 굉장히 빠릅니다. 구동되는 속도도 빠르고 (생성되는데 걸리는 시간 1~2초, VM은 길면 구동에 몇분까지 걸릴 수 있음), 가볍습니다.

 

도커의 정의가 "컨테이너(Container) 기반의 오픈소스 가상화 플랫폼"이었죠? 따라서 도커는 이 컨테이너를 가상화 시켜주는 오픈소스 플랫폼입니다!


도커 기술

도커에는 크게 이미지(Image)와 컨테이너(Container)가 존재합니다.

 

이미지(Docker Image)

이미지는 컨테이너를 생성하기 위한 틀이라고 생각하시면 됩니다. 이미지에는 컨테이너가 만들어지기 위해 필요한 라이브러리와 종속성에 대한 정의가 포함되어있습니다. 이 이미지를 이용해서 컨테이너를 생성할 수 있고, 여러개를 생성할 수도 있습니다. 왜 컨테이너를 생성하기 위한 틀이라고하냐면, 컨테이너를 생성후 컨테이너 내부에서 어떤 변화를 주더라도 이미지에는 변화를 줄수가 없습니다. 따라서 정해진 틀로 계속해서 같은 컨테이너를 생성해주는 그런 역할을 합니다.

 

다음은 몇가지 이미지의 특징입니다

  • 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기때문에 보통 용량이 수백MB에 달합니다
  • 이미지는 레이어 저장방식을 사용합니다. 쉽게 말해서 여러개의 레고조각 처럼 조각조각 저장이 되어있다는 뜻인데요, 그 이유는 효율적인 파일 송신을 위해서입니다. 보통 용량이 수백MB에 달한다고 했죠. 만약 이미지에서 아주 사소한 부분을 바꿨는데 몇백MB를 다시 받아야한다면 상당히 비효율적이겠죠. 이 경우에는 바뀐 레이어만 다시 다운받아서 이미지를 다시 생성하게됩니다.

컨테이너(Container)

위에서 설명했지만 컨테이너는 하나의 독립적인 프로세스입니다. 직접 컨테이너에 접속을 할 수도 있고, 통신을 할 수도 있습니다. 컨테이너 내부에 접속하면 마치 새로운 서버에 들어온것처럼 보입니다. 이미지에도 레이어방식을 사용하지만 컨테이너에서도 사용합니다. 하나의 이미지로 여러 컨테이너를 생성해도 읽기/쓰기 레이어를 하나로 공유하고, 각 컨테이너에서 실행도중에 생성되는 파일이나 변경내용은 각 컨테이너의 읽기/쓰기 레이어에 저장되어 하나의 이미지로 여러 컨테이너를 생성하더라도 저장공간을 최소한으로 사용하게됩니다.


도커의 장점

  • 이식성:
    • Guest OS가 없고 프로세스 격리 방식이어서 상당히 가볍다.
    • 다른 OS에서도 쉽게 배포가 가능하다
  • 확장성:
    • 보통 애플리케이션을 배포할때 얼마나 많이 실행해야할지 모를때가 있는데, 하나의 이미지로 컨테이너의 갯수만 조정하면서 간편하게 확장할 수 있다.
  • 격리:
    • 모든 컨테이너는 독립적으로 실행되기 때문에 서로 영향을 주지 않는다.

왜 도커 도커하는지 도커를 공부하면서 조금씩 알게 되는 것같습니다. 저도 정말 오래전에 VM으로 우분투를 띄워본적이 있는데 엄청 오랜시간이 걸리고 생성하고도 굉장히 느렸던 기억이 나네요 ㅎㅎ

 

오늘도 읽어주셔서 감사합니다!

 

출처:
- [Docker] Docker의 개요
- [Docker] 도커의 역사
- Container와 VM의 비교
728x90