Infra/Docker

Docker Engine

최-코드 2024. 9. 12. 11:17

Docker Engine

  • Docker Daemon. REST API 서버, Docker CLI를 구성요소로 가지고 있다.
    • Docker Daemon : Docker 이미지, 컨테이너, 볼륨 및 네트워크를 관리하는 백그라운드 프로세스
    • Docker CLI : 명령줄 인터페이스
    • REST API 서버 :프로그램이 쓰는 API 인터페이스로 Daemon과 통신하고 명령어를 제공할 때 사용
    • 흐름) 명령어를 실행하면 Docker CLI가 적절한 HTTP 요청 형식으로 변환하고, REST API 서버로 이 요청을 전달한다. REST API는 Dcoker Daemon과 통신하여 Docker Daemon이 해당 요청을 처리한다.

Docker CLI 

  • 꼭 같은 Docker Engine 내에 있을 필요 없이 원격 Docker Engine과 작업할 수 있다.
  • 이를 위해서는 모든 명령어에 -H 옵션을 주고 원격 Docker Engine의 주소와 포트를 지정해주면 된다.
  • ex) docker -H ip:port run nginx

Containerization(컨테이너화)

  • docker는 namespace로 공간을 구분하며, 프로세스 ID와 네트워크, 프로세스 간 통신, 마운트(볼륨) 시스템이 독립된 namespace에 생성되고 따라서 컨테이너가 각각 분리된다.
  • namespace로는 PID를 사용한다.
    • PID는 고유하며 프로세스 두 개가 같은 PID를 가질 수 없다.
    • 현재 시스템 내부에 자식 시스템 컨테이너를 생성하면 자식 시스템은 자체적으로 독립된 시스템이라고 취급해야 한다. 즉, PID 1의 루트 프로세스에서 시작되는 고유의 시스템이다.
    • 컨테이너와 기본 호스트가 물리적으로 분리되지는 않는다. 즉, 컨테이너 안에 실행되는 프로세스는 사실 기본 호스트에서 실행되는 것이다. 그래서 기본 호스트에서 컨테이너에서 생성된 프로세스만큼 프로세스(PID)가 생성된다. 따라서 각각 namespace는 중복된 PID를 가질 수 있게 된다.
    • 이를 통해 컨테이너끼리 서로 간섭하지 않고, 독립적으로 작동한다.
    • 기본 호스트에서 동작중인 프로세스를 감춰줄 수 있다. 즉, 컨테이너 내부에서만 동작중인 프로세스만 보인다.

cgroups : 제어 그룹

  • docker 호스트와 컨테이너는 cpu와 메모리 등의 동일한 시스템 리소스를 공유한다.(docker 호스트에 컨테이너에서 실행되는 프로세스가 존재하므로)
  • 컨테이너가 사용할 수 있는 리소스는 기본적으로 제한이 없다.
  • 하지만 컨테이너가 사용할 리소스를 제한하는 옵션이 존재한다.
    • docker run --cpus .5 ubuntu와 같이 cpu의 사용량을 제한할 수 있다. 이 때 인자로는 0~1(0%~100%)의 값을 줘야 한다. 
    • docker run --memory 100m ubuntu와 같이 메모리를 제한할 수 있다.