본문 바로가기

데이터엔지니어링

[데이터엔지니어링] Docker 개념

Docker란 무엇인가?

DockerContainer 기반의 오픈소스 가상화 플랫폼입니다.

쉽게 얘기하면 컨테이너라 불리는 하나의 작은 소프트웨어 유닛 안에 Application, System Tools, Dependencies 와 같은 실행을 위한 모든 것을 하나로 묶어 다른 서버, PC 에 쉽게 배포하고 안정적으로 구동할 수 있게끔 해주는 Tool입니다.

컨테이너란?

컨테이너의 개념을 알기 위해서는 Virtualization(가상화) 개념에 대해서 먼저 알아야합니다.

Virtualization (가상화)

https://tech.kakaoenterprise.com/150

가상화(Virtualization)는 가짜(not real) 하드웨어 환경을 만들어 내는 기술입니다.

가상화(Virtualization)를 통해서 물리적 머신의 기능을 여러 사용자, 환경에 배포해 물리적 머신을 최대한 활용할 수 있습니다

Hypervisor Virtualization

중간에 Hypervisor라는 층이 존재한다.

Hypervisor : 한 대의 머신에서 다수의 운영체제를 동시에 실행하는 소프트웨어

 

Hypervisors의 장점

  • 한 대의 컴퓨터로 여러 대의 컴퓨터 역할을 한다.
    • 과거에는 한 대의 컴퓨터에서 적은 용량만 차지하는 소프트웨어가 있다고 하더라고 한 대만 사용했었지만, 현재는 한 대의 컴퓨터가 서로 다른 virtual machine들 위에 서로 다른 OS 위에 여러개가 동작하는 것처럼, 한 대가 여러개로 쪼개질 수 있으니, 한 대의 컴퓨터로 여러대의 역할을 함 (비용절감💰)
  • 필요할 때 필요한 만큼 사용하기 때문에 자원을 효율적으로 사용가능하다.

HyperVisor의 문제점

  • 운영체제를 통째로 올려야해서 메모리, 디스크 측면에서 상당한 부담이 됨.
  • Host OS가 Linux인데 Guest OS도 Linux이면 한 컴퓨터에 Linux를 불필요하게 2개 이상 사용 → 성능 저하.

Container Virtualization

  • 위의 HyperVisor의 문제점을 해결하기 위해 나온 기술이 Container 기술입니다.
  • 격리된 환경 + 제한된 리소스로 제어되는 프로세스
  • 운영체제(커널) 위에 독립적으로 가상화된 공간
  • 공유 자원을 프로세스별로 할당치만큼만 사용하도록 제한
  • 의존성 라이브러리, 설정 등 실행에 필요한 모든 것들을 ‘이미지’로 모아 패키징

VM(Hypervisior)과 컨테이너 비교

https://tech.kakaoenterprise.com/150

가상 머신(HyperVisor) 컨테이너(Container)
VM은 운영체제 위에 하드웨어를 애뮬레이션하고, 그 위에 운영체제를 올리고, 프로세스를 실행한다. 컨테이너는 하드웨어 에뮬레이션 없이, 리눅스 커널을 공유해서 바로 프로세스를 실행한다.
기존 서버에 하이퍼바이저 설치
+ 그 위에 가상 OS
+ 패키징한 VM을 만들어 실행
⇒ 하드웨어 레벨의 가상화
운영체제를 제외한 나머지 어플리케이션 실행한 모든 파일을 패키징 ⇒ OS 레벨 가상화
개별 VM은 독립된 OS를 사용
⇒ 고립성(보안)은 더 좋음
⇒ 오버헤드가 크고 무겁고 느림
적은 오버헤드 + 더 가벼운 프로세스 실행 + 컨테이너 복제 용이

Docker의 구성 요소

진행 과정

  • (1) Dockerfile 작성
  • (2) Dockerfile로 Docker Image를 build.
  • (3) Docker Image를 run하면 Docker Container가 된다.

Dockerfile

컨테이너를 어떻게 만들어야하는지에 대한 설명서

  • 어플리케이션 구동을 위한 파일들
  • 어떤 외부 라이브러리가 필요한지
  • 필요한 환경변수들
  • 어떻게 구동해야하는지에 대한 스크립트 정보

Image

작성한 Dockerfile를 사용하여 생성 가능

  • Dockerfile를 통해 실행되고 있는 어플리케이션에 대한 스냅샷, 즉 템플릿
  • 불변의 상태 유지

Container

생성한 Image들이 구동되게끔 해주는 툴

  • Image를 이용하여, 어플리케이션이 동작하는 각각의 컨테이너 인스턴스 생성
  • Image 와는 다르게 Container는 개별적인 수정 가능

Docker를 사용하는 이유

(1) Open platform

  • 도커는 대부분의 플랫폼에서 실행되며 오픈소스임
    • 따라서, 도커 위에서 실행된다면, 플랫폼이 독립적으로 SW를 어디서든지 실행 가능

(2) Separate your applications from your infrastructure-Deliver software quickly

  • 도커는 Linux, Windows, macOS와 같이 여러 운영체제에서 실행 가능
  • 그러므로, 도커를 이해하고 그 위에 어플리케이션을 실행하면 됨
    • 따라서, 내가 어떤 운영체제, CPU인지를 생각하지 않고 어플리케이션을 실행 할 수 있으니, 직접 만든 어플리케이션을 infrastructure, 완전히 독립적인 SW를 만들 수 있다.

(3) Infrastructure as Code & DevOps

  • 자신이 필요한 운영체제, 그리고 운영체제에 필요한 module, 그에 대한 configration들이 자신의 어플리케이션이 돌아갈 때, 필요한 것들을 프로그래밍 하듯이 짜면, 이것을 빠른시간 안에 자동화된 방법으로 동작시킬 것이다.

(4) Immutable Infrastructure using 'Dockerfile'

  • (왼쪽)도커파일-(중간)도커이미지-(오른쪽)도커컨테이너가 있음

Reference

도커 한방에 정리 🐳 (모든 개발자들이 배워보고 싶어 하는 툴!) + 실습

마이크로서비스 프로그래밍 - Welcome to Dr.Sungwon

서비스 개발자를 위한 컨테이너 뽀개기 (a.k.a 컨테이너 인터널)

Differences between a Dockerfile, Docker Image and Docker Container