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 |