클라우드

[Docker] 1. Docker란 무엇인가?

윤창이 2021. 1. 3. 21:47
728x90

[주의] 개인 공부를 위해 쓴 글이기 때문에 주관적인 내용은 물론, 쓰여진 정보가 틀린 것일 수도 있습니다!

피드백 부탁드립니다. (- -)(_ _) 꾸벅

docker logo


들어가며

 나는 개인 NAS서버를 다루면서 Docker를 사용하여 스마트홈을 꾸밀 때 처음 접해보았다. 그 당시에는 어떠한 원리로 돌아가고, Docker가 어떤 건지도 모르고 따라한 거라 그냥 겉핥기 수준이었는데, 자율주행 관련 연구실 인턴을 하면서 Docker가 얼마나 유용한 툴인지 느꼈던 것 같다. 그 당시에는 Jetson AGX Xavier에 Docker로 ROS와 Autoware 플랫폼을 이식하는 작업을 했었는데, 선배님들이 이미 매뉴얼을 너무 잘 만들어놔서 어렵지 않게 할 수 있었고, Docker 컨셉에 대해 어느 정도 감을 잡았던 것 같다. 그리고 올해엔 쿠버네티스를 한번 공부해보자라는 생각에 다시 꼼꼼히 정리해보고자 한다!


가상화란? (Virtualization)

 

server

 고등학교 때 친구가 가상 윈도우를 개인 서버에 올렸다고 한 적이 있다. 그땐 느려 터진 윈도우를 보며 가상화라는 게 왜 필요한지 사실은 잘 몰랐는데, 요즘 들어서는 가상화를 안 쓰는 클라우드 서비스 기업은 없는 것 같다. 사실 하드웨어의 성능이 비약적으로 발전하면서 이에 맞춰 주목받는 소프트웨어 기술이 가상화(Virtualization)라고 할 수 있겠다. 

 

 그때는 윈도우 하나 돌아가기 힘든 CPU 성능으로 윈도우 3개를 돌리자니 무쓸모처럼 보였을지라도, 지금은 CPU 하나로도 10개의 윈도우는 거뜬히 돌린다면, CPU 10개 가져다가 서버를 10개 만드는 거보다, 하나의 CPU를 가상화하여 사용하는 것이 더 효율적이라는 사실은 우리집 호떡이도 아는 사실이다.

 

 컴퓨팅 자원을 효율적으로 관리하기 위해 리소스의 물리적인 특징을 추상화하며, 사용자에게는 논리적 리소스를 제공한다. 가상화에는 크게 3가지로 나뉘는 것 같다.

 

[가상화의 종류]


호스트 가상화

  • 1. 호스트 가상화 (Host Virtualization) 
     호스트 가상화는 Base가 되는 HostOS 위에 GuestOS가 구동되는 방식이다. 종류로는 많이 들어봤을 법한 VMware Server, Virtual Box 등등이 있다. 가상의 하드웨어를 에뮬레이팅 하기 때문에 HostOS에 크게 제약사항이 없지만, OS위에 또 다른 OS를 얹히는 방식이기에 오버헤드가 크다.

 

 

 

 

하이퍼바이저 가상화

  • 2. 하이퍼바이저 가상화 (Hypervisor Virtualization) 
     하이퍼바이저 가상화는 HostOS 없이 하드웨어에 하이퍼바이저를 설치하여 사용하는 방식이다. 호스트 가상화와는 다르게 별도의 HostOS가 없기 때문에 오버헤드가 적어 효율적으로 리소스를 사용할 수 있다. 하지만 자체적으로 머신에 대한 관리 기능이 없어 관리를 위한 컴퓨터나 콘솔이 필요하다. 하드웨어를 어떤 방식으로 가상화하냐에 따라 다시 전가상화 반가상화로 분류된다. 전가상화, 반가상화의 대략적인 개념에 대해선 아래 블로그가 쉽게 설명해놓았으니 나중에 까먹으면 확인해보도록 하자~ ( m.blog.naver.com/alice_k106/220218878967 )

 

 

 

컨테이너 가상화

  • 3. 컨테이너 가상화 (Container Virtualization)
      HostOS 위에 컨테이너 관리 소프트웨어를 설치하여 논리적으로 컨테이너를 나누어 사용한다. 컨테이너는 애플리케이션 동작을 위한 라이브러리로 구성되기 때문에 이를 각각 개별 서버처럼 사용 가능하다. 오버헤드가 적어 가볍고 빠르다.

 


 기존의 가상화 방식은 주로 OS를 가상화하는 방식이었지만, 이 방식은 무겁고 느려서 운영환경에서는 거의 사용하지 못하는 수준이었다. 이런 상황을 개선하기 위해 CPU의 가상화 기술(HVM)을 이용한 KVM(kernel-based Virtual Machine)과 반가상화(Paravirtualization) 방식이 등장하였고, 이러한 기술들은 OpenStack이나 AWS, Rackspace 같은 클라우드 서비스에서 가상 컴퓨팅 기술의 기반이 되었다. 

 

 언뜻 봐도 컨테이너가 가상 머신에 비해 갖는 장점은 정말 많은 것 같다. 어쨌든 전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 성능 문제가 있었고 이를 개선하기 위한 방식으로 프로세스를 격리하는 컨테니어 방식이 등장하게 된 것!


도커(Docker)와 컨테이너(Container)

 

 

 Docker(도커)는 2013년 3월 솔로몬 하익스(Solomon Hykes)에 의해 발표된 오픈소스 프로젝트라고 한다. 도커는 리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며, 계층화된 파일 시스템에 기반해 효율적으로 이미지(프로세스 실행 환경)를 구축할 수 있도록 해준다. 도커를 사용하면 이 이미지를 기반으로 컨테이너를 실행할 수 있으며, 다시 특정 컨테이너의 상태를 변경해 이미지로 만들 수 있다. 이렇게 만들어진 이미지는 파일로 보관하거나 원격 저장소를 사용해 쉽게 공유할 수 있으며, 도커만 설치되어 있다면 필요할 때 언제 어디서나 컨테이너로 실행하는 것이 가능하다. 다시 말해서 그냥 정말정말정말 편한놈..

 

 물류업계의 컨테이너는 정말 없어서는 안 될 존재이다. 그런 컨테이너를 Computer Science에 그대로 적용한 게 바로 Docker Container이다. 그럼 이렇게 컨테이너화 해서 관리하는 게 어느 장점과 특성을 가지는 걸까? 

컨테이너 기술을 다음과 같은 특성을 가진다.

 

  • 유연성 (Flexible) : 복잡한 애플리케이션들도 모두 컨테이너화 할 수 있다.
  • 경량화 (Lightweight) : 컨테이너는 호스트 커널을 활용하고 공유한다.
  • 변화관리 편의성 (InterChangeable) : 업데이트 및 업그레이드를 즉시 배포할 수 있다.
  • 이식성 (Portable) : 로컬로 구축하고, 클라우드와 가상화에도 배치 가능하며, 어디서나 실행이 가능하다.
  • 확장성 (Scalable) : 컨테이너 복제본을 늘리고 자동으로 배포할 수 있다.
  • 스택화 (Stackable) : 서비스들에 대한 수직적 또는 수평적 디자인이 매우 용이하다.

 

 이러한 컨테니어화 개념은 도커가 처음 만든 게 아니라구 한다. 도커가 등장하기 이전에 프로세스 격리 방법으로 리눅스에서는 cgroups와 namespace를 이용한 LXC(Linux container)가 있었고 이는 현재 libcontainer라는 자체 라이브러리를 사용한다.

 

 정리하자면, 컨테이너화 기술은 Docker(도커)이고, 그 컨테이너를 관리하는 기술은 Docker Swarm을 이용하여 Container Orchestration 환경을 구축하는 것. 그러나 지금의 컨테이너 관리 기술을 Kubernetes가 대세라고 할 수 있다!

쿠버네티스에 관한 공부는 추후에 포스팅하는 걸로 하구 Docker에 대해 좀 더 공부해보장.

 


실제로 더 빠르고 가벼울까?

 

Docker vs KVM   Reboot time

 

(출처 : www.slideshare.net/BodenRussell/kvm-and-docker-lxc-benchmarking-with-openstack )

 

 위의 표는 Docker와 VM의 boot와 reboot시간을 측정한 지표이다. 대충 훑어봐도 Docker가 압도적으로 빠르다.. 15개의 연속된 VM을 계속 켤 때도 메모리 사용량은 VM이 더 많이 차지한다. 사실 docker 컨테이너를 생성하거나 reboot 할 때 체감 속도는 그냥 눈감았다 뜬 사이에 처리되는 수준이었던 것 같은데, 실제로 비교해봐도 압도적이다. 


Image 란?

Docker Image

 

 어릴 적에 USB에 os 구울 때 그 os를 이미지라고 했는데, 그 이미지라는 개념이 Docker에서도 쓰인다. Docker에서의 정말 중요한 개념인데, 컨테이너 실행에 필요한 피일과 설정값 등을 포함하고 있는 것을 상태 값으로 갖고 있는 것을 Image라고 부른다. 이 Image를 이용해 여러 개의 같은 컨테이너를 생성할 수도 있고, 컨테이너를 지워도 Image는 불변한다. Image들은 실행에 필요한 모~든 정보를 가지고 있기 때문에 의존성 파일을 컴파일하거나, 따로 설치할 필요가 없다. 미리 만들어 놓은 Image가 있으면 붕어빵 공장마냥 한 서버에 수십, 수백, 수천 개 실행해도 된다는 뜻이다.

 

 

hub.docker.com/

 

Docker Hub

Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your teams' container applications.

hub.docker.com

 

 Image는 자신이 직접 만들어 관리할 수도 있고, 공개된 Docker Image를 오픈소스 사이트인 Docker hub에서 다운받아 사용할 수도 있다. 현재는 10만 개 넘는 Docker Image가 있다고 하니.. 정말 오픈소스의 힘은 대단한 것 같다.

 

 

글이 너무 길어진 것 같아 다음 글은 2편에서 더 공부하기로 하고 이만 자야겠따

 

 

728x90