Docker Engine

  1. 구성
    • Docker CLI
      • 지금까지 사용했던 command line
      • REST API, Daemon과 다른 Docker Host에 있어도 됨
        • docker -H=<remote-docker-engine:>:2375 run nginx
    • REST API
      • 프로그램이 사용하는 API interface
      • daemon과 통신하고 command를 제공할 때 사용됨
      • 자신만의 도구를 만들 수 있음
    • Docker Daemon
      • image, volume,network를 관리하는 background process
  2. containerization : application이 어떻게 containerization 되는가

    • docker는 namespace로 공간을 구분
    • 아래 항목들이 독립된 namespace에 생성되고 container가 분리됨
      • Process ID
      • Network
      • InterProcess
      • Mount
      • Unix Timesharing
    • namespace 분리 기술 : PID(process ID)
      • PID는 고유하여 같은 PID를 가진 process는 존재할 수 없음
      • container는 host와 물리적으로 구분되지 않지만 분리되어있음
      • container 안에서 실행되는 process는 host에서 실행된다.
      • container 안과 host에서 실행되는 process의 PID가 같으면 원칙적으로 불가한데 이를 해결하기 위해 namespace를 사용
      • 각 process는 namespace를 통해 여러 PID를 연결하여 가질 수 있게됨
      • 즉, 모든 process는 같은 host에서 실행되지만 namespace에 의해 구분됨
  3. cgroups
    • container는 host와 hardware 자원을 공유함
    • container가 사용할 수 있는 CPU, memory를 제한
    • control groups
    • docker run --cpus==.5 ubuntu : cpu 50% 넘지 않도록 실행
    • docker run --memory==100m ubuntu : memory 100m 넘지 않도록 실행

실습

  1. container 내에서 실행되고 있는 process 확인
    • docker exec <container ID> ps -eaf
  2. 그냥 host에서도 process 확인 가능
    • ps -eaf | grep <process directory?>
  3. 위의 두 과정을 통해 같은 process가 host와 container 내부에서 다른 PID 가질 수 있음을 보여줌. 즉, container가 사용하는 root process는 결국 host에서 실행되는 process 중 1개.