1. Docker란?
- vmware와 유사한 가상화 시스템이다.
- OS 레벨의 가상화 이다. OS에서 가상화를 관리 하기 떄문이다.
- 도커는 리눅스에서만 사용 가능한 가상화 컨테이너이다.
- 윈도우에서 사용하기 위한 방법(구글에 검색하면 많이 나와있습니다.
- 윈도우 10 Pro를 사용 할시 윈도우에서 제공하는 hyper-v 를 사용하여 Docker만 설치하면 사용 가능
- 윈도우 10 home 이하에서는 Docker에서 제공하는 Docker Toolbox(Legacy desktop solution) 를 사용
2. Docker 지원하는 가상화 방식?
- Host OS에 “격리된 가상화 공간”을 만드는 방법으로 가상화를 지원한다.
- “격리된 가상화 공간”에는 Guest OS가 필요가 없다.
- “격리된 가상화 공간”은 리눅스 자체 기술인 cgroup(control groups), namespace를 사용하여 만듭니다.
- “격리된 가상화 공간”은 독립된 파일시스템을 제공 받는다.
3. Docker의 장점
1) Docker 빠르다
- Docker가 빠른 이유는 “격리된 가상화 공간”에서 동작하는 프로세스들은 Host OS의 커널 및 System call을 공유하여 사용하기 때문이다.
즉, 실제 OS를 공유하여 사용하기 때문에 빠르다.
2) Docker는 가볍다.
- Docker는 “격리된 가상화 공간”에서 사용할 “실행 파일”과 “library”를 묶어 놓은 이미지만 있으면 바로 “격리된 가상화 공간”를 만들 수 있기 때문이다.
4. Docker의 핵심 용어
- 이미지와 컨테이너
- 이미지
- (실행파일 + library + 설정 값) 을 묶어 놓은 실행 가능한 해키지 이다.
- 읽기만 가능 하다.
- iso 파일과 같다고 볼수 있다.
- 컨테이너
- 이미지가 실행된 “격리된 가상화 공간”이다.
- 이미지의 변경 사항을 저장 할 수 있다.
- 컨테이너는 각기 독립 적으로 동작한다.
- 단, Host OS의 커널은 공유한다.
5. Docker의 철학
- 한 컨테이너에 프로세스 하나만 실행하는 것이다.
6. Docker의 전체 구조
- https://docs.docker.com/engine/docker-overview/ 참조
- Docker 시스템으 크게 내부(리눅스 Server에 설치된 Docker)와 외부(Docker Hub)의 구조 입니다.
- Docker 자체는 Client / Server 되어있습니다.
1) client [내부]
- 사용자와 상호작용을 하는 프로그램
- docker damond 에 명령을 보낸다.
2) docker host - Docker Dameon [내부]
- Docker API Request를 수신 대기 한다.
- image, container, networks, volumns 등을 관리 한다.
- docker 서비를 관리 하기 위해서 다른 데몬과 통신을 수행한다.
3) registry [외부]
- docker에서 사용 할 수 있는 공용 image를 보관 한다.
- client에서 pull(다운로드), push(업로드)를 사용 할시 registry에 pull 및 push 를 한다.
Docker 엔진 동작 방식 파악 하기
1. Docker와 기존 가상화와 비교
- “일반 적인 가상화”는 Guest OS가 필수로 필요
- Docker는 Host OS를 공유하여 사용하기 때문에 Guest OS가 불 필요
2. Docker engine 내부 구조
1) Docker에서 Container 관리를 위해서 사용 하는 주요 기술
(1) libcontainer
- Docker Version 0.9 이후 부터 기본으로 지원
- OS에서 독립 적이기 위해서 Docker에서 제공하는 Driver 입니다.
- Linux 플랫폼에 의존적인 LXC(LinuX Contianer)를 대체 하기위 Docker에서만든 컨테이너 관리 기술 입니다.
- docker에서 container list를 봤을 때 native면 libcontainer를 사용하는 container이고 lxc 리면 LXC를 사용하면 container 입니다.
- 기본적으로사용 Docker에서 사용 합니다.
- Host OS의 의존성을 제거하고 다양한 플랫 폼 지원(Red Hat, Microsoft Window, Etc ..)
(2) Cgroup
- OS가 관리하는 다양한 리소스를 중앙에서 제어하기 위한 도구입니다
- cgroups에서 관리하는 대상은 파일 시스템이나 프로세스뿐만 아니라 CPU 리소스와 메모리, 각종 디바이스, 네트워크 패킷, 네트워크 인터페이스 등 입니다.
(3) namespace
- namespace 란, 시스템 리소스를 프로세스의 전용 자원처럼 보이게 하고, 다른 프로세스와 격리시키는 기능입니다.
- namespace 에는 총 6가지 namespace 가 있습니다.
종류 | 설명 |
---|---|
Mount namespacaes | 파일시스템의 Mount 를 분할하고 격리합니다. |
PID namespacaes | 프로세스를 분할 관리합니다. |
Network namespacaes | Network 관련된 정보를 분할 관리합니다. |
IPC namespacaes | 프로세스간 통신을 격리합니다. |
UTS namespacaes | 독립적인 hostname 할당합니다. |
USER namespacaes | 독립적인 UID를 할당합니다. |
3. Docker는 어떻게 컨테이너를 관리 할까??
- 정답은 리눅스에서 제공하는
Cgroup
을 이용해서시스템 자원을 제한
하고namespace
를 이용하여각 프로세스를 격리
하여 프로세스별로 각각의 가상머신을 운영하는 것과 같은 격리 효과를 주어 가상황를 구현 합니다.
4. Docker는 어떻게 Host OS를 공유 할 수 있는가?
- docker는 cgroup과 namespace를 이용하여 프로세스를 격리 시키는 것 뿐이기 때문에 격리된 모든 프로세는 Host OS에서 동작 합니다.
5. Docker는 어떻게 다른 OS를 컨테이너에 올릴 수 있는 것인가??
- Docker는 리눅스에서만 실행 가능하다고 하였습니다. 그런데 어떻게 다른 OS를 올리수 있는 것일까요??
그 답은, libcontainer 를 사용하여 Docker의 단점인 Host OS 종속성을 제거 하였기 때문에 가능 합니다.