리눅스 컨테이너를 기반으로 하여 특정한 서비스를 패키징하고 배포하는데 유용한 오픈소스 컨테이너화 플랫폼이다.
사실상 현재 컨테이너 기술의 표준이라고 볼 수 있으며 리눅스의 네임스페이스와 cgroup 같은 커널 기능을 사용하여 가상화하는 기술이다.
도커의 로고를 보면 핵심 개념이 매우 잘 설명되어있다. 도커를 이용해 여러 개의 컨테이너를 실행할 수 있고 이 컨테이너를 배포(운반)이 가능하다.
실제 컨테이너는 다양한 물건들을 넣어 운반하곤 한다. 이처럼 실제 서버에서도 컨테이너에 다양한 애플리케이션 및 실행 환경을 넣을 수 있다.
도커와 유사한 것이 바로 VM (가상머신)이다. 어떤 차이점이 있는지 알아보자.
먼저 VM을 보면 아래 다이어그램에 표시된 것처럼 호스트 OS 위에 게스트 OS 전체를 가상화한다. 따라서 이미지 용량이 매우 크고 가상머신 이미지를 지속 배포하기엔 어려움이 존재한다.
도커를 보면 VM과 달리 게스트 OS 설치가 필요 없다. 자원을 Host OS와 공유하여 용량이 적으며 컨테이너에는 필요한 Bins/Libs 만 존재한다. 따라서 배포에 수월하다.
도커 공식 홈페이지에서 가져온 아키텍처이다. 아래 다이어그램을 보면 도커는 클라이언트와 서버가 존재한다.
Docker 클라이언트로 사용자가 명령어(예를 들면 docker run)를 입력하면 도커 클라이언트는 명령어를 도커 데몬에게 Docker API로 전달한다.
Docker 데몬(dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리한다. 즉, 실제 컨테이너를 생성 및 실행하며 이미지를 관리하는 것이다.
Docker 레지스트리는 Docker 이미지를 저장하는 곳이다. Docker Hub에 퍼블릭 레지스트리를 생성할 수 있고 자신의 개인 레지스트리를 생성할 수도 있다.
이미지는 도커 컨테이너를 생성할 때 필요한 지시사항이 포함되어있는 읽기 전용 파일이다. (일종의 템플릿)
기존의 이미지를 커스터마이징 하여 새로운 이미지를 생성할 수도 있다.
직접 이미지를 만들고 싶다면 Docker file에 필요한 것들을 절차에 맞게 기입하고 실행하면 된다.
컨테이너는 실행할 준비가 끝난 이미지 파일의 객체이다. 기본적으로 컨테이너는 다른 컨테이너 및 해당 호스트 시스템과 비교적 잘 격리되어 있다.