docker에 대해 공부하면서 느낀 점을 공유하면 좋을 것 같아 포스팅합니다.


먼저 도커란 무엇인가 ? 
 공식 홈페이지에서 도커의 개요를 보면 도커란 "Docker는 컨테이너 이동을 주도하는 회사이며 하이브리드 클라우드의 모든 애플리케이션을 처리할 수 있는 유일한 컨테이너 플랫폼 제공 업체입니다“ 라고 쓰여있다. 

여기서 '컨테이너'란 말에 주목할 필요가 있다. 
컨테이너란 무엇일까? 
아래 그림을 보면 대충 감이 온다. 아래에 도커 이미지를 보면 귀여운 배 위에 컨테이너를 올린 모습을 볼 수 있다. 
대충 아! 컨테이너란 "다양한 OS에 여러 application이 올려져 있는 것"을 의미하는 거고 그런 컨테이너를 도커 위에 올리는구나 





그럼 이미 존재하는 Virtual Machines랑 뭐가 달라 ..? 
물론 다르다 위에 그림을 보면 각 컨테이너가 같은 Kernel을 공유하고 있는 모습을 볼 수 있다.


 위 그림을 보면 좀 더 명확하다. 
virtual machine의 경우 Hypervisor을 통해 가상화 기능을 제공한다. 각 독립 된 커널 공간을 가진 OS를 생성하는 식의 환경 구성을 해준다.
containers의 경우 커널 공간을 공유하며 같은 가상화 기능을 제공해준다.

* 같은 커 널공간을 공유하기 때문에 virtual machines보다 좀 더 가볍다. 


이런 구성도 가능하다.!! ( Virtual Machine에 OS를 설치 후 Docker를 설치 )
* 물론 이런 구성으로 실제 서비스를 제공하는 기업은 없을 거로 생각한다.  


어떻게 이런 게 가능할까 ? 
namespaces 와 cgroup에 대해서 알아야 한다. 

namespace 
먼저 리눅스 커널의 주요 이름 공간에 대해서 알아보자.
이름공간
기능
Mount namespace
파일 시스템 분리
UTS namespace
호스트 네임 분리
IPC namespace
프로세스간 통신 분리
User namespace
유저(UID/GID) 분리
PID namespace
프로세스 테이블 분리
Network namespace
네트워크 설정 분리
이름 공간은 모두 리눅스 상에서 동작하는 프로세스에 할당하는 자원을 분리하는 기능을 한다.

cgroups (Control Groups)
cgroups(Control Groups)는 자원(resources)에 대한 제어를 가능하게 해주는 리눅스 커널의 기능입니다.
cgroups는 다음 자원을 제어할 수 있다.
* 메모리, CPU, I/O, 네트워크, device노드

사실 이러한 기술이 처음 나온 건 아니다. LXC 등 유사한 기술이 많았으나 도커가 히트친 이유는 사용자 편의성 ( 이미지 repository 등 )에 있다고 생각한다

그럼 마지막으로 도커 이미지에 대해 알아보자.

도커 이미지
도커 이미지는 특정 프로세스를 실행하기 위한 환경이다. 
이 이미지는 필자가 가진 이미지들이다. 
Default registry ( hub.docker.com )에 등록된 centos:7같은 이미지를 가져올 수도 있고, 개인적으로 172.30.1.19:5000같은 registry을 등록해서 이미지를 주고 받을 수도 있다.
또한 nodejs-mongodb-test처럼 자신이 만든 서비스( api서버로 데이터를 받아 mongodb에 저장하는 간단한 서비스)를 이미지로써 제공할 수도 있다. 
yjhui-MacBook-Pro:elk yjh$ docker images
REPOSITORY                TAG                     IMAGE ID            CREATED             SIZE
nodejs-mongodb-test       yang                    ffe8520fe8cd        4 weeks ago         664MB
172.30.1.19:5000/centos   7                       e934aafc2206        3 months ago        199MB
centos                    7                       e934aafc2206        3 months ago        199M
mongo                     latest                  9a63ed32fc2b        5 weeks ago         378MB

도커를 사용하며 가장 편리한 점은 서비스를 만들어 상용 서버에 배포를 하려고 하면 환경이 달라 예상치 못한 일들이 발생해서 반나절을 보낸 경우가 많았다....
도커를 사용한다면 이런 불필요한 삽질을 줄일 수 있을 거로 생각한다. 
이미지를 구워서 실행하면 배포 완료..?  또한 서비스가 죽어도 다시 살리는 기능도 제공한다. 

물론 실제 서비스에서 도커를 통해 서비스를 안정적으로 제공하기 위해서는 도커에 대해 좀 더 공부가 필요하다.
앞으로의 포스팅은 도커의 다양한 기능에 대해 공부해 포스팅할 예정이다. 



'apps > docker' 카테고리의 다른 글

DevOps가 떠오른 이유  (0) 2018.11.25
쿠버네티스란 무엇인가?  (0) 2018.08.18
flannel을 통한 pod간 통신  (2) 2018.07.03
도커에서 nodejs+mongodb 테스트  (0) 2018.07.01
kubernetes에서 gpu pod생성( nvidia-docker2 )  (2) 2018.05.30

+ Recent posts