1. Docker (container) 의 작동 원리:
1) namespaces
2) cgroups
2. cgroups
- 메모리, CPU, I/O, 네트워크, device 노드(/dev/) 제어
3. namespaces
- 종류: mnt, uts, ipc, pid, net, user
- namespace 사용법
# unshare --fork --pid --mount-proc bash
# ps aux
# nsenter //cgroup 에 들어가지 않음. ㄹ소스 제한 영향 안 받음
# docker exec //cgroup 에 들어감. 리소스 제한 영향 받음
# cgcreate -a ssut -g memory:testgrp //ssut 유저 소유
# ls -alh /sys/fs/cgroup/memory/testgrp/ // /sys/fs/cgroup/{리소스}/{그룹이름}
# echo 2000000 > /sys/fs/cgroup/memory/testgrp/memory.kmem.limit_in_bytes //최대메모리 2MB
# cgexec -g memory:testgrp bash // bash 를 testgrp 그룹에 의해 제한 실행
4. 런타임(?)
- lxc, libcontainer, runc
- cgroup, namespaces 를 표준으로 정의해둔 OCI(Open Container Initative) 스펙을 구현한 컨테이너 기술의 구현체
1) lxc : canonical 이 지원하는 프로젝트
2) docker 에서의 runtime : lxc > libcontainer > runC(libcontainer 의 리팩토링 구현체) 로 자체 구현체를 갖게 됨.
5. Docker 의 Process
1) 구성도 (?)
Docker Engine
|
containerd
|
|------------------------------|--------------------------|
containerd-shim containerd-shim containerd-shim
| | |
runc runc runc
2) Docker Process 별 역할
a) containerd : OCI 구현체(주로 runC) 를 이용해 container 관리하는 daemon
b) Docker engine : 이미지,네트워크,디스크 등의 관리 역할
- Docker-engine 과 containerd 완전히 분리
- Docker engine 버전 올릴 때, 재시작해도 container 의 재시작 없이 사용할 수 있게 됩니다.
- 4개의 독립적인 Process
# ps aux | grep docker
docker
docker-containerd
docker-containerd-shim
docker-runc