# 컨테이너와 도커

## 컨테이너

### 이미지

* 이미지는 코드,런타임,시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지이다.
* 상태값을 가지지 않고 변하지 않는다는 특징이 있다.
* 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 변경되거나 삭제되어도 이미지는 변경되거나 삭제되지 않는다.
* 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 매우크다.
* 도커 이미지를 효율적으로 관리하기 위해 유니온 파일 시스템을 이용하여 **레이어**라는 개념을 사용한다.
* 이미지는 여러 개의 readOnly 레이어로 구성되고, 파일이 변경되면 새로운 레이어가 생성된다.
  * ex) 우분투 이미지가 `a` + `b` + `c` 의 집합일 때,
  * 우분투 기반의 nginx 이미지는 `a` + `b` + `c` + `nginx` + `source`
  * 이후 수정이 발생한다면 특정 레이어만 교체하면 된다.

\


### 컨테이너

* 컨테이너는 이미지를 실행한 상태이다.
* 도커 컨테이너의 경우 도커 엔진에서 실행될 때 이미지가 컨테이너가 된다.
* 리눅스와 윈도우 기반 어플리케이션 모두에서 사용할 수 있는 컨테이너화된 소프트웨어는 인프라에 관계없이 동일하게 항상 동작한다.
* 컨테이너는 소프트웨어를 환경으로부터 격리시키고 균일하게 작동하도록 보장한다.

\


* 용어 정리

| 용어       | 뜻                                                |
| -------- | ------------------------------------------------ |
| 이미지      | 서비스 운영에 필요한 서버 프로그램, 소스 코드, 컴파일된 실행 파일을 묶은 형태    |
| 컨테이너     | 앱이 구동되는 환경까지 감싸서 실행할 수 있도록 하는 격리 기술, 이미지를 실행한 상태 |
| 컨테이너 런타임 | 컨테이너를 다루는 도구                                     |
| 도커       | 컨테이너 런타임 중 하나                                    |
| 쿠버네티스    | 컨테이너 런타임을 통해 컨테이너를 오케스트레이션 하는 도구                 |
| 오케스트레이션  | 여러 서버에 걸친 컨테이너 및 사용하는 환경 설정을 관리하는 행위             |

\


### 컨테이너와 가상머신 차이점

![](https://velog.velcdn.com/images/dragonappear/post/dff45d71-b69d-4c8c-9dbf-40c74d5be284/image.png)

* 컨테이너
  * OS 레벨에서의 가상화를 제공하며 이를 반가상화(para-virtualization)이라고 부른다
  * 각 컨테이너는 호스트 OS의 커널을 공유하지만, 나머지 소프트웨어 스택은 독립적으로 실행된다
  * 구조: 호스트 OS 위에 컨테이너 런타임(ex: 도커)가 있고, 이 런타임 위에 여러 컨테이너가 실행된다
* 가상머신
  * 하드웨어 레벨까지의 가상화를 제공하며 이를 전가상화(full-virtualization)이라고 부른다
  * 각 가상머신은 전체 운영체제와 필요한 라이브러리 및 응용 프로그램이 포함된 자체적인 가상 환경을 갖는다
  * 구조: 물리적 하드웨어 위에 하이퍼바이저(ex: VMware, Hyper-V)가 있고, 하이퍼바이저 위에 여러개의 가상머신이 실행된다

#### 주요 차이점

* 크기: 컨테이너는 가상머신보다 가볍고, 빠르게 시작된다
* 성능: 컨테이너는 네이티브 성능에 가깝고, 가상머신은 추가적인 오버헤드가 있다
* 격리: 컨테이너는 OS 커널을 공유하는 반면, 가상머신은 자체적인 가상 환경을 가지므로 더 강력한 격리를 제공한다.
* 이식성: 컨테이너는 응용 프로그램과 모든 종속성을 함께 패키징하기 때문에 다른 컴퓨팅 환경에 더 편리하게 실행시킨다

***

\


## 도커

* 도커는 컨테이너 기반의 오픈소스 가상화 플렛폼이다
* 프로그램과 실행환경을 컨테이너로 추상화하여 동일한 인터페이스를 제공함으로써, 프로그램의 배포 및 관리를 용이하게 해준다
* 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등을 컨테이너로 추상화할 수 있고, 이를 PC, ASW, Azure, Google cloud 등 어디서든 실행가능하게 만든다

### Docker Engine

도커 엔진은 아래와 같은 역할을 수행한다.

1. 호스트에 파일 적재\
   도커 엔진은 도커 이미지에 정의된 파일을 호스트의 파일 시스템에 적재한다.
2. 파일 시스템 마운트 도커 엔진은 컨테이너마다 호스트 시스템의 파일 시스템을 컨테이너 파일 시스템에 마운트한다.
3. 격리된 파일 시스템 환경 도커 엔진은 각각의 컨테이너에 대해 파일 시스템 네임스페이스를 생성하여 컨테이너마다 독립된 파일 시스템을 가지게 한다.
4. 자원 관리 컨테이너의 리소스 제한과 관리를 위해 cgroups 커널 기능을 활용하여 컨테이너를 관리한다.

\


### Docker Engine 구조

![](https://velog.velcdn.com/images/dragonappear/post/f2ae5aba-0e2d-4d77-8a4f-2af434f66a83/image.png)

#### Docker Daemon

* 도커 엔진의 핵심 구성 요소로, 백그라운드에서 실행되며 도커의 주요 기능을 제공합니다.
* 도커 데몬은 컨테이너 관리, 이미지 빌드, 네트워크 설정 등의 작업을 처리합니다.
* 또한 도커 API를 통해 클라이언트와 상호작용하고, 도커 레지스트리에서 이미지를 가져와서 실행할 수 있도록 합니다.
* 도커 데몬은 Dockerfile을 기반으로 이미지를 빌드합니다.

\


#### Docker CLI

* 사용자와 도커 데몬 사이에서 상호작용하기 위한 명령어 인터페이스입니다.
* 도커 CLI는 커맨드 라인에서 입력한 명령어를 받아 도커 데몬에 전달하고, 결과를 출력합니다.
* 사용자는 도커 CLI를 통해 컨테이너 생성, 이미지 빌드, 네트워크 설정 등을 수행할 수 있습니다.

\


#### Docker Registry

* 도커 레지스트리는 도커 이미지를 저장하고 관리하는 중앙 저장소입니다.
* 도커 이미지는 컨테이너를 생성하는 데 필요한 파일과 설정 등의 모든 정보를 포함하고 있습니다.
* 도커 레지스트리는 도커 이미지를 저장하고 공유하기 위한 중앙 저장소로서 도커 허브(Docker Hub)가 가장 유명한 도커 레지스트리입니다.
* 사용자는 도커 클라이언트를 사용하여 도커 레지스트리에서 이미지를 검색하고 내려받을 수 있습니다.

\


***

#### ref

* [쿠버네티스 알아보기 1편: 쿠버네티스와 컨테이너, 도커에 대한 기본 개념](https://www.samsungsds.com/kr/insights/220222_kubernetes1.html)
* [컨테이너와 가상 머신의 차이점은 무엇인가요?](https://aws.amazon.com/ko/compare/the-difference-between-containers-and-virtual-machines/)
* [\[Docker\] 개념 정리 및 사용방법까지.](https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/)
