Docker 시작하기 #1
Docker는 컨테이너 배포 및 런타임을 책임지는 컨테이너 엔진이다. 최근 개발 패러다임이 MSA, DevOps, Cloud으로 전환되면서 Docker는 엔지니어에게 필수 기술이 되었다. 사실 도커는 취준생 시절 조금이나마 최신 기술 트렌드를 알고있다고 어필 하기위해 사용법을 익힌것이 처음이다. 하지만 들으면 들을수록 Docker 컨테이너는 호스트 컴퓨터에 여러 운영체제를 올릴 수 있는 가상머신을 떠오르게 했다. 당시 함께 갔던 개발자 친구의 “그래서 Docker 컨테이너가 VM과 다른게 뭐야?” 하는 질문에 쉽게 대답하지 못했다.
Host 위에 올라가는 Guest라면 VM이 있는데 대체 Docker와 VM의 차이는 무엇일까?
취업 후 서비스를 컨테이너 이미지로 만들어 테스트/운영 서버에 배포하면서 이 질문에 대한 답을 어느정도 이해할 수 있었다. 이번 포스팅에서는 그동안 추상적으로 이해한 컨테이너가 무엇인지, 그리고 컨테이너를 지탱하는 기술인 Docker의 기본적인 사용법에 대해 두번에 걸쳐 글로 정리해 볼 계획이다.
VM의 기본 구조
하나의 하드웨어에 가상 계층을 두어 그 위에 병렬로 OS를 운영할 수 있는 매커니즘을 가상머신(VM) 이라 한다. 운영체제는 하드웨어와의 통신을 위해 커널 인터페이스를 가지고 있는데, 각각의 운영체제는 하드웨어를 공유하면서 자신만의 커널 인터페이스를 구축하여 병렬로 실행 가능한 것이다.
[Virtual Machine] |
하나의 하드웨어를 공유하여 운영체제를 병렬로 운영할 수 있어 관리 비용이 줄어든다는 장점이 있지만, 반대로 각각의 VM을 위한 커널이 필요하기 때문에 불필요한 리소스 소모를 감수해야 한다는 단점이 존재한다.
Docker Container는 무엇인가
단순하게 표현하자면 Docker에서 말하는 경량화된 VM이다.
어플리케이션은 일반적으로 언어 런타임, 라이브러리, 소스 코드로 구성되기 때문에 어플리케이션은 특정 머신에 설치한 운영체제에 종속적이이다. 때문에 개발자의 PC에서 개발된 어플리케이션을 운영 환경에 배포했을 때 종속성 문제가 발생하기 쉽다. 이러한 경우 서버에 동일한 환경의 VM을 구성하여 어플리케이션을 배포할 수도 있지만, 단지 하나의 어플리케이션을 위해 VM을 구성하기엔 불필요하게 소비되는 리소스의 크기가 너무나 크다. 그래서 나온 기술이 Container 다.
[Docker Architecture] |
Docker에서 Container는 chroot와 cgroup으로 격리된 공간을 만들어 Guest OS를 구동할 수 있도록 만든 블록이다.
- chroot란 리눅스의 특징으로 디렉토리 감옥이라 한다. Container를 위한 격리된 환경이다. /usr/bin 이란 폴더 내에 chroot로 디렉토리 감옥을 만들었다고 가정했을 때, /usr/bin/ 이하의 디렉토리가 새로운 컨테이너 환경이다.
- cgroup이란 cpu, mem 등의 리소스를 어떻게 할당해 줄 것인가를 결정하는 논리적 수단이다.
Docker는 chroot로 필요한 디렉토리 혹은 라이브러리를 제공하고, cgroup으로 자원을 할당하기 때문에 VM 환경에서 VM에 자원을 할당해주던 Hypervisor는 필요없다.
Docker는 각 컨테이를 실행하기 위한 엔진이다. 기존 VM에서는 각 VM을 위한 커널이 필요했지만, Docker 엔진은 Host OS와 Container 사이의 통합된 커널 인터페이스 역할을 하여 VM에 비교했을 때 더 효율적이고 가성비 좋은 운영환경을 제공한다. 즉, 완전한 OS 환경이 아닌 커널만으로 VM을 대체한다.
정리
여기까지 간단하게 Docker Container에 개념을 정리해 보았다. 사실 Docker는 어플리케이션 배포를 위해 이미지를 생성하고 Container Orchestration으로 실행하는 것 외에 깊게 공부하지 않아 깊이가 부족하다고 생각한다. 다시 한번 Docker의 장점에 대해 요약하자면 다음과 같다.
- 커널을 여러 컨테이너가 공유하는 형태로 VM보다 훨씬 가벼운 컨테이너 제공
- 하나의 물리적 컴퓨터에 복수의 가상화 컨테이너 제공
- 각각의 컨테이너는 독립된 운영체제
- 가볍고 기존 가상머신에 비해 리소스 효율이 좋음
- Docker의 궁극적 목적은 클라우드 서버 제공.
이번 글은 입사 초기에 Docker를 사용하기 전 개념을 이해하기 위해 국내외 Docker 관련 블로그를 보며 이해한 내용들을 정리한 것이다. 의외로 Docker를 접해보지 못했거나 입문하는 개발자들이 헷갈리는 내용이다보니 누군가에게 도움이 되었으면 한다. 다음에는 간단한 Docker 커맨드, 그리고 Docker 이미지를 빌드할 때 어플리케이션을 실행할 Container 환경을 구성하는 Dockerfile에 대해 정리 할 예정이다.
댓글남기기