본문 바로가기

DevOps/Micro Service

Docker - 원리와 process 살펴보기

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