Study/System Engineer

KDT - 도커의 기반 기술과 이론적 이해

jxx_yxjx 2024. 1. 22. 11:24

1. 컨테이너 기술이란

- 컨테이너 : 애플리케이션을 언제든 실행할 수 있도록 필요한 모든 요소를 하나의 런타임 환경으로 패키징한 논리적 공간

- 이러한 패키징 기술을 docker에서는 Dockerfile에 적힌 스크립트를 통해 구현한다.

 

- 애플리케이션과 종속항목을 하나로 묶어 실행하게 해주는 운영시스템을 가상화한 경량의 격리된 프로세스이다.

+ microVM이라고도 부름

+ 운영체제 수준의 가상화 제공

+ 독립성을 가지며 stateless 환경 제공

 

- 개인 데스크탑 뿐만 아니라 퍼블릭 클라우드까지 효율적으로 배포 가능하며 확장성 또한 가진다.

- 이를 통해 개발자는 서버  구성, OS설치 등 반복적이고 불필요한 작업에 시간을 들이지 않을 수 있다.

 

- 컨테이너는 최소한의 Image를 통해 실행되므로 경량이다.

 

- 일반 서버에 비해 빠르게 run 할 수 있고 한 번에 여러 개의 컨테이너를 동시에 실행 가능하다.

+ Docker에서 docker compose 기술 통해 구현

- 어떤 OS, 어떤 환경에서도 동작 가능한 이식성을 보유하고 있다.

 

- 컨테이너 자체에 대한 관리만 요구되므로 서버관리 비용을 절감할 수 있다.

- 개발팀과 운영팀의 업무 분리가 가능하다. (= DevOps workflow 구성에 적합하다)

 

2. 컨테이너 사례

대규모 애플리케이션 서비스부터 앱 서비스까지 다양한 환경에서 사용 중이다.

ex) 구글 웹 및 앱 서비스, 에어비앤비 추천서비스, 넷플릭스 추천 서비스, 엔씨소프트 게임 서비스, 삼성전자 헬스 케어 서비스 등

 

3. 컨테이너 생성 타입

- 시스템(OS) 컨테이너

호스트 OS 위에 Ubuntu와 같은 배포판 리눅스 이미지를 통해 배포되는 컨테이너

VM의 형태이며 내부에 다양한 애플리케이션, 라이브러리 도구를 설치 및 실행 가능

ex) LXC, LXD, OpenVZ, Linux Server, BSD Jails

 

- 애플리케이션 컨테이너

단일 애플리케이션 실행을 위해 서비스를 패키징하고 실행하도록 설계된 컨테이너

3-tier 애플리케이션과 같은 경우 각 tier(frontend-backend-DB)를 개별 컨테이너로 실행하여 연결

ex) Docker container runtime, Rocket

 

4. Docker란?

2013년 3월, Pycon에서 Docker에 대해서 창시자인 솔로몬 하익스가 소개

  • 여러 계층의 어플리케이션을 컨테이너로 분리, 연결하여 실행하는 마이크로서비스 아키텍처 프로젝트에 유용
  • 애플리케이션의 인프라(runtime)는 이미지를 통해 제공하고 퍼블릭 혹은 프라이빗하게 공유 가능
  • 깃허브와 유사한 방식(open share)으로 Docker Hub에서 제공
  • 이렇게 제공된 Image를 기반으로 Application 서비스를 제공, 이를 컨테이너화(Containerization) 가능

 

5. 가상화(virtualization)란?

  • 목적: 서버, 스토리지, 네트워크, 애플리케이션 등을 가상화하여 하드웨어 리소스를 효율적으로 사용
  • 장점: 기업의 효율적인 자원 활용, 자동화된 IT 관리, 빠른 재해 복구
  • 물리적 하드웨어 유지 관리 대신 소프트웨어적으로 추상화된 가상화를 통해 제한된 부분을 쉽게 관리 및 보수
  • 하이퍼바이저 기반의 가상머신(VM)을 통해 수행 ex) Vmware, VirtualBox 등

 

6. 가상화 기술의 역사

1991 ~ : 리눅스 프로세스 격리 : 리눅스, LXC

2010 ~ : Virtual Machine 가상화기술 : VMware, virtualbox

2013 ~ : 컨테이너 가상화기술 : dotcloud, docker

2015 ~ : 컨테이너오케스트레이션 : 쿠버네티스, AWS, Azure, docker swarm, GCP

 

7. 컨테이너 가상화 vs VM 가상화

  • Both : 애플리케이션 프로세스 및 종속 요소와 소스 등을 패키지, 즉 이미지화 하여 HostOS와 격리된 환경 제공
  • VM가상화: 별도의 OS를 두고 원하는 애플리케이션을 설치하는 하드웨어 수준의 가상화 구현
  • 컨테이너 가상화: VM가상화에 비해 경량, 호스트 운영체제의 커널을 공유하는 운영체제(OS)수준의 가상화를 구현, 원하는 애플리케이션 환경을 빠르게 번들링하여 패키징
  • 기본적으로 우분투 리눅스 기반으로 도커라이즈 (우분투를 유지보수하는 캐노니컬이 LXC를 지원했기 때문)

 

8. 컨테이너화(containerization) 기술

  • 리눅스 컨테이너 기술은 LXC를 이용한 시스템 컨테이너화로 시작
     
    • OS 수준의 가상화 도구
    • cgroup, namespace등의 커널기술을 공유해 컨테이너에 제공

      namespaces
    • 현재 리눅스 커널에서는 다음 6가지 namespace를 지원
      • mnt (파일시스템 마운트): 호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템을 마운트하거나 언마운트 가능
      • pid (프로세스): 독립적인 프로세스 공간을 할당
      • net (네트워크): namespace간에 network 충돌 방지 (중복 포트 바인딩 등)
      • ipc (SystemV IPC): 프로세스간의 독립적인 통신통로 할당
      • uts (hostname): 독립적인 hostname 할당
      • user (UID): 독립적인 사용자 할당
      cgroups (Control Groups)
      • 메모리
      • CPU
      • I/O
      • 네트워크
      • device 노드(/dev/)
    • cgroups(Control Groups)는 자원(resources)에 대한 제어를 가능하게 해주는 리눅스 커널의 기능
  • 초기 도커는 LXC를 그대로 응용해서 사용

 

  • 현재는 containerd, runC를 이용하도록 변경
  • 커널 기술 공유를 통해 컨테이너를 생성하도록 도와주는 runC
  • 생성된 컨테이너의 라이프사이클을 관리하는 containerd
  • 사용자 환경에서 명령을 전달하는 dockerd

 

 

docker는 1.11버전부터 실제로 위와 같은 구조로 작동 중

containerd: OCI 구현체(주로 runC)를 이용해 container를 관리해주는 daemon

Docker engine: 이미지, 네트워크, 디스크 등의 관리 역할

 

+ Docker engine과 containerd 각각이 완전히 분리된 덕분에 Docker engine 버전을 올릴 때 Docker engine을 재시작해도 container의 재시작 없이 사용할 수 있음