[Docker 기본2] 뼈대

클라이언트-서버 모델

Docker는 서비스의 요청자(Docker Client) 와 제공자(Docker Server) 그룹이 분리되어 작동하는 클라이언트-서버 모델로 이루어져 있으며, Docker 클라이언트는 REST API 를 사용하여 Docker 서버를 제어합니다.

  • 도커 클라이언트:docker CLI
  • 도커 서버:docker daemon
  • 도커 REST API

그리고 Docker Server( docker daemon)는 Docker 클라이언트에서 전송 요청에 따라 다음의 Docker 개체를 생성하고 관리합니다.

  • 영상
  • 컨테이너
  • 회로망
  • 데이터 볼륨

출처: Docker Docs — Docker 엔진

좀 더 자세히 알아보죠

Docker 클라이언트는 Docker Daemon과 UNIX 소켓 또는 REST API를 사용하여 통신하며, Docker Daemon이 컨테이너를 구축, 실행 및 배포할 수 있도록 합니다. Docker 클라이언트와 데몬은 동일한 시스템에서 실행될 수도 있고, Docker 클라이언트를 원격으로 Docker 데몬에 연결하여 사용할 수도 있습니다.

Docker 출처: Docker Docs — Docker 아키텍처

도커 데몬

Docker Daemon( dockerd)은 클라이언트에서 API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 동일한 Docker 개체를 관리합니다. Daemon은 Docker를 관리하기 위해 다른 Daemon 서비스와 통신할 수 있습니다.

도커 클라이언트

Docker Client( docker)는 사용자가 Docker Daemon과 통신하는 주요 방법입니다. docker run동일한 객체를 사용하면 Docker 클라이언트는 객체를 Docker Daemon으로 전송하여 객체를 수행하게 됩니다. dockerDocker API를 사용하며 Docker 클라이언트는 Docker Daemon과 통신을 모두 사용할 수 있습니다.

도커 레지스트리

Docker Registry는 Docker 이미지를 생성합니다. Docker Hub는 사용할 수 없는 Public Registry이므로, Docker는 기본적으로 Docker Hub에서 이미지를 찾아 컨테이너를 구성하도록 할 수 있습니다. 예를 들어, docker pullImage를 사용하여 Registry에서 Local로 다운로드할 수 있는지 확인하고, docker pushLocal의 Image를 Registry에 디버깅할 수 있습니다. Docker Registry는 Docker의 Enterprise Edition에서 제공되는 Docker Trusted Registry가 포함된 Docker Datacenter를 사용할 수 있도록 구성할 수도 있습니다.

도커 객체

Docker Object는 Docker Daemon에 의해 이미지/컨테이너/네트워크/볼륨 등을 생성 및 관리하는 것을 허용합니다.

영상

이미지는 Docker 컨테이너를 생성하기 쉬운 템플릿입니다. 이미지는 다른 이미지 기반 위에 사용자 정의를 추가하여 생성할 수 있으므로 이미지는 Docker 레지스트리에 푸시한 후 사용할 수 있습니다. 이미지는 Dockerfile에 이미지를 작성하는 데 필요한 프로젝트를 정의하여 생성합니다. Dockerfile에 정의된 각 차이점은 Image의 Layer를 생성하며, 이러한 Layer들이 모여 이미지를 구성합니다. Dockerfile을 변경하고 이미지를 다시 구성하면 변경된 부분만 새로운 레이어로 생성됩니다. 이러한 이미지의 레이어 구조는 Docker가 타당한 방식으로 인해, 매우 빠르게 대처할 수 있는 요인이 됩니다.

컨테이너

컨테이너는 Docker API를 사용하여 생성, 시작, 종료, 이동 또는 삭제할 수 있는 이미지를 실행할 수 있는 인스턴스를 실행합니다. 컨테이너는 네트워크에 연결되어 있거나, 저장 장치로 있을 수 있으며, 현재 상태를 바탕으로 새로운 이미지를 생성할 수 있습니다. 기본적으로 컨테이너는 호스트 또는 다른 컨테이너로부터 안전하게 검증될 수 있으며, 네트워크/스토리지와 다른 하위 시스템에 대한 접근을 직접 제어할 수 있습니다. 컨테이너는 생성 시작될 때, 구성 옵션 및 Image로부터 정의됩니다. 컨테이너가 제거될 수 있으며 영구적으로 제외되지 않는 변경 사항은 모든 해당 컨테이너와 동일하게 간주됩니다.

서비스

서비스를 사용하면, 여러 Docker Daemon 단계 내에서 컨테이너를 확장(Scaling) 줄 수 있습니다. 서비스는 ‘특정 시간 동안 사용 가능한 서비스의 복제’와 동일한 상태 정보를 정의하여 직접 사용할 수 있습니다. 기본적으로 서비스는 Docker 데몬들에 의해 로드 밸런싱을 제공하고 있기 때문에, 사용자 섹션에서는 단일 애플리케이션으로 볼 수 있습니다.

컨테이너를 알려주는 것을 보고 있어요

지금까지, Docker가 어떻게 생각했는지 그 구성 요소들을 확인했습니다. 그러면 간단하게 Public Image로 연결 컨테이너를 사용하여 각각의 요소를 다시 한번 사용할 수 있습니다.

  1. 먼저, docker search [OPTIONS] TERM로 Docker Store와 Hub에서 이미지를 찾습니다.

Docker Hub 에는 커뮤니티 버전의 이미지가 포함되어 있습니다. 새로운 본질적인 이미지를 Docker Hub에 Push할 수는 있지만, 해당 이미지의 품질이나 호환성은 Docker가 있지 않습니다. 대신, Docker Store 에는 검증된 제작자가 인증된 이미지가 포함되어 있습니다. 이러한 이미지는 공급업체에 의해 직접 게시되고 유지/관리됩니다. 또한 Docker Certified 로고는 이미지에 대한 품질, 원본 및 지원에 대한 보증을 제공합니다. 공식 이미지는 OFFCIAL로, 그 외의 커뮤니티 이미지는 AUTOMATED에 드릴 것입니다.

** 컨테이너로 구성할 이미지를 Docker Store 및 Hub에서 docker pull [OPTIONS] NAME[:TAG|@DIGEST]사용하여 Pull.

Image를 Pull로 보낼 때, Image에 대한 버전을 태그로 보내서 보낼 수 있고, 개봉되지 않은 경우 latest버전으로 Pull이 처리됩니다. 각 이미지별 상세 정보는 Docker Store 에서 이미지를 검색하여 상세 페이지에서 받으실 수 있습니다.

2. docker images로 로컬 저장소에 풀된 이미지 목록을 확인합니다.

Local Repository에 Pull된 이미지를 docker run [OPTIONS] IMAGE[COMMAND] [ARG...]사용하여 컨테이너를 생성하여 실행합니다. 개별 docker command의 옵션 및 상세 설명은 docker run --help함께 사용하여 확인할 수 있습니다.

3. docker ps실행 중인 Ubuntu 컨테이너를 찾을 수 있습니다.

당겨서 실행하세요. 끝?

Docker에서 인증받은 공식 Ubuntu Image로 컨테이너를 로그인했음을 알려드립니다. 작업을 진행한 과정을 요약하면, Docker 클라이언트는 Docker Daemon에게 Ubuntu 이미지를 검색한 후, Docker Hub에서 이미지를 로컬 레지스트리로 간주했습니다. 그리고 docker run을 Docker Daemon에게 다시 요청하여, 내려받은 Image에서 컨테이너를 생성하고 연결합니다.

그렇다면, Pull과 Run이 끝이 다른가요? 이전에 우리는 Docker Hub에 배포된 Image로 “어디서든 Run” 할 수 있다는 것을 확인했습니다. 다음 단계로 직접, Image를 Build하고, Image에서 컨테이너를 Run해 특별한 품목을 선택하세요.

하지만, 그랬어요! 빌드된 이미지와 컨테이너가 어떻게 처리되는지 알려드리겠습니다.