:: docker

docker :: 도커(docker)의 개념, 가상머신(VM)과 컨테이너(Container) 비교, 도커 이미지(Image)와 레지스트리(Registry)

토람이 2022. 5. 18. 22:14

1. 도커(docker) 란?

도커는 소프트웨어를 컨테이너(Container) 라는 표준화된 유닛으로 패키징하여

애플리케이션을 신속하게 구축하고 배포할 수 있게 해주는 오픈소스 프로젝트이다.

라고 가이드 문서들에 쓰여 있다.

 

쉽게 말해보자면, 서비스하려고 하는 애플리케이션(코드 등)과 그에 필요한 라이브러리 등을

'컨테이너'라는 공간에 담아서 여기저기 배포하기 쉽게 도와주는 플랫폼이라 할 수 있다.

 

하나의 컨테이너는 비록 크기는 작지만 하나의 컴퓨터와 같은 기능을 할 수 있다.

즉, 운영체제도 있고 내가 서비스하려는 애플리케이션도 들어있고 그에 필요한 라이브러리들도 들어있다.

 

이런 컨테이너를 여기저기 배포하기가 과연 쉬울까?

그건 아니다.

 

컨테이너 자체는 한꺼번에 옮기기는 좀 무겁고,

대신 '컨테이너 이미지(Container Image)'라는 것을 생성해서 

어디서나 이 이미지를 토대로 컨테이너를 쉽게 생성하여 애플리케이션을 신속하게 구축/배포할 수 있게 된다.

 

이미지(Image)란 말 그대로 컨테이너 안에 담긴 것들을 사진을 찍어두듯 저장해둔 것인데

당연히 컨테이너보다 훨씬 용량이 적어 가볍다.

그래서 여기저기 배포하기도 쉽다.

 

컨테이너와 이미지 (docs.microsoft.com)

 

그렇다면 컨테이너는 대체 무엇일까?

컨테이너를 이해하려면 먼저 '가상화기술' 의 개념을 짚고 넘어가야 한다.

 

 

2. 가상화기술

AI 기술을 연구하는 연구원 A가 테스트를 위해 성능이 엄청 뛰어난 데스크톱을 구매했다. (ex. 고사양 GPU)

그런데 A 혼자 데스크톱 하나를 사용하려니,

워낙 고성능의 컴퓨터인지라 용량도 많이 남고 cpu 도 널널하다.

옆자리 B, C도 각각 고성능의 데스크톱을 사용하는데 모두들 같은 상황이다.

 

얼마나 아깝겠는가...?!

이 좋은 컴퓨터를 내가 반의 반도 못쓰고 있다니 돈도 아깝고 괜히 낭비처럼 느껴질 것이다.

그렇다고 성능이 떨어지는 컴퓨터를 쓸 수도 없고..

 

하나의 컴퓨터에서 자원을 분리하여 나누어 쓸 수 있다면 어떨까?

이러한 의문에서 출발한 기술이 가상화기술이다. (개인적인 생각^.^)

같은 Host Machine 위에서 리소스를 나누어 독자적인 컴퓨터처럼 동작할 수 있게 하는 것이다.

 

3. 가상머신(VM) 과 컨테이너

이 가상화 기술의 대표적인 예 두 가지가 가상머신(Virtual Machine) 과 컨테이너(Container) 이다.

 

VM(좌측), Container(우측) (https://www.netapp.com/blog/containers-vs-vms/)

기존에 가상머신(VM) 기술이 주로 활용되다가 컨테이너 기술이 등장하기 시작했고,

도커가 나오면서 이 컨테이너 기술이 빠른 속도로 상용화/보급화되었다.

 

두 기술의 가장 큰 차이점은 OS(운영체제)를 공유하느냐, 그렇지 않느냐 이다.

기존의 VM 은 Host machine 위에 Guest machine 을 분리시킬 때 운영체제를 포함하도록 했다.

 

각각이 서로 다른 운영체제 위에서 애플리케이션을 올릴 수 있다는 점은 장점이지만,

각 Guest machine 의 용량이 매우 크다는 게 단점이다. (OS는 무겁다)

 

컨테이너는 이와 반대라고 보면 된다.

각 Guest machine 이 모두 동일한 운영체제(host OS) 위에서만 애플리케이션을 올릴 수 있는 반면, 매우 가볍다.

앞선 예시에서 연구원 A,B,C는 같은 업무를 담당하기 때문에 동일한 OS 환경에서 연구를 진행할 확률이 높다.

 

실제로도 guest machine 들이 각각 서로 다른 OS를 사용해야 하는 경우가 그렇게 많지는 않아서

컨테이너 기술이 여러모로 효율적인 기술이라고 생각한다.

 

 

4. 이미지(Image)

앞서 간단히 설명했지만 이미지는 컨테이너의 스크린샷과 같은 개념으로,

컨테이너 실행에 필요한 파일과 설정값들을 담아둔 파일이다.

 

이미지 파일은 층층이 쌓인 Layer 구조로 이루어져 있다.

파일들이 한꺼번에 저장되어 있는 게 아니라 여러 layer 에 나누어 저장되어 있는 것이다.

그리고 컨테이너를 만들 때 각각의 layer 에 있는 파일들을 가져오게 된다.

 

왜 이런 구조로 만들어졌을까?

 

앞선 예시에서 연구원 A,B,C 가 기본적인 틀은 동일한 것을 사용하지만

서로 약간씩 다른 라이브러리를 사용하여 연구를 진행할 확률이 높다.

 

이들이 컨테이너를 만들 때 <공통 layer + 추가적인 서로 다른 layer> 를 다운받아 만들게 되는데

공통 layer 를 공유할 수 있는 장점이 있고,

로컬에 이미 존재하는 layer 의 경우 다시 다운로드 받을 필요가 없기 때문에

(추가 layer 만 다운받아) 보다 빠르게 컨테이너를 실행할 수 있는 장점도 있다.

 

즉, 이미지를 보다 세세하게 나누어서 자원 효율화를 더욱 높인 구조라 볼 수 있다.

 

 

5. 레지스트리(Registry)

컨테이너에서 이미지를 생성할 수 있고 이미지로부터 컨테이너를 생성할 수도 있다.

레지스트리는 이미지들을 보관하는 저장소다.

 

컨테이너와 이미지와 레지스트리 (docs.microsoft.com)

 

도커 허브(Docker Hub) 같은 곳이 대표적인 레지스트리인데,

내가 간단한 이미지를 생성하여 올릴 수도 있고

이를 공개적으로 설정한다면(public) 전세계 누구나 그 이미지를 다운받아 컨테이너를 생성할 수도 있다.

 

레지스트리에는 Base Image 라고 해서

최소한의 기본적인 응용프로그램들만 담은 이미지들이 많은데,

예를 들어 mysql 을 사용하는 애플리케이션을 만들기 위해 mysql 이미지를 손쉽게 다운받을 수 있다.

docker pull mysql  # 가장 최근 버전 다운
docker pull mysql:latest  # 가장 최근 버전 다운
docker pull mysql:5.7.38  # 버전 5.7.38 다운

 

요렇게 매우 간단하게 docker pull 만 하면 이미지를 받을 수 있다.

이미지명 외에 태그명 또한 지정이 가능해서,

태그를 사용하여 원하는 버전의 mysql 이미지를 다운받을 수도 있다.

 

위 mysql base image 로 컨테이너를 생성한 후 일련의 수정사항을 반영한 다음

해당 수정사항까지 모두 포함된 이미지를 생성할 수도 있다.

 

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]  # command 형식

docker commit mysql_service toramko/service:1.0.0
# mysql_service 컨테이너 이미지를 toramko/service 레포지토리에 생성. tag=1.0.0

 

 

위와 같이 docker commit 명령어를 통해 registry 에 이미지를 생성할 수 있다.

이렇게 레지스트리를 통해 이미지를 손쉽게 주고받으며 편리하게 서비스 구축과 배포를 진행할 수 있다 :)

 

300x250