KDT - 도커의 기반 기술과 이론적 이해
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): 독립적인 사용자 할당
- 메모리
- 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의 재시작 없이 사용할 수 있음