이 글은 이성미 강사의 따배도 강의를 보고 작성한 글입니다.

출처: https://itwiki.kr/w/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88_%EA%B0%80%EC%83%81%ED%99%94
과거에는 BareMetal의 하나의 시스템에 여러가지 어플리케이션을 운영하다가, 점차 하드웨어 가격이 작아지고, 성능은 좋아지고, 운영해야할 어플리케이션은 많아져 가상화 플랫폼으로 옮겨지게 되었다.
가상화 플랫폼에서는 Hypervisor위로 가상 운영체제를 설치하고 그 위에 어플리케이션을 올리게 되었다. 그런데 이 가상환경 위에 운영해야하는 어플리케이션이 많아지면서, 이러한 가상환경 플랫폼으로는 한계가 생기게 되었다.
그래서 나타난게 컨테이너 플랫폼이다. 컨테이너로 운영되는 어플리케이션은 용량이 작다. 실제 어플리케이션과 그걸 실행할 수 있는 최소한의 환경만 들어가 있기 때문이다.
그리고 isolated되어있고, 확장성이 좋다.
APP과 그걸 실행하기 위한 라이브러리 또는 NodeJS같은 환경을 컨테이너에 넣는다.
=>리눅스 커널 기능을 써야 하기 때문이다.
독립된 공간 형성
Isolate 기능 지원: 하나의 컨테이너와 하나의 다른 컨테이너가 완전히 독립될 수 있도록 한다.
필요한만큼 HW를 지원해준다.
이 기능들은 모두 리눅스 커널에 있다. 이 리눅스 커널에 있는 기능을 기반으로 해서 컨테이너를 만든다.
windows와 Mac OS는 커널이 없기에 Hypervisor 기능들을 활성화 해야 컨테이너를 돌릴 수 있게 된다.
일반 프로그램: 서버 프로그램인 app.js가 있다. 이것은 nodeJS기반에서 동작하므로 이 서버 프로그램을 실행하기 위해서는 그 전에 먼저 nodeJS를 설치해야한다.
컨테이너: dockerfile을 통해 nodeJS와 app.js를 가지고 컨테이너 빌드한다. 이 컨테이너를 실행하면 자동으로 서버 플로그램을 실행한다.
개발자가 만든 그대로 어시서든 돌아간다.
확장/축소가 쉽고, MSA, DEVOPS에 적합하다.
개발자가 application container를 만들면 A고객사에 제공을 한다. 고객사는 원래 개발자가 어플을 만들 때 사용한 환경과 다르기에 고객사의 환경에서 어플을 돌린거와 결과가 다를 수 있다. 하지만 컨테이너 기반으로 만들어서 제공을 하면 컨테이너를 돌리면 같은 결과가 나온다. 즉, 환경에 구애받지 않는다.
또한, 컨테이너의 용량이 100MB라고 하자. scale-out을 하고 싶으면 그저 컨테이너를 하나 더 설치하면 되는 것이다. 그러면 200MB가 소요되는 것이다. 즉, 확장 축소에 매우 유리하다.