컨테이너와 도커
컨테이너
이미지
- 이미지는 코드,런타임,시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지이다. 
- 상태값을 가지지 않고 변하지 않는다는 특징이 있다. 
- 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 변경되거나 삭제되어도 이미지는 변경되거나 삭제되지 않는다. 
- 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 매우크다. 
- 도커 이미지를 효율적으로 관리하기 위해 유니온 파일 시스템을 이용하여 레이어라는 개념을 사용한다. 
- 이미지는 여러 개의 readOnly 레이어로 구성되고, 파일이 변경되면 새로운 레이어가 생성된다. - ex) 우분투 이미지가 - a+- b+- c의 집합일 때,
- 우분투 기반의 nginx 이미지는 - a+- b+- c+- nginx+- source
- 이후 수정이 발생한다면 특정 레이어만 교체하면 된다. 
 
컨테이너
- 컨테이너는 이미지를 실행한 상태이다. 
- 도커 컨테이너의 경우 도커 엔진에서 실행될 때 이미지가 컨테이너가 된다. 
- 리눅스와 윈도우 기반 어플리케이션 모두에서 사용할 수 있는 컨테이너화된 소프트웨어는 인프라에 관계없이 동일하게 항상 동작한다. 
- 컨테이너는 소프트웨어를 환경으로부터 격리시키고 균일하게 작동하도록 보장한다. 
- 용어 정리 
이미지
서비스 운영에 필요한 서버 프로그램, 소스 코드, 컴파일된 실행 파일을 묶은 형태
컨테이너
앱이 구동되는 환경까지 감싸서 실행할 수 있도록 하는 격리 기술, 이미지를 실행한 상태
컨테이너 런타임
컨테이너를 다루는 도구
도커
컨테이너 런타임 중 하나
쿠버네티스
컨테이너 런타임을 통해 컨테이너를 오케스트레이션 하는 도구
오케스트레이션
여러 서버에 걸친 컨테이너 및 사용하는 환경 설정을 관리하는 행위
컨테이너와 가상머신 차이점

- 컨테이너 - OS 레벨에서의 가상화를 제공하며 이를 반가상화(para-virtualization)이라고 부른다 
- 각 컨테이너는 호스트 OS의 커널을 공유하지만, 나머지 소프트웨어 스택은 독립적으로 실행된다 
- 구조: 호스트 OS 위에 컨테이너 런타임(ex: 도커)가 있고, 이 런타임 위에 여러 컨테이너가 실행된다 
 
- 가상머신 - 하드웨어 레벨까지의 가상화를 제공하며 이를 전가상화(full-virtualization)이라고 부른다 
- 각 가상머신은 전체 운영체제와 필요한 라이브러리 및 응용 프로그램이 포함된 자체적인 가상 환경을 갖는다 
- 구조: 물리적 하드웨어 위에 하이퍼바이저(ex: VMware, Hyper-V)가 있고, 하이퍼바이저 위에 여러개의 가상머신이 실행된다 
 
주요 차이점
- 크기: 컨테이너는 가상머신보다 가볍고, 빠르게 시작된다 
- 성능: 컨테이너는 네이티브 성능에 가깝고, 가상머신은 추가적인 오버헤드가 있다 
- 격리: 컨테이너는 OS 커널을 공유하는 반면, 가상머신은 자체적인 가상 환경을 가지므로 더 강력한 격리를 제공한다. 
- 이식성: 컨테이너는 응용 프로그램과 모든 종속성을 함께 패키징하기 때문에 다른 컴퓨팅 환경에 더 편리하게 실행시킨다 
도커
- 도커는 컨테이너 기반의 오픈소스 가상화 플렛폼이다 
- 프로그램과 실행환경을 컨테이너로 추상화하여 동일한 인터페이스를 제공함으로써, 프로그램의 배포 및 관리를 용이하게 해준다 
- 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등을 컨테이너로 추상화할 수 있고, 이를 PC, ASW, Azure, Google cloud 등 어디서든 실행가능하게 만든다 
Docker Engine
도커 엔진은 아래와 같은 역할을 수행한다.
- 호스트에 파일 적재 도커 엔진은 도커 이미지에 정의된 파일을 호스트의 파일 시스템에 적재한다. 
- 파일 시스템 마운트 도커 엔진은 컨테이너마다 호스트 시스템의 파일 시스템을 컨테이너 파일 시스템에 마운트한다. 
- 격리된 파일 시스템 환경 도커 엔진은 각각의 컨테이너에 대해 파일 시스템 네임스페이스를 생성하여 컨테이너마다 독립된 파일 시스템을 가지게 한다. 
- 자원 관리 컨테이너의 리소스 제한과 관리를 위해 cgroups 커널 기능을 활용하여 컨테이너를 관리한다. 
Docker Engine 구조

Docker Daemon
- 도커 엔진의 핵심 구성 요소로, 백그라운드에서 실행되며 도커의 주요 기능을 제공합니다. 
- 도커 데몬은 컨테이너 관리, 이미지 빌드, 네트워크 설정 등의 작업을 처리합니다. 
- 또한 도커 API를 통해 클라이언트와 상호작용하고, 도커 레지스트리에서 이미지를 가져와서 실행할 수 있도록 합니다. 
- 도커 데몬은 Dockerfile을 기반으로 이미지를 빌드합니다. 
Docker CLI
- 사용자와 도커 데몬 사이에서 상호작용하기 위한 명령어 인터페이스입니다. 
- 도커 CLI는 커맨드 라인에서 입력한 명령어를 받아 도커 데몬에 전달하고, 결과를 출력합니다. 
- 사용자는 도커 CLI를 통해 컨테이너 생성, 이미지 빌드, 네트워크 설정 등을 수행할 수 있습니다. 
Docker Registry
- 도커 레지스트리는 도커 이미지를 저장하고 관리하는 중앙 저장소입니다. 
- 도커 이미지는 컨테이너를 생성하는 데 필요한 파일과 설정 등의 모든 정보를 포함하고 있습니다. 
- 도커 레지스트리는 도커 이미지를 저장하고 공유하기 위한 중앙 저장소로서 도커 허브(Docker Hub)가 가장 유명한 도커 레지스트리입니다. 
- 사용자는 도커 클라이언트를 사용하여 도커 레지스트리에서 이미지를 검색하고 내려받을 수 있습니다. 
ref
Last updated