[번역] Docker (1) Basic

rin·2020년 10월 25일
1

Document 번역

목록 보기
21/22
post-thumbnail

docker-Get started 공식 도큐먼트를 번역하고 정리합니다.

Overview

❗️ Docker
어플리케이션을 개발하고 제공하고 실행하기 위한 오픈 플랫폼.

Docker를 사용하면...

  • 어플리케이션과 인프라의 분리 → 소프트웨어를 빠르게 제공할 수 있다.
  • 어플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있다.
  • Docker's methodologies(방법론)을 사용 → 코드 작성과 프로덕션 실행 사이의 지연을 크게 줄일 수 있다.
    • Docker 방법론은 코드를 신속히 전달, 테스트, 배포하기 위해 제공된다.

Docker platform 🐋

  • Container : 약하게 격리된 환경에서 어플리케이션을 패키징하고 실행할 수 있게 한다.
  • 격리와 보안을 통해 주어진 하나의 호스트에서 여러 컨테이너를 동시에 실행 할 수 있다.
  • 호스트 머신의 커널 내에서 직접 실행되므로 VM을 사용하는 경우보다 주어진 하드웨어 조합에서 더 많은 컨테이너를 실행할 수 있다. (VM의 호스트 머신 내에서 Docker 컨테이너를 실행할 수도 있다! 😎)

Docker Engine ⚙️

  • client-server application
  • server : daemon process(dockerd 커맨드)라고 불리는 장기 실행 프로그램 타입
  • REST API : 프로그램이 deamon과 통신하고 수행할 작업을 지시하는데 사용하는 인터페이스
  • CLI (command line interface) : Docker deamon을 제어하고 상호작용하기 위해 Docker REST API를 사용하여 스크랩팅하거나 직접 CLI 명령을 수행한다. (docker 커맨드)

Docker Architecture

  • client-server architecture

Docker Daemon

  • dockerd
  • Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨과 같은 Docker 객체를 관리한다.
  • 다른 Daemon과 통신함으로써 Docker Service를 관리 할 수도 있다.

Docker Client

  • docker
  • Docker와 상호 작용하는 기본 방법. docker 명령은 Docker API를 사용한다.
  • docker run과 같은 명령을 사용하면 client가 이 명령을 dockerd(Docker daemon)에 전송하여 실행한다.
  • 둘 이상의 Daemon과 통신 할 수 있다.

❗️ Docker Client와 Docker Daemon 🤔

  • Docker Client는 Docker Container를 빌드, 실행, 배포하는 등의 무거운 작업을 수행하는 Docker Daemon과 통신한다.
  • Docker Client와 Docker Daemon은 동일한 시스템에서 실행될 수 있으며, Docker Client를 원격 Docker Daemon에 연결하는 것도 가능하다.
  • Docker Client와 Docker Daemon은 UNIX socket 혹은 Network Interface를 통해 REST API를 사용하여 통신한다.

Docker Registries

  • Docker Image를 저장한다.
  • Docker Hub : 누구나 사용할 수 있는 공용 레지스트리
  • Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성된다. (개인 레지스트릴 실행할 수도 있다.)
  • docker pull 또는 docker run 커맨드를 사용하면 구성된 레지스트리에서 필수 이미지를 가져온다.
  • docker push 커맨드를 사용하면 이미지가 구성된 레지스트리로 푸시된다.

Docker Object

Image : Docker Container를 만들기 위한 읽기 전용 템플릿
이미지는 몇 가지의 추가적인 사용자 정의와 함께 다른 이미지를 기반으로 한다.

타인이 말들어서 레지스트리에 게시한 이미지를 사용하거나, 직접 이미지를 만들 수 있다. 고유한 이미지를 빌드하기 위해서는 Dockerfile을 이용하여 이미지를 만들고 실행하는데 필요한 단계를 정의해야한다.

Dockerfile의 각 명령어는 이미지에 레이어를 만든다.

Dockerfile을 변경하고 이미지를 재빌드하면 변경된 레이어만 다시 빌드된다. 이는 다른 가상화 기술과 비교하였을 때 이미지를 매우 가볍고, 작고, 빠르게 만들 수 있음을 의미한다.

Container : 이미지의 실행 가능한 인스턴스
Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동, 삭제 할 수 있다. 컨테이너는 하나 이상의 네트워크에 연결하거나 스토리지 연결하는 것도 가능하며 현재 상태를 기반으로 새로운 이미지를 만들 수도 있다.

컨테이너는 이미지 및 사용자가 생성 혹은 시작할 때 제공하는 구성 옵션에 의해 정의된다.


👉 Example

$ docker run -i -t ubuntu /bin/bash
  1. 로컬에 ubuntu 이미지가 없으면 Docker는 docker pull ubuntu를 수동으로 실행 한 것처럼 구성된 레지스트리에서 이미지를 가져온다.
  2. Docker는 docker container create 명령을 수동으로 실행 한 것처럼 새 컨테이너를 생성한다.
  3. Docker는 읽기-쓰기 파일 시스템을 최종 레이어로 컨테이너에 할당한다. 이를 통해 실행중인 컨테이너는 로컬 파일 시스템에서 파일과 디렉토리를 만들거나 수정할 수 있다.
  4. 네트워킹 옵션을 지정하지 않았으므로 기본 네트워크에 컨테이너를 연결하는 네트워크 인터페이스를 만든다. 이 때 컨테이너의 IP 주소가 할당된다. 기본적으로 컨테이너는 호스트 머신의 네트워크 연결을 사용해 외부 네트워크에 연결할 수 있다.
  5. Docker는 컨테이너를 시작하고 /bin/bash를 실행한다. 컨테이너가 대화형으로 실행되고 터미너에 연결(-i, -t 플래그로 인해)되어 있으므로, 출력이 터미널에 기록되는 동안 키보드를 사용해 입력을 제공 할 수 있다.
  6. /bin/bash 종료하기 위해 exit 커맨드를 입력하면 컨테이너는 중지되지만 제거되지는 않는다. 따라서 이를 수동으로 재시작하거나 제거 할 수 있다.

Service : 여러 managerworkerswarm으로써 함께 작업하여 여러 Docker Daemon에 걸쳐 Container를 확장 할 수 있다.

swarm의 각 구성원은 Docker Daemon이며 모든 Docker Daemon은 Docker API를 사용하여 통신한다.

서비스를 사용하면 원하는 상태를 정의 할 수 있다. (이를테면, 주어진 시간에 사용 가능한 서비스 복제본 수와 같은 것들이 있다.)

기본적으로 서비스는 모든 worker node에서 로드 밸런싱된다.

consumer에게 Docker 서비스는 단일 애플리케이션으로 보인다.

Quick start

Docker concept

Docker 🐋

  • 개발자와 시스템 관리자가 컨테이너를 사용하여 어플리케이션을 빌드, 실행, 공유 할 수 있는 플랫폼
  • Containerization : 컨테이너를 사용하여 어플리케이션을 배포하는 것
  • 컨테이너는 어플리케이션을 쉽게 배포할 수 있도록 한다.

Container 📦

DockerVM
  • 실행중인 프로세스
  • 호스트 및 다른 컨테이너와 격리된 상태를 유지한다. (캡슐화)
    • 각 컨테이너는 개인의 파일 시스템과 상호작용하며, 이 파일 시스템은 Docker Image에 의해 제공된다.
  • 기본적으로 Linux에서 실행되며 호스트 시스템의 커널을 다른 컨테이너와 공유한다.
  • 별도의 프로세스를 실행함으로써 적은 메모리를 사용한다.

❗️ VM(Virtual Machine)
hypervisor를 통해 호스트 리소스에 가상으로 엑세스 가능한 "Guest" 운영 체제를 실행한다. 일반적으로 VM은 어플리케이션 로직에서 소비하는 것보다 많은 오버 헤드를 발행시킨다.

컨테이너의 이점

  • Flexible : 유연성
    매우 복잡한 어플리케이션도 컨테이너화 가능하다.
  • Lightweight : 경량
    컨테이너는 호스트 커널을 활용/공유하므로 가상머신에 비해 시스템 리소스 측면에서 훨씬 효율적이다.
    • 커널을 공유함으로써 io처리가 간편해진다. 👉 성능 효율 증대
  • Portable : 이식성
    로컬에서 빌드한 뒤 클라우드에 배포하여 어디서든 실행할 수 있다.
  • Loosely coupled : 낮은 결합도
    컨테이너는 그 자체로 완전하며 캡슐화되어 있으므로, 다른 컨테이너와 어떤 영향도 없이 이를 교체/업그레이드 가능하다.
  • Scalable : 확장성
    데이터 센터 전체에 컨테이너 복제본을 늘리고 자동으로 배포할 수 있다.
  • Secure : 보안
    컨테이너는 프로세스에 대해 자동으로 제약과 격리가 적용된다.

Image 🌌

  • 어플리케이션을 실행하는데 필요한 모든 것이 포함된다.
    • 코드, 바이너리, 런타임, 종속성 등 필요한 기타 파일 시스템 포함 ..

Build and run Image

development workflow

  1. Docker Image 생성 → 어플리케이션의 각 구성 요소에 대한 "개별 컨테이너"를 생성하고 테스트한다.
  2. 컨테이너와 지원 인프라를 완전한 어플리케이션으로 조립한다.
  3. 완전히 컨테이너화된 어플리케이션을 테스트/공유/배포한다.

Docker Image는 컨테이너화된 프로세스가 실행될 private filesystem을 캡처하므로 어플리케이션을 실행하는데 필요한 것만 포함하는 이미지를 만들어야한다.

Dockerfile

  1. Dockerfile을 빌드 : docker build --tag ${image_name}:${image_version} ${Dockerfile}
  2. 빌드 결과물로 Image 생성 : docker image ls 로 확인
  3. Image를 Container로 실행 : docker run --publish ${host_port}:${container_port} --detach --name ${container_name} ${image_name}:${image_version}
  • --publish : ${host_port}에서 들어오는 트래픽을 ${container_port}로 전달하도록 요청한다. 컨테이너에는 자체 전용 포트 집합이 있으므로 네트워크로부터 도달하기 위해선 이런 방식으로 트래픽을 전달해야한다. 그렇지 않으면 방화벽에 의해 모든 네트워크 트래픽이 컨테이너에 도달하지 못하도록 차단된다.
  • --detach : Docker에게 백그라운드에서 컨테이너를 실행하도록 요청한다.
  • --name : 컨테이너를 참조 할 수 있는 이름을 지정한다.
  1. 로컬 브라우저에서 어플리케이션에 접근할 수 있다.
  2. 컨테이너 삭제 : docker rm --force ${container_name}
  • --force : 실행중인 컨테이너 중지 (docker stop ${container_name})
profile
🌱 😈💻 🌱

0개의 댓글