하이퍼바이저 가상화는 (하나의 물리적 서버 위에 존재하는 Host OS, 그 위에 존재하는 독립적인 다수의 OS들)로 이루어져 있다.
이렇듯 하나의 물리적 서버 위에 Host OS가 존재하고, 그 위에 다수의 독립적인 OS가 가상(virtually)으로 돌아갈 수 있도록 하는 것이 하이퍼바이저 가상화 기술이다.
각각의 OS는 서로에 대해 알지 못하며 Host OS조차 알지 못한다. 하나의 물리적 서버에서 실행되고는 있지만 완전히 독립적인 OS로 운영되는 것아다.
따라서 하나의 물리적 서버의 리소스를 각각의 OS에 할당하여 효율적으로 사용할 수 있게 된다.
OS를 가상화하는 방식은 간단하지만 기술적으로 무겁다는 단점이 있다. 이러한 성능 이슈를 개선하기 위해 프로세스를 격리된 환경에서 실행하는 기술, 즉 컨테이너 가상화 기술
이 등장한다.
컨테이너 가상화 기술을 통해 하나의 서버에 다수의 컨테이너를 실행하면 컨테이너끼리 서로 영향을 끼치지 않고 독립적으로 실행된다.
실행중인 컨테이너에 접속하여 명령어 입력, 패키지 설치 등 다양한 작업을 할 수 있다. 또한 CPU 혹은 메모리를 제한할 수 있으며 호스트 디렉토리에 마운트하여 내부 디렉토리로 사용할 수도 있다.
새로운 컨테이너를 만드는 시간은 OS를 가상화하는 방식과는 비교할 수 없이 빠르다. 그리고 하나의 프로세스(컨테이너)를 실행하는데 필요한 모든 파일을 이미지로 만들어 놓고 제공하기 때문에, 컨테이너 가상화 방식을 사용하면 개발 단계부터 테스트 및 프로덕션에 이르기까지 일관된 환경을 유지할 수 있다.
Docker는 컨테이너 가상화 기술을 기반으로 하는 오픈소스 플랫폼이다. Docker는 최초의 컨테이너 기술인 LXC(Linux Container)에 여러 가지 중요한 기술을 가미해 강력한 효율성과 유연성을 제공한다.
Docker는 컨테이너 가상화 환경 위에 애플리케이션 배포 엔진을 더함으로써 사용자의 코드를 어디서든 빠르고 가볍게 실행시킬 수 있다. 게다가 요즘 널리 사용되는 MSA(Micro Service Architecture), CI/CD와 아주 잘 어울리기 때문에 각광받고 있다.
실제로 Docker는 한 컨테이너당 하나의 애플리케이션이나 프로세스를 실행하는 것을 권하고 있으니 이는 MSA의 철학과 일맥상통한다고 볼 수 있다.
Docker의 엔진은 클라이언트가 명령어를 서버에 전달하고 서버가 전달받은 명령어를 실행하는 Client-Server Architecture 를 사용하고 있다.
Docker 오브젝트를 관리하는 주체가 서버이며 오브젝트를 조작하기 위해 클라이언트가 명령어를 서버에 전달하면 서버의 dockerd(Docker daemon)라는 프로세스가 동작하여 해당 명령어 실행한다.
1. 클라이언트(Client)
클라이언트는 사용자가 Docker 오브젝트를 관리하기 위해 사용하는 가장 근본적인 수단이며 CLI(Command-line interface)를 제공한다.
만약 사용자가 docker run 과 같은 명령어를 입력하면 해당 명령어를 수행하는 dockerd 프로세스로 전달한다.
Docker 명령어는 Docker API를 이용하며 클라이언트가 한 개 이상의 dockerd 와 상호작용할 수 있도록 한다.
2. 호스트(Host)
호스트는 Docker 오브젝트를 관리하는 주체이면서 마치 운동장과 같다.
dockerd라는 프로세스가 클라이언트로부터 전달받은 명령어를 실행하여 다양한 Docker 오브젝트를 관리하게 된다.
이때 이미지, 컨테이너, 볼륨과 같은 Docker 오브젝트는 운동장에서 놀고 있는 학생들과 같다.
3. 저장소(Registry) - DockerHub
Docker는 공식적으로 DockerHub라는 저장소를 지원한다.
마치 GitHub에 소스 코드를 저장하여 관리하는 것과 같이 이미지를 저장하여 관리할 수 있다.
또한 GitHub과 마찬가지로 Public, Private이 존재합니다.
4. 이미지(Image)
이미지는 컨테이너를 생성하기 위해 필요한 템플릿이다.
Docker에서 공식적으로 제공해주는 이미지가 있으며 사용자는 해당 이미지 혹은 다른 개발자들이 만들어 놓은 이미지를 사용하여 본인만의 커스텀 이미지를 만들 수 있다.
5. 컨테이너(Container)
컨테이너는 이미지의 실행 가능한 인스턴스이다.
즉, 이미지를 실행시켜 컨테이너라는 가상화 공간을 만들게 된다. Docker만 올바르게 설치되었다면 어디서든지 저장소로부터 이미지를 가져와 컨테이너를 실행시킬 수 있다.
6. 그 외