1980년대 이전
1975년 마이크로소프트 설립
자유 소프트웨어 운동( Free Software Movement )
GNU GPL(GNU General Public Licence)
리눅스의 탄생
아파치 웹서버와 리눅스
소프트웨어 컨테이너(container) 는 애플리케이션과 종속성을 하나의 단위로 묶어 격리된 환경을 제공합니다. 호스트 os 커널을 공유하면서도 독립적으로 실행되어 전통적인 가상 머신(VM) 보다 훨씬 가볍습니다.
Container Engine (Docker,Podman)
커널 공유 방식
네임스페이스 격리
자원관리
자원 할당 제어 cgroups(컨트롤 그룹)은 컨테이너별로 시스템 자원(Resource)사용량을 제한합니다.
리소스제한 CPU, 메모리, 디스크 , I/O, 네트워크 대역폭 등의 사용 한도를 설정합니다.
품질 보장 한 컨테이너가 과도한 자원을 소비하여 다른 컨테이너에 영향을 주는 것을 방지합니다.
유니온 마운트 파일시스템(Union FS)이란 여러 개의 디렉토리(파일시스템)를 하나로 통합하여 볼 수 있게 하는 파일시스템 기법입니다. 즉, 한 디렉토리 위치에 다수의 다른 디렉토리를 겹쳐서 마운트하여, 겉에서 볼 때는 단일 디렉토리 트리로 보이게 합니다.
레이어드 구조
Copy-on-Write(CoW) 메커니즘
효율적인 자원 공유
빠른 이미지 빌드
표준화된 패키징
OCI 에서 컨테이너 기술 관리
Docker는 컨테이너를 관리하기 위해 클라이언트-서버 아키텍쳐를 채용하고 있습니다. 이를 구성하는 주요 컴포넌트는 다음과 같습니다.
docker로 대표되는 명령줄 인터페이스로, 사용자가 Docker와 상호작용하는 도구입니다.
Docker 에서는 컨테이너 실행에 필요한 이미지를 관리합니다. 이미지는 앞서 언급한 계층화된 파일시스템 스냅샷으로 구성된 템플릿이며, Docker Hub와 같은 이미지 레지스트리 서버에 저장되고 공유됩니다.
Docker 클라이언트가 docker pull을 수행하면 Docker 데몬이 해당 레지스트리에서 이미지를 다운로드하여 로컬에 캐시합니다. Docker 레지스트리는 공개/사설로 운영될 수 있어, 기업 내부에서는 프라이빗 레지스트리를 구축해 사용하기도 합니다.
Docker 이미지는 Dockerfile로부터 docker build 명령으로 생성하며, 빌드 시 각 명령어마다 레이어가 쌓여 효율적으로 생성됩니다. docker run 으로 컨테이너를 시작할 때 요청한 이미지가 없으면 자동으로 풀(Pull)해오며, 이미 있다면 캐시된 이미지를 가져옵니다.
Docker는 컨테이너 간 가상 네트워크를 구성하기 위한 다양한 네트워크 드라이버를 제공합니다.
Docker는 데이터 지속성을 위한 볼륨(volume) 기능을 제공합니다.
이러한 요소들은 Docker 데몬이 컨테이너 생성 시 옵션에 따라 설정하며, 컨테이너 환경을 앱 구동에 적합하게 보완합니다.
사용자 명령 입력 (사용자가 터미널에서 docker run 등의 명령을 입력합니다.)
->
API 요청 전송 (Docker CLI가 명령으 Docker 데몬의 API 앤드포인트로 전송합니다.)
->
데몬 처리 (Docker 데몬이 요청을 처리하고 필요한 작업을 수행합니다.)
->
컨테이너 실행 (containerd 와 runC 를 통해 실제 컨테이너 프로세스가 생성됩니다.)
OCI의 목적 : 컨테이너 기술의 표준화를 위해 2015년에 설립된 리눅스 재단 프로젝트입니다. 컨테이너 포맷과 런타임에 대한 개방형 업계 표준을 개발하는 것이 목표입니다.
런타임 규격 : 컨테이너 런타임의 동작 방식을 정의하는 표준으로, 컨테이너 생성, 실행, 삭제 등의 작업에 대한 규격을 제공합니다. runC는 이 규격의 참조 구현체 입니다.
이미지 규격 : 컨테이너 이미지의 구조와 메타데이터를 정의하는 표준으로, 이미지의 생성, 전송, 검증 방법을 규정합니다. 이를 통해 다양한 컨테이너플랫폼 간의 호환성을 보장합니다.
하이퍼바이저 위에서 각 VH마다 게스트 OS를 포함한 전체 시스템을 실행합니다.
호스트 OS의 커널을 공유하며 각 앱을 격리 실행합니다.
가상머신
컨테이너
하이브리드 접근
효율성
종속성 충돌 방지
개발 환경
대규모 시스템에서는 수십~수백 개 이상의 컨테이너를 자동으로 관리해주는 컨테이너 오케스트레이션이 필수적입니다.
배포자동화(컨테이너 배포를 자동으로 관리) -> 스케일링(부하에 따른 컨테이너 수 조정) -> 로드밸런싱( 트래픽을 컨테이너에 균등 분배) -> 자가치유(장애 컨테이너 자동 복구) -> 배포자동화(컨테이너 배포를 자동으로 관리)
대표적 컨테이너 오케스트레이션 오픈소스 Kubernetes
클러스터 구성
Podman(POD 관리자)은 컨테이너를 개발, 관리, 실행하기 위한 오픈소스 툴입니다. Red hat 엔지니어가 오픈소스 커뮤니티와 함께 개발한 Podman은 libpod 라이브러리를 사용하며 컨테이너 에코시스템 전체를 사용합니다.
포드는 모두 함께 실행되며 동일한 리소스를 공유하는 컨테이너 그룹으로, 쿠버네티스 포드와 유사합니다.
Podman 은 libpod 라이브러리와 간단한 커맨드라인 인터페이스(CLI)를 통해 포드를 관리합니다.
Podman의 CLI는 Open Container Initiative(active(OCI)) 컨테이너를 생성하고 지원합니다.
각 포드는 하나의 인프로 컨테이너와 다수의 일반 컨테이너로 구성되어 있습니다. 인프라 컨테이너는 포드를 실행하고 사용자 네임스페이스를 유지 관리하여 컨테이너를 호스트로부터 분리합니다.
향상된 보안 : 루트리스 컨테이너로 보안 리스크 감소
데몬이 없는 구조 : 루트 권한 프로세스에 의존하지 않음
일반 사용자 권한 : 관리 권한 없이 컨테이너 관리 가능
Podman의 특징
Docker의 특징