Docker Internals
docker/internals.md
http://docker-saigon.github.io/post/Docker-Internals/ 의 요약/번역
리눅스 컨테이너 요약 — 컨테이너란 무엇인가?
- 컨테이너는 호스트 커널을 공유한다.
- 컨테이너는 리소스 제어를 위해 프로세스를 그룹화하는 커널의 능력을 활용한다.
- 컨테이너는 네임스페이스들 간의 격리를 제공한다.
- 컨테이너는 경량의 VM처럼 느껴질 수 있으나 실제로 가상머신인 것은 아니다.
컨테이너의 생태계는 다음과 같은 구성요소를 포함한다: 런타임, 이미지 배포, 툴링(Tooling). Reference slide deck
컨테이너와 패키지 매니저의 차이?
이미지로 패키징하는 것은 RPM과 비슷하지만, 리눅스 배포본(소프트웨어가 제대로 패키지되어있기 어려운)과 분리되어 있다. Docker의 큰 혁신은 패키지 매니저보다 좀 더 사용하기 쉽다는 것이다. 패키지 매니저는 공유 라이브러리의 버전이 다르면 의존성 이슈를 일으켜 실패하는데, 이것은 공유 라이브러리를 이미지 내에 패키징하는 것으로 해결한다.
패키지 매니저들은 패키지 내부에 무엇이 들어있는지 파악할 쉬운 방법을 제공한다. 컨테이너 이미지를 다루는 방법에 대해서는 Dockercon EU talks의 Shipping Manifests, Bill of Lading and Docker Metadata and Containers — Video를 참고한다.
컨테이너와 구성 매니지먼트의 차이?
유명한 CM(Configuration Management) 도구로 Puppet(Ruby), Chef(Ruby), Ansible(Python), SALT(Python), Terraform(Golang) 등이 있다. 위의 몇몇 도구들은 절차적으로 환경을 구성하는데, self-contained하고 동일한 환경의 동일한 아키텍쳐에서 정확히 같은 방식으로 실행되는 패키지를 배포하는 것과는 다르다. 하지만 Docker 환경을 설치할 때 쓰는건 좋다. 이후에는 컨테이너 런타임 레이어가 어플리케이션 레이어를 관리하게 한다.
- Docker는 self-contained 이미지를 제공하며 클라우드에서나 랩탑에서나 정확히 동일하게 실행된다('Immutable Infrastructure').
- Docker는 매우 빠르며, 컨테이너를 띄우는데 수 초면 된다. 오버헤드도 매우 작다.
- Dockerfile DSL은 매우 간단하고 강력하다.
왜 Docker인가?
Docker 생태계는 현재 아래 패키지들을 모두 제공하는 유일한 생태계이다: Image management, Resource Isolation, File System Isolation, Network Isolation, Change Management, Sharing, Process Management, Service Discovery (DNS since 1.10).
어떻게 동작하는가? — 커널 네임스페이스
하이레벨 설명은 공식 문서를 볼 것.
- Process trees (PID Namespace)
- Mounts (MNT namespace)
wc -l /proc/mounts - Network (Net namespace)
ip addr - Users / UIDs (User Namespace)
- Hostnames (UTS Namespace)
hostname - Inter Process Communication (IPC Namespace)
ipcs— IPC를 쓰는 예시 = PostgreSQL
Cgroups
커널 제어 그룹(cgroups)을 통해 프로세스에 의해 사용된 리소스들의 관리를 할 수 있고, 장치 노드들에 대한 약간의 접근제어, 혹은 프로세스 그룹의 프리징 등을 제공한다. cgroups는 리소스들에 대한 하나의 계층구조(트리)를 제공한다. 아래는 하나의 예시이다.
cpu memory
├── batch ├── 109
│ ├── hadoop ├── 88 <
│ │ ├── 88 < ├── 25
│ │ └── 109 ├── 26
└── realtime └── databases
├── nginx ├── 1008
│ ├── 25 └── 524
│ └── 26
├── postgres
│ ├── 524
└── redis
└── 1008
각각의 계층구조에 서브그룹을 만들 수 있다. 위의 예시에선 cpu 리소스 아래에 batch와 realtime 서브그룹을 만들었다. 각각의 리소스에 대해 개별 프로세스가 1개의 노드가 된다. 예를 들어 pid 88은 cpu에도 메모리에도 있다.
(계속)