Docker 란?

  • 애플리케이션을 패키징하고 배포하기 쉽게 도와주는 컨테이너 기반 가상화 플랫폼
    -> 컨테이너라는 작은 소프트웨어 유닛 안에 애플리케이션과 필요한 시스템 도구, 환경 설정 등을 하나로 묶어서 다른 서버나 환경에 쉽게 배포하고 구동할 수 있게 해준다.

  • 기술이 발전함에 따라 애플리케이션을 구동하는 데 필요한 요소 증가
    -> 예를 들어, Node.js를 사용한다면 외부 라이브러리와 환경 설정, 환경 변수 등을 모두 설정해야 한다. 이를 모든 서버나 개발자의 개인 컴퓨터에 일일이 설치하고 설정하는 것은 번거롭고 오류 발생 가능성이 높다. 도커는 이러한 문제를 해결하기 위해 탄생하였다.

  • 도커 컨테이너 안에는 애플리케이션 뿐만 아니라 필요한 모든 리소스와 환경이 포함
    -> 따라서 도커 컨테이너를 사용하면 애플리케이션을 구동하는 데 필요한 모든 것을 어떤 환경에서든 일관되게 구동할 수 있다. 이를 통해 설정과 준비 과정을 간편하게 해결해준다.

VM(Virtual Machine) VS Docker Container

VM(Virtual Machine)

하드웨어 인프라스트럭처 위에 VMware나 VirtualBox와 같은 하이퍼바이저 소프트웨어를 사용하여 각각의 가상 머신을 생성할 수 있다. 이는 각각의 가상 머신이 독립적인 환경에서 실행될 수 있게 한다.

이전에는 동일한 애플리케이션을 여러 운영 체제 환경에서 실행하기 위해 가상 머신을 사용해야 했다. 가상 머신은 개별 운영 체제를 포함하기 때문에 Mac OS 위에서 가상 머신을 사용하면 Windows나 Linux를 동시에 실행할 수 있었다.

그러나 애플리케이션을 실행하기 위해 가상 머신을 사용하면 운영 체제를 포함하기 때문에 매우 무겁고, 시작하는 데 오랜 시간이 걸리며 컴퓨터의 리소스를 많이 소모한다. 이러한 가상 머신에서 더 경량화된 개념이 컨테이너이다.

Docker Container

하드웨어에 설치된 호스트 운영 체제에서 컨테이너 엔진이라는 소프트웨어를 설치하면, 개별적인 컨테이너를 생성하여 각각의 애플리케이션을 고립된 환경에서 실행할 수 있다.

가상 머신과는 달리 컨테이너는 호스트 운영 체제를 공유하며, 운영 체제를 가상화하지 않고 컨테이너 엔진을 통해 필요한 리소스를 처리한다. 도커와 같은 컨테이너 엔진은 이러한 기능을 제공하는데, 현재 가장 널리 사용되고 있다.

컨테이너는 운영 체제를 가상화하지 않고 애플리케이션을 실행하는 데 필요한 모든 것을 포함한다. 따라서 컨테이너는 가상 머신보다 빠르고 가벼우며, 시작 시간이 빠르고 시스템 리소스를 적게 사용한다. 이를 통해 컨테이너는 빠르고 효율적인 애플리케이션 실행 환경을 제공한다.


Docker의 구성요소

도커는 컨테이너를 만들고 배포하고 구동하며, 이 프로세스를 이해하기 위해서는 세 가지 구성 요소를 알아야 한다.

도커파일(Dockerfile)

  • 컨테이너를 만들기 위한 설명서
  • 어플리케이션을 실행하는 데 필요한 모든 설정을 정의
  • 필요한 파일, 프레임워크, 라이브러리, 환경 변수, 실행 스크립트 등을 명시

이미지(Image)

  • 도커파일을 이용하여 생성
  • 코드, 런타임 환경, 시스템 도구, 시스템 라이브러리 등 실행에 필요한 모든 구성 요소를 포함
  • 실행되고 있는 어플리케이션의 상태를 스냅샷해서 만들어둠
  • 변경할 수 없는 불변의 상태를 가짐

컨테이너(Container)

  • 애플리케이션의 이미지를 고립된 환경(개별적인 파일 시스템 안)에서 실행하는 것
  • 컨테이너는 스냅샷된 이미지를 기반으로 생성되며, 각각 독립된 파일 시스템을 가짐
  • 애플리케이션을 스냅샷한 이미지를 이용해 애플리케이션이 구동

컨테이너는 클래스와 인스턴스의 개념과 유사하다. 이미지는 클래스로 볼 수 있으며, 각 컨테이너는 해당 이미지를 기반으로 생성된 인스턴스이다. 따라서 각 컨테이너는 독립적으로 실행되며 파일을 생성, 수정할 수 있지만, 이러한 변경 사항은 이미지에 영향을 주지 않는다. 이러한 프로세스를 통해 도커를 사용하여 애플리케이션을 쉽게 패키징하고 배포할 수 있으며, 이를 통해 개발 및 운영 환경의 일관성과 효율성을 유지할 수 있다.

볼륨(Volume)
Docker 컨테이너에 쓰여진 데이터는 기본적으로 컨테이너가 삭제될 때 함께 사라진다. Docker에서 돌아가는 많은 애플리케이션은 컨테이너의 생명 주기와 관계없이 데이터를 영속적으로 저장해야하고, 여러 개의 Docker 컨테이너가 하나의 저장 공간을 공유해서 데이터를 읽거나 써야하는 경우가 빈번하다.
이렇게 Docker 컨테이너의 생명 주기와 관계없이 데이터를 영속적으로 저장할 수 있도록 별개의 공간인 Volume이 필요하다.

볼륨의 종류에는 크게 세 가지가 있다.

  • Bind Mount
    • 호스트 시스템의 선언된 디렉토리가 컨테이너에 마운트된다.
    • 디렉토리 경로를 본인의 환경에 맞게 사용하는 장점이 있으나, 디렉토리 경로가 분산되어 관리가 어려워질 수도 있다.
    • -v [호스트의 디렉토리 경로]:[컨테이너에서 마운트되는 경로][:rw|ro]
  • Volume
    • Docker에서 관리하는 호스트 파일 시스템의 일부에 저장된다.
    • Docker에서 데이터를 유지하는 가장 좋은 방법이다.
    • -v [볼륨 이름]:[컨테이너에서 마운트되는 경로][:rw|ro]
  • tmpfs Mount
    • 호스트 시스템의 메모리에 저장된다.
    • 보안 혹은 비영구 상태 데이터를 작성해야하는 이유로 데이터를 유지하지 않으려는 경우에 많이 사용된다.
    • --tmpfs [컨테이너에서 마운트되는 경로]

컨테이너 배포하는 과정(이미지 공유 과정)

컨테이너를 배포하는 과정은 아래와 같다.

  1. 로컬 머신에서 이미지 생성
    로컬 환경에서 Docker와 같은 컨테이너 엔진을 설치
    -> 필요한 애플리케이션을 실행하는 데 필요한 Dockerfile을 작성
    -> Dockerfile을 사용하여 이미지를 빌드
  2. 컨테이너 레지스트리에 이미지 푸시
    빌드된 이미지를 컨테이너 레지스트리(예: Docker Hub)에 푸시
    -> 이미지를 공유할 목적에 따라 퍼블릭 또는 프라이빗 레지스트리를 선택
    -> 프라이빗 레지스트리를 사용할 경우, 접근 권한 및 보안 설정을 적절히 구성
  3. 서버나 다른 개발자의 PC에서 이미지 다운로드 및 실행
    해당 서버나 개발자의 PC에도 Docker 또는 다른 호환되는 컨테이너 엔진을 설치
    -> 컨테이너 레지스트리에서 필요한 이미지를 pull
    -> pull한 이미지를 사용하여 컨테이너를 실행

많은 경우, 로컬에서 이미지를 빌드하고 푸시한 후 서버에서 해당 이미지를 pull하여 실행하는 방식으로 애플리케이션을 배포한다. 이러한 프로세스를 통해 개발 환경과 운영 환경 간의 일관성을 유지하고 애플리케이션을 효율적으로 관리할 수 있다.

다른 방법
1. 로컬 머신에서 Dockerfile작성
2. 서버나 다른 개발자의 PC에서 이미지 생성
3. 생성된 이미지를 사용하여 컨테이너를 실행

컨테이너 오케스트레이션(Container Orchestration)

컨테이너 오케스트레이션은 여러 대의 컴퓨터에서 동시에 실행되는 컨테이너들을 자동으로 관리하는 기술이다.
개발자가 만든 애플리케이션을 컨테이너로 포장하고, 이를 여러 대의 컴퓨터에 배포할 때, 오케스트레이션 시스템은 컨테이너의 배포와 관리를 자동화한다.
예를 들어, 컴퓨터가 다운되면 오케스트레이션 시스템은 해당 컨테이너를 다른 컴퓨터로 옮겨 서비스 중단을 방지한다. 이를 통해 애플리케이션의 확장성과 안정성을 높이고, 개발자는 더 많은 시간을 애플리케이션 개발에 집중할 수 있다.

컨테이너 오케스트레이션 툴에는 대표적으로 세 가지가 있다.

Docker Swarm

  • 도커 컨테이너 플랫폼에 통합된 컨테이너 오케스트레이션 툴

  • 최초의 도커 스웜은 도커와 별개로 개발되었으나 도커 1.12 버전부터 도커 스웜 모드라는 이름으로 합쳐짐

  • 장점

    • 도커 명령어와 도커 컴포즈를 포함한 도커의 모든 기능이 내장
    • 도커 이외의 별도의 툴 설치가 필요하지 않음
    • 타 오케스트레이션 툴에 비해 복잡하지 않고 다루기 쉬움
  • 단점

    • 타 오케스트레이션 툴에 비해 기능이 단순하여 세부적인 설정이 어려움
    • 초대형 노드 클러스터링에는 무리가 있음

Kubernetes

  • 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고 확장 가능한 오픈소스 플랫폼

  • 장점

    • 현재 가장 인지도가 높고 기능이 많은 오케스트레이션 툴
    • 내장된 기능이 많아 타사 애드온이 불필요
  • 단점

    • 쿠버네티스의 구성과 개념에 대한 이해가 필요
    • 학습해야할 부분이 많고, 소규모 프로젝트에서 구축하기 쉽지않음

Apache Mesos

  • Twitter, Apple, Uber, Netflix 등 대형 서비스를 운영하고 있는 기업에서 다수 채택

  • 마이크로 서비스와 빅데이터, 실시간 분석, 엘라스틱 스케일링 기능 등 제공

  • 장점

    • 대형 서비스를 운영중인 회사에서 많이 채택되었고, 안정성이 검증됨
    • 수만대의 물리적 시스템으로 확장 가능하게 설계
    • Zookeeper, Hadoop, Spark와 같은 응용프로그램을 연동하여 노드 클러스터링과 자원 최적화 가능
  • 단점

    • 너무 다양한 응용 프로그램의 연동으로 인하여 복잡해질 수 있음
    • 설치 및 관리가 어렵고 컨테이너를 활용하기 위해 Marathon 프레임워크를 추가로 설치해야함

Docker Swarm: 중소형 프로젝트, 관리할 노드가 적고 많은 기능을 필요로하지 않을 경우
Kubernetes: 대형 프로젝트, 세밀하고 다양한 설정 기능이 필요한 경우
Apache Mesos: 대형 프로젝트, 검증된 오케스트레이션 툴이 필요한 경우


[참고자료]

도커의 개념
도커 강의
도커 볼륨
도커 볼륨2
도커 볼륨3
컨테이너 오케스트레이션

profile
노는게 제일 좋아

0개의 댓글