
리눅스 컨테이너에 어플리케이션을 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트이다.
도커 엔진은 컨테이너를 생성하고 관리하는 주체이다. 컨테이너를 제어할 수 있고, 다양한 기능을 제공한다. 도커 엔진을 효율적으로 사용하기 위해 도커 속 여러 프로젝트들이 있는 것이다.
호스트인 단일 컴퓨가 자체의 운영체제, 프로세서 코어, 메모리, 스토리지 및 네트워킹을 사용해서 여러 가상 머신을 실행할 수 있다. 이를 통해 IT 비용을 절감할 수 있다.

이미지 출처: OCI
하이퍼바이저를 사용해서 여러 운영체제를 하나의 호스트에서 생성해서 사용한다.
여기서 운영체제는 가상머신이라는 단위로 구분되고, 우분투 같은 운영체제가 설치돼서 사용되기 때문에 이를 게스트 운영체제 라고 불린다. 가상머신은 다른 가상머신들과는 독립된 공간과 시스템 자원을 할당받아 사용한다.
*하이퍼바이저 : 가상머신을 호스트 컴퓨터에서 실행하고 프로세서, 메모리 및 스토리지를 배포할 수 있도록 해주는 소프트웨어 계층이다. 가상머신 모니터 라고 하며, 여러 가상머신이 실행 및 모니터링되는 가상 플랫폼을 만든다.
즉, 배포하는 시간도 가상머신 보다 짧고, 성능 손실도 거의 없다!

이미지 출처: Docker 홈페이지
Docker daemon (dockerd) : 도커 엔진Docker API에 따라 이미지, 컨테이너, 네트워크 등의 도커 오브젝트들을 관리한다. 다른 daemon과 통신할 수도 있다.
Client도커 사용자들이 도커를 사용하는 방법이다. 사용자가 입력한 명령어를 도커 엔진에 전달하고, 수행하게 된다.
Docker Host도커가 띄워져있는 서버이다. 컨테이너와 이미지를 관리한다.
Docker registry외부 이미지 저장소이다. docker pull 명령어를 통해 필요한 이미지를 가져올 수 있고, 가져온 이미지를 docker run하면 컨테이너가 된다. docker push 를 통해 이미지를 푸시할 수 있다.
Docker Image먼저, 도커 이미지는 Docker File을 사용하여 docker build 명령어를 실행하면 만들어진다. 그 후에 해당 이미지와 Docker run 명령어를 통해 Docker Container가 만들어진다.
도커 이미지는 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용되며, 여러 계층으로 binary 파일로 존재한다.
[저장소 이름]/[이미지 이름]:[태그]
Docker Container이미지의 실행 가능한 인스턴스이다. Docker API 또는 CLI를 사용해서 컨테이너를 생성/시작/중지/이동/삭제를 한다. 컨테이너를 네트워크나 스토리지를 연결하거나 새로운 이미지를 만들 수도 있다.
컨테이너는 이미지에 의해 정의되며, 다른 컨테이너 및 호스트 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있다. 따라서 특정 컨테이너에서 수정사항이 생겨도 다른 컨테이너와 호스트는 변경 사항이 없다.
컨테이너는 이미지를 읽기 전용으로 사용하되, 이미지에서 변경된 사항만 컨테이너 계층에 저장하기 때문에 컨테이너에서 무엇을 해도 이미지는 영향을 받지 않는다.
https://seosh817.tistory.com/345
https://docs.docker.com/get-started/overview/