도커는 Client-Server 아키텍처를 사용합니다. 도커 Client와 Daemon은 UNIX소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신합니다.
Docker Daemon(dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 볼륨과 같은 Docker 객체들을 관리합니다. Daemon은 서비스를 관리하기 위해 다른 Daemon과 통신할 수 있습니다.
사용자가 Docker CLI에 커맨드를 입력하면 Docker Client에서 Daemon(=Server)로 명령을 전송하게 됩니다.
Docker Registry는 도커 이미지가 저장되어있는 장소로써 Docker Hub나 Quay 또한 registry에 속합니다. registry는 public registry
와 private registry
가 존재합니다.
Images
이미지는 도커 컨테이너를 만들기(build)위한 지침과 같은 것으로 읽기전용 템플릿입니다.(컨테이너를 만들기 위한 설계도라고 생각할 수 있겠습니다.) 자신만의 이미지를 만들 수도 있고 다른 사용자가 만든 이미지를 pull받아 사용할 수 있습니다. 자신만의 이미지를 빌드하려면 Dockerfile에 명령문을 작성하면 됩니다.
Containers
컨테이너는 이미지의 실행가능한 인스턴스입니다. 컨테이너 생성시 해당 이미지에서 정의한 파일 시스템, 파일들 그리고 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성됩니다.(컨테이너에서의 변경은 이미지에 영향을 주지 않습니다.)
Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제를 할 수 있습니다.
Layer
이미지에서 Layer는 Dockerfile의 명령으로 생성됩니다.
기본 이미지에 Layer를 순서대로 적용하여 최종 이미지를 만들어 내는데 즉, 이미지는 여러개의 읽기전용(read only) Layer로 구성되어 있고 파일이 추가되거나 수정되면 새로운 Layer가 생성됩니다. 변경되지 않은 Layer는 로컬에 캐시되고 변경된 Layer만 업데이트 되기 때문에 이미지 빌드시 빠르게 할 수 있습니다. 컨테이너를 생성할 때도 Layer 방식을 사용하는데 기존 읽기전용 Layer 위에 읽기/쓰기(read-write) Layer를 추가하게 됩니다.
ubuntu 컨테이너를 docker run 명령으로 실행했을 때의 과정을 알아봅시다.
$ docker run -i -t ubuntu /bin/bash
1. ubuntu 이미지 가져오기
docker pull ubuntu
를 실행한 것과 동일하게 레지스트리에서 이미지를 가져옵니다. 2. 컨테이너 생성
docker container create
명령을 실행한 것과 동일하게 새 컨테이너를 생성합니다.3. 읽기, 쓰기 파일 시스템을 최종 계층으로 할당
4. IP주소 할당
5. 컨테이너 시작
참조
🔗 도커 문서 | 도커 개요
🔗 [Docker] 개념 정리 및 사용방법까지. | HY's Farm 블로그
🔗 개발자를 위한 도커입문 실습 PART1 - 도커 이미지와 컨테이너 | Reimaginer 블로그