도커를 공부하는 초보자를 위한 안내서 1편 - 컨테이너 개념
도커(Docker) 기초 다지기 - 도커란 무엇인가?
도커(docker)와 컨테이너에 대해서 많이 들어보셨을 것입니다. 도커와 컨테이너를 쓰면 뭔가 좋은 것이 많다고는 하는데, 도대체 도커는 무엇이고 컨테이너는 무엇일까요?
이번 포스트에서 그 물음에 대한 답을 찾아보도록 하겠습니다.
도커의 정의
도커(docker)가 무엇인지 알기 위해서 우선 정의부터 살펴보겠습니다. 구글 검색창에 '도커'를 검색하면 위키백과(Wikipedia)에서 정의한 도커의 의미가 나옵니다.
'도커(docker)는 리눅스의 응용프로그램들을 소프트웨어 컨테이너(Container) 안에 배치시키는 일을 자동화하는 오픈소스 프로젝트이다.'
여러분은 정의를 보고 단박에 도커가 무엇인지 이해가 되셨나요? 저는 아쉽게도 제대로 이해하지 못했습니다. 바로 '컨테이너'라는 단어 때문이었습니다. 도커를 이해하기 위해서 일단 이 컨테이너(Container)라는 녀석의 정체를 먼저 알아보겠습니다.
What is Container?
컨테이너라고 하면 가장 먼저 떠오르는 것은 바로 선박 컨테이너입니다. 동시에 '규격화', '운반의 용이성', '다양한 물건 탑재 가능' 등이 떠오릅니다.
아마 '컨테이너'라는 이름이 만들어진 것에는 실제 선박 컨테이너의 속성과 관련이 있을 것 같다는 생각이 듭니다!
Software Container
예 맞습니다! 선박 컨테이너와 같이 소프트웨어 컨테이너도 다양한 프로그램, 실행 환경 등을 컨테이너로 추상화할 수 있을 뿐만 아니라 프로그램의 배포 및 관리를 단순하게 해주는 기능을 하고 있습니다.
즉, '패키징'과 '운반'을 편리하게 해준다는 점이 바로 공통점입니다.
하지만, 컨테이너 개념에 대해서 처음 들으시는 분들이라면 아마 이런 생각을 하고 계실지도 모릅니다. '좋다는 건 알겠는데, 그래서 도대체 컨테이너가 뭔데?, 어떻게 구성되고 뭐로 만들지? 프로그램인가? 아니면 물리적으로 존재하나?'
저도 비슷한 어려움을 겪었습니다. 컨테이너가 정확히 무엇인지 알아야 컨테이너가 가지는 장점도 이해가 가는 법이죠!
가상화(virtualization)와 리눅스(Linux) 컨테이너
컨테이너를 이해하기 위해서는 일단 가상화라는 개념을 알고 있어야 합니다. 가상화는 컴퓨터 리소스의 추상화를 일컫는 말입니다. 쉽게 말하자면, 애플리케이션, 서버, 저장장치 등 물리적으로 하나인 것을 복수의 것처럼 또는 반대로 복수의 것을 하나인 것처럼 만들어 주는 기술입니다.
자세한 내용은 https://ktcloudplatform.tistory.com/62?category=428553 여기를 참고하시면 좋을 것 같습니다.
가상화를 통해서 가상머신(VM)을 만들어 낼 수 있습니다. VM은 호스트 운영체제에서 구동되며 그 바탕이 되는 하드웨어에 가상으로 액세스하는 Guest 운영체제를 가지는 일종의 격리된 머신 입니다. 쉽게 생각하면 하나의 컴퓨터입니다. (물리적인 컴퓨터 자원을 가상화시켜 별도의 컴퓨터를 만든 뒤 거기에 필요한 운영체제를 올렸다고 생각합시다.)
컨테이너는 가상머신과 마찬가지로 애플리케이션을 관련 라이브러리 및 모든 종속항목과 패키지(그냥 APP에 필요한 모든 파일, 설치파일들, 필요한 모든 것들)로 묶어 소프트웨어 서비스 구동을 위한 격리환경을 마련해 주지만 큰 차이점이 있습니다.
바로 가상화 방식이 다르다는 점입니다. 기존의 VM을 생성하는 가상화 방식은 주로 OS를 가상화하였습니다. Host OS가 존재하고 그 위에 Guest OS 전체를 가상화하는 방식이었습니다. 그러므로 OS가 가상머신 이미지에 포함되어야만 하고 이는 용량이 매우 클 수밖에 없는 구조입니다. 가상화 기술의 발전으로 성능이 좋아졌다고는 하지만, 전가상화와 반가상화 등 Guest OS를 포함하여 운영하는 방식은 여전히 하드웨어 성능을 100% 뽑아낼 수 없습니다.
아래 첨부한 그림의 왼편을 보시면, 기존 가상화 방식의 구조를 파악할 수 있습니다.
하지만 컨테이너 기술은 다릅니다. 컨테이너는 별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유하여 컨테이너를 실행하며 Guest OS가 존재하지 않습니다. 이런 가상화를 '운영체제 수준의 가상화'라고 부릅니다. 이게 가능한 까닭은 바로 리눅스 컨테이너를 통해 '프로세스를 격리' 하는 것이 가능하기 때문입니다.
프로세스 격리
리눅스(Linux) 운영체제는 커널 공간과 사용자 공간이 존재합니다. 이 중 사용자 공간을 여러 개로 나누어 프로세스에서 사용하는 리소스를 제한할 수 있습니다. 이것이 바로 컨테이너의 근간이 되는 기술입니다. 즉 각각의 프로세스가 독립된 공간에서 할당받은 자원을 이용하여 동작하도록 만들 수 있는 것입니다. 이게 가능한 이유는 다음과 같은 기술을 리눅스(Linux)에서 제공하기 때문입니다.
- 리눅스 네임스페이스(namespace)
리눅스 네임스페이스는 각 프로세스가 파일시스템, 네트워크, 유저, 호스트네임 등에 대해서 시스템이 독립뷰를 가질 수 있도록 만들어 줍니다.
- 리눅스 컨트롤 그룹(cgroups)
리눅스 컨트롤 그룹은 프로세스가 소비할 수 있는 리소스(CPU, 메모리, I/O, 네트워크 대역)등을 제한할 수 있는 기능으로 각각의 프로세스에 리소스를 할당할 수 있습니다.
기존 가상화 기술에서는 VM이 실제 물리 하드웨어를 에뮬레이트 하므로, OS가 반드시 필요합니다. 하지만 리눅스 컨테이너(LXC)에서는 모든 프로세스가 호스트 OS에서 바로 시작합니다. 일반적인 프로세스와 다른 점은 그룹화를 통해 단절된 공간에서 동작한다는 것입니다. 리눅스 컨테이너 기술은 도커 컨테이너가 사용하는 기술의 근간이 되는 기술입니다.
즉, 컨테이너라는 것은 리눅스가 제공하는 기능을 이용하여 단절된 공간에서 할당받은 시스템 자원을 통해 독립적으로 가동되는 일종의 '프로세스' 입니다.
기회가 된다면, 다음 포스트에서는 리눅스 프로세스 격리기술에 대해서 자세히 다뤄보도록 하겠습니다.
마무리
이상으로 컨테이너가 무엇인지 알아보았습니다.
어려운 용어도 너무 많고, 처음 들어보는 개념도 많을 테지만 반복해서 읽고 모르는 것은 검색해서 찾다 보면 어느 순간 컨테이너가 무엇인지 알 수 있을거라 생각합니다!
이해가 잘되지 않는 부분은 댓글로 남겨주시면 답변드리겠습니다.
컨테이너를 이해하는 가장 중요한 핵심은, '컨테이너는 리눅스 환경에서 돌아가는 일종의 프로세스이다.' 라는 말입니다. 이 개념을 이해하고 적용해 본다면 컨테이너에 대한 이해가 훨씬 수월해질 것입니다.
다음 포스트 에서는 컨테이너의 장점에 대해 자세히 알아보도록 하겠습니다.
(https://ktcloudplatform.tistory.com/69 - 컨테이너의 장점)
관련글
1. https://ktcloudplatform.tistory.com/62?category=428553 <가상화 관련 설명>