Docker

완변학 IT 인프라 구축을 위한 Docker_Chapter02_컨테이너 기술과 Docker의 개요

강용민 2022. 12. 25. 01:37

Docker는 컨테이너 기술을 사용하여 애플리케이션의 실행 환경을 구출 및 운용하기 위한 플랫폼이다. 애플리케이션의 실행에 필요한 것을 하나로 모아, Docker 이미지를 관리함으로써 애플리케이션의 이식성을 높일 수 있다.

 

2.1 컨테이너 기술의 개요

컨테이너

컨테이너란 호스트 OS사에 논리적인 구획(컨테이너)을 만들고 애플리케이션의 필요 자원을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것이다. 컨테이너는 오버헤드가 적기 때문에 가볍고 고속으로 작동한다는 것이 특징이다.

컨테이너

컨테이너 기술을 사용하면 OS나 디렉토리, IP 주소 등과 같은 시스템 자원을 마치 각 애플리케이션이 점유하고 있는 것처럼 보이게 할 수 있다.

컨테이너는 애플리케이션의 실행에 필요한 모듈을 컨테이너로 모을 수 있기 때문에 여러 개의 컨테이너를 조합하여 하나의 애플리케이션을 구축하는 마이크로 서비스형 애플리케이션과 친화성이 높은 것이 특징이다.

 

2.2 Docker의 개요

Docker는 애플리케이션의 실행에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하기 위한 오픈소스 플랫폼이다. Docker는 내부에서 컨테이너 기술을 사용하고 있는 것이 특징이다.

 

프로그래머에게 Docker란??

웹 시스템 개발 시 애플리케이션을 제품 환경에서 가동시키기 위해서는 다음과 같은 요소가 필요하다.

  • 애플리케이션의 실행 모듈(프로그램 본체)
  • 미들웨어나 라이브러리군
  • OS/네트워크 등과 같은 인프라 환경 설정

Docker에서는 이러한 인프라 환경을 컨테이너로 관리한다. 애플리케이션의 실행에 필요한 모든 파일 및 디렉토리들을 컨테이너로서 모을 수 있다. 이 이미지는 Docker가 설치되어 있는 환경이라면 기본적으로 어디서든지 작동된다.즉, 이식성이 높다.

 

2.3 Docker의 기능

Docker에는 크게 다음 세 가지 기능이 있다.

  • Docker 이미지를 만드는 기능(Build)
    • Docker 이미지는 애플리케이션의 실행에 필요한 파일들이 저장된 디렉토리다.
    • Docker에서는 하나의 이미지에는 하나의 애플리케이션만 넣어 두고, 여러 개의 컨테이너를 조합하여 서비스를 구축한다는 방법을 권장한다.
    • 지속적 인티그레이션과 지속적 딜리버리의 관점에서 코드에 의한 인프라의 구성 관리를 생각하면 Dockerfile을 사용하여 관리하는 것이 바람직하다.
  • Docker 이미지를 공유하는 기능(Ship)
    • Docker 이미지는 Docker 레지스트리에서 공유할 수 있다.
  • Docker 컨테이너를 작동시키는 기능(Run)
    • Docker는 Linux 상에서 컨테이너 단위로 서버 기능을 작동시킨다. 즉, 이미 움직이고 있는 OS 상에서 프로세스를 실행시키는 것과 비슷하다.
    • Docker는 하나의 Linux 커널을 여러 개의 컨테이너에서 공유하고 있다. 컨테이너 안에서 작동하는 프로세스를 하나의 그룹으로 관리하고, 그룹마다 각각 파일 시스템이나 호스트명, 네트워크 등을 할당하고 있다. 그룹이 다르면 프로세스나 파일에 대한 액세스를 할 수 없다.

 

Docker 컴포넌트

Docker는 몇 개의 컴포넌트로 구성되어 있다. 핵심 기능이 되는 Docker Engine을 중심으로 컴포넌트를 조합하여 애플리케이션 실행 환경을 구축 한다.

  • Docker Engine
    • Docker 이미지를 생성하고 컨테이너를 기동시키기 위한 Docker의 핵심 기능이다. Docker 명령의 실행이나 Dockerfile에 의한 이미지도 생성한다.
  • Docker Registry
    • Docker 이미지를 공개 및 공유하기 위한 레지스트리 기능이다. Docker Hub등이 있다.
  • Docker Compose
    • 여러 개의 컨테이너 구성 정보를 코드로 정의하고, 명령을 실행함으로써 애플리케이션의 실행 환경을 구성하는 컨테이너들을 일원 관리하기 위한 툴이다.
  • Docker Machine
    • 클라우드 환경에 Docker의 실행 환경을 명령으로 자동 생성하기 위한 툴이다.
  • Docker Swarm
    • 여러 Docker 호스트를 클러스터화하기 위한 툴이다.Docker Swarm에서는 클러스터를 관리하거나 APi를 제공하는 역할은 Manager가, Docker 컨테이너를 실행하는 역할은 Node가 담당한다. Kubernetes도 이용할 수 있다.

 

2.4 Docker의 작동 구조

컨테이너를 구획화하는 장치(namespace)

Docker는 컨테이너라는 독립된 환경을 만들고, 그 컨테이너를 구획화하여 애플리케이션의 실행 환경을 만든다. 이 컨테이너를 구획하는 기술은 Linux 커널의 namespace라는 기능을 사용하고 있다.

Linux 커널의 namespace 기능은 Linux의 오브젝트에 이름을 붙임으로써 다음과 같은 6개의 독립된 환경을 구출할 수 있다.

  • PID namespace
    • PID란 Linux에서 각 프로세스에 할당된 고유한 ID를 말한다.
    • PID와 프로세스를 격리시킨다.
  • Network namespace
    • 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블 등과 같은  네트워크 리소스를 격리된 namespace마다 독립적으로 가질 수 있다.
    • 호스트 OS 상에서 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 번호의 포트를 사용할 수 있다.
  • UID namespace
    • UID(사용자 ID), GID(그룹 ID)를 namespac별로 독립적으로 가질 수 있다.
  • Mount namsspace
  • UTS namespace
    • namespace 별로 호스트명이나 도메인명을 독자적으로 가질 수 있다.
  • IPC namespace
    • 프로세스 간의 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있다.