이 영역을 누르면 첫 페이지로 이동
codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

페이지 맨 위로 올라가기

codesche's blog

[Docker] Docker 개념 정리

  • 2023.02.26 17:35
  • DevOps/Docker

○ Docker란?

Docker는 Go언어로 개발된 리눅스 컨테이너 기반의 오픈소스 가상화 플랫폼입니다.

다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줍니다. 백엔드 프로그램, DB서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있으며 AWS, Azure, Google cloud 등 클라우드 및 여러 환경에서 실행할 수 있습니다.

 

○ 컨테이너란 무엇인가?

프로그램을 실행하려면 OS와 소프르웨어가 사용하는 동적 라이브러리가 필요합니다. 즉, 프로그램 실행을 위해서는 OS와 라이브러리를 포함한 프로그램이 필요로 하는 파일 등으로 구성된 실행환경이 필요합니다. 그런데 하나의 시스템 위에서 두 가지 이상의 프로그램을 동시에 실행하는 경우 버전 문제 또는 운영체제 문제가 발생할 수 있습니다. 가장 간단한 해결책은 두 프로그램을 위한 시스템을 각각 세팅하면 됩니다. 하지만 이 경우 비용문제가 발생할 수 있기에 그리 좋은 해결책은 아닙니다. 이러한 문제점을 효율적으로 해결해주는 것이 바로 컨테이너입니다. 컨테이너는 개별 프로그램의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 해줍니다. 기존의 개발환경과 다른 개발환경과의 간섭을 막고 각각의 개별환경에 세팅된 프로그램들이 잘 동작할 수 있게 해주는 격리 기술입니다. 조금 어려운 말로 설명하자면 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공하는데, 이는 쉽게 말해 컨테이너는 각각의 프로그램들이 독립적으로 잘 실행될 수 있게 해주는 도우미 혹은 비서 역할을 수행하신다고 생각하시면 됩니다.

 

○ 컨테이너의 이점

가상 환경에 익숙하다면 컨테이너를 가상 머신(Virtual Machine)에 비교하여 생각하면 어렵지 않습니다. 가상 머신이 호스트 운영체제에서 구동되며 그 바탕이 되는 하드웨어에 가상으로 액세스하는 Linux, Windows 등의 게스트 운영체제에 접근하는 방식을 떠올린다면 컨테이너를 이해하시는 데 있어 그리 어렵지 않을 것입니다. 컨테이너는 가상 머신과 마찬가지로 애플리케이션(프로그램)을 관련 라이브러리 및 종속 항목과 함께 패키지로 묶어 소프트웨어 서비스 구동을 위한 격리 환경을 마련해줍니다. 조금 어렵게 느껴지시나요? 쉽게 말해서 내가 개발한 프로그램, 운영중인 데이터베이스, 프로그램 구동에 필요한 라이브러리와 각종 파일 및 폴더 등이 하나의 패키지로 묶여서 원활하게 동작할 수 있는 개발 환경을 제공해준다는 의미로 이해하시면 됩니다. 

 

그림을 보시면 좀 더 이해가 쉬우실텐데 왼쪽이 가상 머신, 오른쪽이 컨테이너의 구조입니다. 가상 머신 같은 경우 하나의 앱을 실행시켜주기 위해 각각의 Guest OS가 필요한 반면 컨테이너는 운영체제 수준에서 가상화를 하기에 다수의 컨테이너를 OS 커널에서 직접 구동할 수 있습니다. 뿐만 아니라 가상 머신과 비교했을 때 디스크 용량도 절감할 수 있으며 낮은 오버 헤드의 이점도 가지고 있습니다.

 

○ 이미지(Image)

여기서의 이미지는 우리가 흔히 알고 있는 그 이미지가 아닙니다. 이미지란 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있으며 상태값을 가지지 않는 불변의 것을 말합니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있으며 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.

 

레이어 저장방식

도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기에 보통 용량이 수백메가에 이릅니다. 처음에 이미지를 다운받을 땐 문제가 없지만 기존 이미지에 파일 하나 추가한다고 다시 다운받을 경우 비효율적이라고 느껴질 수 있습니다.

그래서 도커는 이런 문제를 해결하기 위해 레이어(layer)라는 개념을 사용하며 유니온 파일 시스템을 이용해 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있도록 해줍니다. 이미지는 여러개의 읽기 전용(read-only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성됩니다. ubuntu 이미지가 A + B + C 의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 됩니다. webapp 이미지를 nginx 이미지 기반으로 만들었을 경우 A + B + C + nginx + source 레이어로 구성됩니다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 효율적으로 이미지를 관리할 수 있습니다.

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

다른 글 더 둘러보기

정보

codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

  • codesche's blog의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (76)
    • Algorithm (15)
      • 백준 (3)
      • 프로그래머스 (10)
      • inflearn 알고리즘(Java) (2)
    • 블로그소개 (1)
    • Back-End (11)
      • Java (10)
      • SpringBoot (1)
    • Database (2)
      • MySQL (0)
      • MariaDB (1)
      • Redis (0)
      • 개념, 이론 (1)
    • Front-End (0)
      • html, css, javascript (0)
    • Git (2)
    • 알고리즘 지식 (11)
      • 자료구조 (11)
    • Study Cafe (21)
      • 기술면접 (6)
      • Clean Code 스터디 (14)
      • CS 스터디 (0)
      • 개발용어 (1)
    • 주간 에세이 (10)
    • DevOps (3)
      • 배포, Front&Back 연동 (1)
      • AWS (0)
      • Docker (1)
      • 이론 (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 개발자 현실
  • 자바 기초
  • 자료구조
  • 클린코드
  • 자바 변수
  • 주간에세이
  • git commit
  • java

나의 외부 링크

정보

The Code의 codesche's blog

codesche's blog

The Code

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © The Code. Designed by Fraccino.

티스토리툴바