
밀키트와 같이 하나의 구성, 일관성을 가져 누구나가 똑같은 결과를 만들어낼 수 있도록 하기 위해 사용합니다.
Go언어로 작성된 리눅스 컨테이너 기반으로하는 오픈소스 가상화 플랫폼이다.
현재 Docker 0.9버전 부터는 직접 개발한 libcontainer 컨테이너를 사용하고 있다.
격리 구동을 위한 가상화 기술 = 격리된 공간에서 프로세스가 동작하는 기술
가상화(Virtualization) : A하드웨어를 격리된 다수의 B, C, D 하드웨어 영역으로 나누는것입니다.
이제는 향상된 컴퓨터의 성능을 더욱 효율적으로 사용하기 위해 가상화 기술이 많이 등장하였습니다.
서버 관리자 입장에서 CPU사용률이 10%대 밖에 되지 않는 활용도가 낮은 서버들의 리소스 낭비일 수밖에 없습니다. 그렇다고 모든 서비스를 한 서버안에 올린다면 안정성에 문제가 생길수도 있습니다. 그래서 안정성을 높이며 리소스도 최대한 활용할 수 있는 방법으로 나타난게 서버 가상화입니다. 모두가 아는 대표적인 가상화 플랫폼으로는 VM이 있습니다. VM은 누구나 아는 OS가상화지요. 그렇다면 컨테이너란 무엇일까요?
컨테이너(container) : 컨테이너는 가상화 기술 중 하나로 대표적으로 LXC(Linux Container)가 있습니다. 기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어집니다.

한 서버의 여러 OS를 가상화 하여 사용하는 것과 컨테이너 방식으로 프로세스를 격리시켜 동작하는 방법은 어떠한 차이점이 있을까요?
다양한 환경이 무엇이냐에 따라 가상화 방법은 2개로 나뉜다.
: 다양한 환경의 정의 = Guest OS + Bins/Libs + App B
: OS 레벨 독립적 어플리케이션 구동 환경
: 다양한 환경의 정의 = Bins/Libs + App B
: OS 레벨 Bins/Libs 레벨 독립적 어플리케이션 구동 환경 ← VM 보다 경량화 (OS 레벨 X → Bins/Libs 레벨)

기존에 우리에게 익숙한 VM같은 경우엔 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진 그리고 그 위에 Guest OS를 올려 사용합니다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리된다고 봐도 무방합니다. 반면에 컨테이너 기반 가상화는 Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 됩니다. OS 가상화를 보면 Host OS와 완전히 분리되는 장점은 있지만 OS위에 OS를 올리기 때문에 무겁고 느릴수 밖에 없습니다. 하지만 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진위에서 바로 동작하며 Host의 커널을 공유합니다. 커널을 공유하게 되면 io처리가 쉽게 되어 성능의 효율을 높일 수 있습니다.
컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것입니다.
Docker Image(이미지) : Docker 격리 정의 단위
Dockerfile : Docker 격리 정의 서술(Instruction)
Docker Container(컨테이너) : Docker 격리 동작 단위 = 격리된 공간에서 실행중인 Docker 이미지
Docker Compose : Dockerfile로 정의한 개별 Docker 이미지 집합 = Multiple Docker 컨테이너 구동
Docker Engine(=API(명령어 라이브러리) + CLI(명령어를 쓸수 있게 함) + Docker
Daemon(도커 구동 엔진)) : Docker 이미지를 구동 및 관리하기위한 엔진
Docker Engine 위에 Image를 올리고 Run 구동 시 독립적인 Docker Container 실행
Host 호스트 = Node 노드 = Instance 인스턴스 = Server 서버 : Docker Engine 구동하는 주체 컴퓨터