[Docker 공식 문서 톺아보기] Docker Overview

Speedwell🍀·2022년 9월 2일
0

Docker


The Docker platform

  • 도커는 container라고 부르는 loosely isolated environment에서 어플리케이션을 package & run할 수 있는 ability 제공

  • isolation & security는 given host에서 많은 컨테이너들을 동시 run할 수 있도록 해줌

  • 컨테이너는 가볍고 어플리케이션을 실행하기 위한 모든 것을 갖고 있기 때문에, 현재 host에 설치된 것에 의존 X

  • 사용자는 컨테이너를 쉽게 공유 가능
    ➡ 같은 컨테이너면 같은 방식으로 동작


도커는 사용자가 컨테이너의 lifecycle을 관리할 수 있도록 tooling과 platform 제공:

  • 컨테이너를 사용해 app + its supporting components를 develop
  • 컨테이너는 app을 배포하고 테스트하기 위한 unit이 됨
  • 준비되면 app을 컨테이너 혹은 orchestrated service 형태로 production 환경에 배포
    ➡ 이는 production 환경이 local data center든, cloud provider든, 둘의 hybrid든 상관없이 동일하게 작동


Docker 어디에 사용?

1. 빠르고 일관된 어플리케이션 제공

  • 도커는 개발 lifecyle을 간소화(streamline)

    • 개발자가 어플리케이션과 서비스를 제공하는 local 컨테이너를 사용하여 표준화된 환경에서 작업할 수 있도록 함으로써
  • 컨테이너는 CI/CD(지속적통합/지속적전달) workflows에 적합


예제 시나리오)

  • 개발자는 로컬에서 코드 작성 -> 도커 컨테이너를 이용해 동료와 작업 공유
  • 개발자는 도커를 사용해 어플리케이션을 테스트 환경으로 push & 자동화/수동 테스트
  • 개발자가 버그를 발견하면 개발 환경에서 수정하고, 테스트 및 검증을 위해 테스트 환경에 재배포
  • 테스트가 완료되면 업데이트된 image를 production 환경에 push하는 것만큼 간단하게 고객에게 수정 사항 제공

2. 반응형 배포 & 확장

  • 도커의 컨테이너 기반 플랫폼은 이식성이 높은(highly portable) 워크로드 고려

  • 컨테이너는 개발자의 로컬 laptop, 데이터 센터의 물리적 or 가상 머신, 클라우드 제공자, 혼합 환경에서 실행 가능

  • 도커의 portability & 가벼움 ➡ workload를 쉽게 동적으로 관리할 수 있게 함

    • 거의 실시간으로 비지니스 요구 사항에 따라 어플리케이션과 서비스를 확장/축소 가능

3. 동일한 하드웨어에 더 많은 workloads 실행

  • 도커는 가볍고 빠름
    ➡ hypervisor 기반 가상 머신에 대한 viable & cost-effective한 대안 제공
    ➡ 비지니스 목표 달성을 위해 더 많은 컴퓨팅 용량을 사용 가능

  • 도커는 고밀도 환경 + 적은 리소스로 많은 일을 해야 하는 small/medium 배포에 적합



Docker Architecture

client-server 구조

  • 도커 client는 도커 daemon과 통신

    • 도커 daemon은 도커 컨테이너를 빌드, 실행, 배포하는 무거운 작업을 수행
  • 도커 client와 daemon은 동일한 시스템에서 실행될 수 있음
    or 도커 client를 원격 daemon에 연결 가능

  • 도커 client와 daemon은 UNIX 소켓 or 네트워크 인터페이스를 통해 REST API를 사용해 통신

  • 다른 도커 client는 컨테이너 세트로 구성된 어플리케이션으로 작업할 수 있는 Docker Compose


The Docker daemon

Docker daemon(dockerd)

  • Docker API 요청 수신
  • image, container, network, volume 같은 도커 object 관리
  • 도커 서비스들을 관리하기 위해 다른 daemons와 소통 가능

The Docker client

Docker client(docker)

  • 많은 도커 사용자들이 도커와 상호 작용하는 기본적인 방법
  • docker run 같은 명령어를 사용했을 때, client는 이 명령어를 carry out하는 dockerd으로 send
  • docker 명령어는 Docker API를 사용
  • 둘 이상의 daemon과 소통 가능

Docker Desktop

  • 컨테이너화된 어플리케이션 및 microservices를 build하고 공유할 수 있는 Mac, Windows, Linux 환경에서 쉽게 설치할 수 있는 어플리케이션
  • Docker daemon(dockerd), Docker client(docker), Docker Compose, Docker Content Trust, Kubernetes, Credential Helper가 포함

더 자세한 내용은 Docker Desktop


Docker regitries

  • Docker images 저장

  • Docker Hub는 누구나 사용 가능한 public registry

    • 도커는 default로 Docker Hub에서 image 찾도록 구성됨
  • 개인 registry를 실행할 수도 있음

  • docker pull or docker run 명령어를 사용하면 구성된 registry에서 요구된 image들을 pull

  • docker push 명령어를 사용하면 구성된 registry로 image를 push


Docker objects

도커를 사용하면 image, container, network, volume, plugin, 기타 객체를 생성 & 사용

Images

  • 도커 컨테이너를 생성하기 위한 지침이 담긴 read-only template

  • 종종 추가적인 customization과 함께 다른 이미지를 기반으로

    • 예) ubuntu 이미지를 기반으로 하는 이미지를 build할 수 있지만, Apache 웹 서버와 본인의 어플리케이션을 설치 가능 (본인의 앱을 실행시키기 위해 필요한 configuration details 설치 뿐만 아니라)
  • own image를 생성 or 다른 사람들이 만들고 registry에 published된 image를 사용

  • own image를 빌드하려면 Dockerfile 생성하기

    • Dockerfile에는 image를 생성하고 실행시키기 위해 필요한 단계들을 정의한 simple syntax
      • Dockerfile에 있는 각각의 지시는 image에서 layer 생성
      • Dockerfile 수정하고 image를 재빌드하면, 수정된 layer들만 재빌드되는 것!
        ➡ 이런 부분 때문에 image가 가볍고, 작고, 빨라질 수 있는 것! (다른 virtualization 기술들에 비해)

Containers

  • image의 실행 가능한 instance
  • Docker API 혹은 CLI를 사용해서 컨테이너 create/start/stop/move/delete
  • 컨테이너를 하나 이상의 네트워크와 연결 가능,

docker run 예시

$ docker run -i -t ubuntu /bin/bash

위의 명령어는

  • ubuntu 컨테이너를 실행시키고,
  • 사용자의 local command-line session에 interactively attach하고,
  • /bin/bash를 실행시킨다.

위 명령어를 실행시키면 생기는 일:
(default registry configuration을 사용한다고 가정)

  1. ubuntu 이미지를 local에서 가지고 있지 않다면, 도커는 configured registry에서 해당 이미지를 가져온다.
    (manual하게 docker pull ubuntu 한 것처럼)

  2. 도커는 새로운 컨테이너를 생성한다.
    (manual하게 docker container create한 한 것처럼)

  3. 도커는 컨테이너의 final layer로 read-write filesystem을 컨테이너에 할당
    ➡ 실행중인 컨테이너가 local filesystem에 있는 파일과 디렉터리를 생성/수정할 수 있도록 함

  4. 도커는 default 네트워크에 컨테이너를 연결할 수 있게 네트워크 인터페이스 생성 (네트워킹 옵션을 specify하지 않았을 경우)

    • 컨테이너에 IP 주소를 assign 하는 것 포함
    • 기본적으로 컨테이너는 호스트 머신의 네트워크 연결을 이용해 외부 네트워크와 연결 가능
  5. 도커가 컨테이너를 시작시키고 /bin/bash를 실행시킴

    • 컨테이너가 인터렉티브하게 실행되고 있고, 사용자의 터미널에 attach되어 있기 때문에 (-i-t flag 사용했기 때문), output이 사용자의 터미널에 log되는 동안 사용자는 키보드를 통해 input 줄 수 있다.
  6. bin/bash 종료하기 위해 exit 입력할 때, 컨테이너가 중단되지만 제거되진 않음
    ➡ 사용자가 재시작하거나 제거 가능



<기반 기술>

  • 도커는 Go로 작성되었고, 리눅스 커널의
  • 도커는 컨테이너 namespaces

참고)
Docker Docs: Docker overview

Docker Docs: Get-Started

0개의 댓글