CI CD
컨테이너 가상화 이해
1. 컨테이너 기술이란?
- 컨테이너 기술이란?
- 컨테이너는 애플리케이션을 언제든 실행 가능하도록 필요한 모든 요소(소스 코드, 구성 요소, 종속성 등) 하나의 런타임 환경으로 패키징한 논리적 공간을 말한다. - docker에서는 Dockerfile buid를 통해 구현
- 애플리케이션과 종속 항목을 하나로 묶어, 실행하게 해주는 운영 시스템
- 가상화한 경량의 격리된 프로세스라고 볼 수 있다.
- microVM 이라고도 함
- 운영체제 수준의 가상화 제공
- 독립성을 갖기 때문에 다른 컨테이너에 영향을 주지 않는 statless 환경 제공
- 개인 데스크탑 뿐만 아니라 기업 내의 온프레미스 서버에서 AWS와 같은 퍼블릭 클라우드까지 언제 어디서든 빠르고 효율적으로 배포 가능하며, 확장성도 있다.
- 서버 구성, OS 설치, 네트워크, 개발 도구 구성 등의 반복적이고 불편한 작업에 시간을 낭비하지 않고 개발자는 애플리케이션 개발 그 자체에 집중할 수 있게 된다.
- 컨테이너 특징
- 컨테이너는 우리가 개발한 최소한의 Image를 통해 실행되므로 경량이다.
- 일반 서버 환경에서의 애플리케이션 실행과 달리 언제든 프로세스 수준의 속도로 빠르게 실행(run) 할 수 있고, 한번에 여러 개의 컨테이너를 동시에 실행 가능하다. - Docker에서는 docker compose 기술을 통해 구현
- 개인 환경이던 클라우드 환경이던 어떤 OS, 어떤 환경에서도 동작 가능한 이식성을 보유하고 있다.
- 컨테이너 자체 애플리케이션 환경에 대한 관리만 요구되므로, 지속적 서버관리 비용을 절감할 수 있다.
- 개발팀과 운영팀의 업무 분리로 각자의 업무와 세분화된 관리에 집중할 수 있다. 즉, 컨테이너는 DevOps workflow 구성에 최적이다.
- 컨테이너는 어떤 타입으로 생성되나?
- 컨테이너 패키징 메커니즘: 시스템 / 애플리케이션 / 라우터 컨테이너
- 시스템(or OS) 컨테이너
- 호스트 OS 위에 Ubuntu와 같은 배포판 리눅스 Image를 통해 배포되는 컨테이너
- 또 다른 VM의 형태이고, 내부에 다양한 애플리케이션 및 라이브러리 도구를 설치, 실행 가능
- 대표적으로 LXC, LXD, OpenVZ, Linux VServer, BSD Jails 등이 있다.
- 애플리케이션 컨테이너
- 단일 애플리케이션 실행을 위해 해당 서비스를 패키징하고 실행하도록 설계된 컨테이너
- 3-tier 애플리케이션과 같은 경우 각 tier (frontend-backend-DB)를 개별 컨테이너로 실행하여 연결
- 대표적으로 Docker container runtime, Rocket 등이 있다.
- Docker란?
- 여러 계층의 Application을 container로 분리, 연결하여 실행하는 MSA (MicroService Architecture) 프로젝트에 유용하다.
- Application의 Infra(runtime)는 Image를 통해 제공하고 Public or Private하게 공유 가능
- Github과 유사한 방식 (open share)으로 Docker Hub에서 제공 (https://hub.docker.com)
- 이렇게 제공된 Image를 기반으로 Application 서비스를 제공, 이를 컨테이너화(Containerization)할 수 있다.
2. Docker 컨테이너 가상화와 VM 가상화 비교
- 가상화(virtualization)?
- 일반적으로 서버, 스토리지, 네트워크, 애플리케이션 등을 가상화 하여 하드웨어 리소스를 효율적으로 사용하는데 그 목적이 있고 이를 통해 기업은 효율적인 자원 활용, 자동화된 IT 관리, 빠른 재해 복구 등의 장점을 갖을 수 있다.
- 물리적 하드웨어 유지 관리 대신 소프트웨어적으로 추상화된 가상화를 통해 제한된 부분을 쉽게 관리하고 유지할 수 있다.
- 하이퍼바이저 기반의 가상머신(VM, Virtual Machine)을 통해 수행한다. - Vmware, VitualBox 등
- 컨테이너 가상화 vs. VM 가상화
- 두가지 가상화 모두 샐행하고자 하는 애플리케이션 프로세스 및 종속 요소와 소스 등을 패키지, 즉 이미지화 하여 HostOS와 격리된 환경을 제공한다.
- 다만, VM 가상화는 실제 호스트 운영체제와 같이 별도의 GustOS를 두고 원하는 애플리케이션을 설치하는 하드웨어 수준의 가상화를 구현한다.
- 컨테이너 가상화는 VM 가상화에 비해 경량이면서 호스트 운영체제의 커널을 공유하는 운영체제(OS) 수준의 가상화를 구현한다.
- 따라서, 컨테이너 가상화는 원하는 애플리케이션 환경을 빠르게 번들링하여 패키징한다.
- 컨테이너화 (containerization) 기술
- 리눅스 컨테이너 기술은 LXC(Linux Container)를 이용한 시스템 컨테이너화로 시작
- OS 수준의 가상화 도구
- cgroup, namespace 등의 커널 기술을 공유하여 컨테이너에 제공
- 이후 애플리케이션 컨테이너 기반의 Docker 출시가 되었고, 초기 Docker 버전은 LXC를 활용해 컨테이너를 생성
- 지속된 컨테이너 엔진의 발전으로 Docker는 containerd, runC를 이용하는 방식으로 변경
- 커널 기술의 공유를 통해 컨테이너 생성 지원하는 runC
- 생성된 컨테이너 라이프사이클 관리를 지원하는 containerd
- 사용자 환경에서의 명령을 전달하는 dockerd