0부터 시작하는 Docker 공부 - 컨테이너와 namespace & cgroup

Jaehong Lee·2022년 8월 17일
0
post-thumbnail

1. Bare Metal VS 가상 머신 VS 컨테이너

  • 가상 머신과 컨테이너의 성능은 대략 30% 정도 차이 난다
  • 허나, 무조건 성능만을 보고 컨테이너가 가상 머신보다 좋은 것은 아니다. 가상 머신은 자체 Kernel 을 가지기에, Host OS 와 다른 환경의 guest OS 를 설치하여, 다른 환경의 APP 를 설치하여 사용할 수 있지만, 컨테이너의 경우 Host OS 를 직접 사용하므로, Host OS 와 동일한 환경의 APP 만 설치하여 사용할 수 있기 때문이다
    • ex ) 컨테이너의 경우 WINDOW OS 를 사용할 때, Linux 환경의 APP 을 설치하여 사용할 수 없다. 가상 머신의 경우 WINDOW OS 위에 하이퍼 바이저 위에 guest OS 로 Linux OS 를 설치하여, Linux 환경의 APP 을 설치하여 사용 가능하다

Bare Metal

  • 애플리케이션이 OS 위에 직접 배포된다

가상 머신

  • 하이퍼 바이저를 이용하여 가상 서버를 구축하고, 해당 서버 위에 애플리케이션이 배치되는 형태로 가상 머신은 각자의 커널을 갖는다. 실제로 애플리케이션이 동작하기 위해서는 guest OS -> guest OS 의 커널 -> 하이퍼 바이저 -> Host OS 의 커널 -> 물리 자원을 거쳐야 하므로 성능 저하가 발생한다

  • Host OS 가 있을 수도 있고, 없을 수도 있다

컨테이너

  • 컨테이너 : 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지. 즉, 어떤 환경에서나 실행하기 위해 필요한 모든 요소를 포함하는 소프트웨어 패키지

    • 도커 컨테이너 : 도커 컨테이너란 이미지를 통해 실행한 인스턴스
    • 리눅스 컨테이너 : 시스템의 나머지 부분과 분리된 1개 이상의 프로세스 세트
  • 도커 엔진 : 도커에서 이미지와 컨테이너를 관리하는 도구이며, 도커의 핵심이다

  • 컨테이너는 자신이 속한 OS 의 커널을 직접 사용하므로, 성능 저하가 거의 없다

  • 컨테이너는 가상 머신처럼 물리적 자원을 격리시키는 것이 아니라, 프로세스를 격리를 통해 경량의 이미지를 실행하고 서비스하게 해준다

    • 클라우드 서비스의 컨테이너는 애플리케이션을 구동하는 환경을 격리한 공간을 의미
  • 컨테이너의 자원의 기본은 별도로 할당하지 않았으므로 물리 자원을 공유한다. 허나, cgroup 이용해서 각 컨테이너 별로 cpu , ram 사용량 제한을 걸 수 있다

사용자 입장에서는 자신이 사용하는 애플리케이션이 가상 머신 OR 컨테이너 에서 동작하는 것은 관심 대상이 아니다. 사용자는 빠른 처리 속도만을 요구한다. 최근에는 대부분의 애플리케이션이 잦은 I/0 를 요구하므로, 컨테이너를 이용하는 경향이 많다

  • 따라서 성능 저하가 없으면서도 배포가 용이하고, 스케일등의 적용이 쉬운 컨테이너를 이용하는 것이 이용자를 위해서 유리하다

2. namespace & cgroup

  • 도커는 리눅스에서 사용하던 기술인 namespace ( 프로세스 자원 관리 & 격리 ) , cgroup ( 자원 사용 제한 ) 을 이용하여 개발되었다

도커의 namespace 는 아래와 같은 Linux 의 namespace 를 차용하여 만들었다

  1. user namespace : 사용자 또는 그룹별로 격리

  2. UTS ( unix time-sharing ) namespace : 응용 프로그램 입장에서 호스트명과 도메인에 대한 분리된 가시성을 제공

  3. mount namespace : 프로세스에서 마운트된 파일 시스템에 대해 가시성을 제공하기 위해 자신만의 mount namespace 를 사용할 수 있다 ( 각각의 컨테이너에서 별도의 호스트 디렉터리를 마운트 할 수 있다 )

  4. PID namespace : Process ID 는 Host 상의 다른 응용 프로그램으로 부터 격리될 수 있다. 이를 통해 동일한 애플리케이션이 동시에 2개 이상 동작하는 것도 가능하다

  5. network namespace : 네트워크 인터페이스, 라우팅 테이블등에 대한 격리가 가능하다

3. 컨테이너와 CI / CD & 쿠버네티스

CI / CD

  • 기존에는 코드의 변경 사항을 일괄적으로 모아 한꺼번에 서버에 올리는 형식이었다면, 이제는 각 개발자가 자신이 담당하는 코드를 github / gitlab 에 push 하면, 이를 감지한 CD ( gitlab , jenkins ) 가 컨테이너에 이를 실시간 ( 비정기적 , 정기적-CRON ) 으로 이를 컨테이너에 반영한다
    • gitlab 은 설치형 오픈 소스로도 제공된다

쿠버네티스

  • 쿠버네티스는 컨테이너를 생성하는 runtime ( containerd, cri-o, rkt, podman 등 ) 이 아니다. 쿠버네티스는 다양한 runtime 을 사용하므로, 사실상 표준으로 취급된다

  • 쿠버네티스와 달리 runtime 으로 도커만을 사용하는 오케스트레이션 툴인 swarm 도 있다

profile
멋진 엔지니어가 될 때까지

0개의 댓글