Docker 개념정리

<!-- TOC -->

<!-- /TOC -->

들어가기

서버관리나 엔지니어일을 해보지 않았지만, 웹 개발자 입장에서도 이 Docker라는건 상당히 흥미로워 보인다.

서버 운용에서의 Docker를 제외하더라도, 프로그래밍 개발할때 공용 개발환경과 같은 환경을 구성하기에 아주 요긴하게 사용될수 있을것 같다.

공부중이라 잘은 모르지만, 조금이라도 공부한 것들을 쉽게 잊지 않기위해 글을 남긴다.

Docker란

Docker란 어플리케이션 프로세스를 독립적으로 실행시킬 수 있는 리눅스 컨테이너 환경이다.

도커로고

위 Docker로고에서 저 고래가 Docker = Docker 엔진이고, 고래 등의 컨테이너 하나하나가 하나의 리눅스 컨테이너이다.

Docker가 무엇인지 대략적인 감을 잡으려면 기존의 가상머신 환경과 도커환경을 비교해 보는것이 가장 빠르다.

가상머신과 도커의 구조비교

Docker Engine이 Hypervisor와 Guest OS를 대신한다. 음 아니다. 대신한다고 말하면 안되고 Hypervisor와 Guest OS가 필요 없게 만들어준다.

기존의 가상화 환경을 예로들어 호스트 OS로 CentOS, 그 위에 GuestOS로 CentOS, 그리고 이 GuestOS에 Tomcat서버를 설치해서 서비스를 한다고 가정해보자.

저 중간의 GuestOS가 있음으로 인해서 장점은 GusetOS이미지로 서비스를 관리 하기때문에 HostOS와 독립적으로 이미지를 관리하여, 운영 및 유지보수에 용이하다는 점이다.

서버의 HostOS를 변경하면 GuestOS이미지를 떠서 백업하고 복구하면 그만인 것이다.

단점은,Guest OS전체를 가상화 해야 하기때문에 HostOS의 리소스를 GuestOS 가상화 구현에 많이 소모한다는 것이다. 그리고 이미지를 이식하기 위해서는 GuestOS가 포함되어 거대해진 용량의 이미지를 사용하게 된다.

Docker는 자바의 JVM과 비슷한 역할을 담당한다.

Docker는 Tomcat(리눅그 컨테이너)이 실행할수 있는 환경을 GuestOS대신 제공한다. 거기다 HostOS와 완벽히 분리된!

Tomcat이 실행하기 위한 커널 리소스 자원(CPU,메모리,디스크 등등)은 Docker가 대신 HostOS의 커널을 공유하여 제공한다.

이런 Docker의 아이디어는 새로운 아이디어가 아니다. LXC(리눅스 컨테이너)라고 해서 이미 기존에 있던 기술이었고, Docker는 이것의 발전된 형태라고 보인다.

Docker의 특징

  • 기존의 가상머신과 달리 도커 컨테이너는 성능의 손실이 거의 없어서, 차세대 클라우드 인프라 솔루션으로 주목받고 있다.

  • Go 언어로 만들어진 오픈소스 프로젝트이다. 기업용 유료 EE버전과 CE 무료버전이 존재한다.

  • 도커의 핵심 프로젝트인 도커 엔진과 더불어 도커 컴포즈(Docker Compose), 레지스트리(Private Registry), 도커머신(Docker Machine), Kitematic등 다양한 부가 프로젝트가 존재한다.

  • 이미지 공용 리파지토리인 Docker hub를 통해 Image를 다운받거나 공유할수 있다.

  • 리눅스 컨테이너 환경이라 리눅스에 최적화 되어있지만, 2018요즘 Windows와 Mac에서도 Docker를 지원한다.

Docker 이미지와 컨테이너

Docker에서는 서비스를 이미지로 관리한다.

이 이미지란 일종의 설치파일과 같다. Docker에 Ubuntu를 실행하고 싶다면 Ubuntu 이미지를 docker 허브에서 다운 받아오면 된다.

이 이미지에는 실행해야할 서비스관련 파일과 그 서비스가 동작하기 위해서 필요한 라이브리러를 포함하고 있다.

그리고 이 이미지로 컨테이너라는 것을 생성 할수 있다.

이 컨테이너는 이미지로 설치된 실제 동작이 가능한 서비스라고 보면 된다.

이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성되고, 이것이 바로 도커 컨테이너이다.

컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장한다.

따라서 컨테이너의 작업은 원본 이미지에게 영향을 주지 않으며, 생성된 각 컨테이너는 각기 독립된 파일시스템을 도커엔진으로부터 제공받아 완벽하게 호스트OS와 분리되게 된다.

도커엔진에 의해 효과적으로 HostOS의 자원을 사용하고, HostOs와 완벽히 격리된 환경에서 컨테이너 단위로 서비스를 실행할수 있기 때문에 서비스의 관리, 확장, 공유, 유지보수등이 용이하다.

마무리

Docker는 개념과 명령어만 알면 아주 쉽고 간편하게 원하는 서비스를 가상화로 돌릴수 있다. 그것도 아주 가볍게! 정확하지는 않지만 유튜브에서 듣기로는 Host서비스의 거이 98프로 정도의 성능을 낸다고 한다. 사실인지는 모르겠지만, 내가 직접 써보니 확실히 체감이 된다.