본문 바로가기

Developing

[개발 배포 환경 1] Docker란

 Python을 비롯해서, Angular를 이용한 개발을 진행하다 보면 개발 환경과 운영 환경을 동일하게 유지하는 부분에 대해서 많은 고민을 하게 되었다. 그런 고민을 해결하기 위해서 Docker에 대한 Study가 필요했고 이를 위해 Docker에 대한 research 및 개발 배포 환경 적용에 대해 진행해해보면서 글을 써볼까 한다.


Docker에 대한 이해를 위해서는 우선 container에 대한 이해가 필요하다. Container는 application과 그에 대한 의존성 라이브러리들을 캡슐화한 것이다. 어떻게 보면 Container는 VM(Virtual Machine)을 경량화한 것으로 생각하기 쉬운데..... VM과 마찬가지로 OS에서, application을 돌릴 수 있는 isolated 환경을 제공한다.


 그러나 Container는 VM 대비 다음과 같은 이점을 가진다.


  • Container의 장점
    - Container는 resource들을 OS와 공유하며 이로 인해서, VM과 비교했을 때, 더 효율적이다. 심지어 Container 안에서 동작하는 Application은 OS에서 동작하는 application과 비교했을 때, overhead가 거의 없다.
    - Container의 Portability는 미묘한 동작 환경의 변화에 의해 야기되는 버그들을 사전에 차단해준다. 흔히 개발자들이 많이 하는 불평 중에 하나인, "내 랩탑(Local 개발 환경)에서는 동작했는데, 이상하게 운영계에서 동작하지 않네...."라는 불평을 손쉽게 잠재울 수 있다.
    - VM 대비, 경량화(Lightweight)된 Container는 개발자들이 여러개의 container를 동시에 돌릴 수 있게하고 이를 통해, 운영계에서도 동작할 수 있는 분산 시스템을 구성할 수 있게 해준다.(한 호스트에서 여러 Container를 동작시킬 수 있다)
    - Container는 또한 클라우드 환경에 deploying 하는 부분에 장점을 가진다. 사용자는 단순히 download 해서, 어떠한 설정의 적용 없이, 복잡한 application을 동작시킬 수 있다.


 결과적으로 VM은 완전히 외부 환경(즉 OS)을 모방하지만 Container는 단지 Application을 portable하게 만드는 것이 목적이다.


  • Containers vs VM(virtual machines)
    아래 그림과 같이 VM의 경우 각각의 guest OS가 hypervisor 위에서 동작하며, 의존성 라이브러리를 각 OS에 설치해야 한다 반면 Container의 경우 App들이 kernel 위에서 동작하게 하며, 각각의 container는 data와 library를 공유한다. 그러므로 VM 대비 overhead가 적을 수 밖에 없다.



  • Docker란? (https://www.docker.com)
     우선 Docker의 뜻 부터 알 필요가 있다. Docker는 항만 노동자를 의미한다. 과거 항구에서 짐을 옮기는 일은 매우 노동 집약적이었다. 짐의 종류가 다르고 크기도 다르고 목적지, 운송 수단이 다르기 때문에, 일일이 모든 작업이 수작업(즉 노동 집약적)으로 진행되었다. 이는 매우 비효율적이었으며, 이를 획기적으로 개선한 것이 container box의 도입니다. 표준화 된 container box를 도입함으로 인해, 모든 작업이 이를 기준으로 이루어졌다. 안의 물건이나 목적지, 운송 수단은 더 이상 운송에 중요하지 않게 된 것이다. Docker는 SW 개발 환경에 이와같은 Container 도입을 목적으로해서 개발 된것이다. 개발자의 local 개발 환경이 무엇이든, 사용하는 언어가 무엇이든 간에 프로그램을 안전하게 운영 시스템에서도 운영할 수 있게 하는 것이다. 
     Docker는 Linux Container (LXC) Project를 비롯한 여러 Container 프로젝트를 계승 발전시켰다. Docker는 크게 두가지 Component로 구성된다. 첫번째는 Docker Engine으로, Container를 만들고 동작시키는 부분을 담당한다. 두번째는 Docker Hub로, Container를 배포하는 Cloud 서비스를 의미한다.(사용자는 Docker Hub를 통해 기존에 만들어져있는 Public Container를 다운 받아 사용할 수 있다.)
     Image는 code, runtime, libraries, 환경 변수 그리고 설정 파일을 포함한 lightweight, stand-alone, executable package를 의미한다. Container는 image의 runtime instance를 의미한다. 즉 image가 메모리 위에 올라가 동작하게 되면 container가 된다.


'Developing' 카테고리의 다른 글

Apache Kafka - Consumer  (0) 2014.12.31
네트워크 통신 프로토콜 정리  (3) 2012.04.30
데이터 단위  (0) 2012.01.30
MySQL 설치 실행 - CentOS  (0) 2011.10.19
리눅스 종류  (0) 2011.09.07