Docker Engine 이란
Docker Engine(Docker 가 설치된 Host) 은 3개의 Component 로 구성됨
- Docker Daemon
- Docker REST API Server
- Docker CLI
Docker Daemon
- Docker Daemon 은 Docker 객체인 Image, Container, Volume 및 Network 를 관리하는 Background Process
Docker REST API Server
- Docker REST API Server 는 프로그램이 쓰는 API 인터페이스로 Daemon 과 통신하고 명령어를 전달할 때 사용됨
Docker CLI
- Docker CLI 는 평시 사용하는 명령줄 인터페이스로 Container 실행, 중지 및 Image 제거 등에 사용됨
- Docker REST API Server 를 사용하여 Docker Daemon 과 상호작용하는데 이 때 Docker CLI 가 같은 Host 에 존재하지 않아도 됨
docker -H=10.123.2.1:2375 run nginx와 같이 Docker Engine 의 주소와 포트를 지정해서 상호작용 가능
Containerization
- Docker 는 Namespace 로 공간을 구분함
- Process ID, Network, IPC, Mount 및 Unix Timesharing 시스템을 독립된 Namespace 에 생성
- 따라서 컨테이너가 각각 분리됨
Namespace - PID

- 모든 Process 는 같은 Host 에서 실행되지만 Namespace 에 의해 분리됨
- Container 내부에서 PID=1 인 Process 는 Host 에서 PID=5 인 Process 와 동일
docker exec {CONTAINER ID} ps -ef로 확인한 PID 와ps -ef로 확인한 PID 가 다름
cgroups
- Docker Host 와 Container 는 CPU 와 Memory 등 동일한 하드웨어 리소스를 공유함
- Container 가 사용할 수 있는 리소스는 기본적으로 제한이 없어서 Host 의 모든 리소스를 활용할 수 있음
- 이 때 cgroups(control groups) 를 통해 각 Container 에 할당된 하드웨어 리소스를 제한할 수 있음
docker run --cpus=.5 ubuntu로 Container 가 사용할 CPU 를 50% 로 제한docker run --memory=100m ubuntu로 Container 가 사용할 Memory 를 100MB 로 제한
- 자세한 내용은 공식 문서 참조
cgroup v1 vs v2
v1: 컨트롤러마다 트리가 따로 있다
/sys/fs/cgroup/cpu/ └─ pod_A (PID 10)
/sys/fs/cgroup/memory/ └─ pod_A (PID 10)
/sys/fs/cgroup/blkio/ └─ pod_A (PID 10)
v2: 트리가 하나다
/sys/fs/cgroup/
└─ pod_A/ cgroup.subtree_control = cpu memory io
└─ container_1/ cgroup.procs = 10- v1 = 컨트롤러(cpu, memory, blkio 등)마다 계층 트리가 따로 있다.
- 같은 프로세스가 컨트롤러마다 다른 트리에 속한다.
- 그래서 메모리 압박으로 생긴 디스크 쓰기(writeback)처럼 여러 자원이 얽힌 상황을 함께 제어하기 어렵다.
- v2 = 단일 트리(unified hierarchy)다.
- 하위 그룹에 어떤 컨트롤러를 켤지
cgroup.subtree_control로 정한다. - 프로세스는 leaf 그룹에만 둘 수 있다(no internal process 규칙).
- PSI(
memory.pressure,cpu.pressure)로 자원 압박을 볼 수 있다. memory.oom.group으로 그룹 단위 OOM kill 을 지원한다.
- 하위 그룹에 어떤 컨트롤러를 켤지
- 확인
stat -fc %T /sys/fs/cgroup/ # cgroup2fs = v2, tmpfs = v1 - 배포판: AL2 = v1, AL2023 = v2.
- K8s 지원 이력
- 1.25 = v2 GA
- 1.31 = v1 maintenance mode
- 1.35 = v1 지원 제거. v1 노드에서는
kubelet이 기동하지 않는다.
- K8s 에서 컨테이너와 cgroup 이 만들어지는 흐름은 01. Kubernetes Architecture 참고.