Docker란?

2022. 3. 8. 15:19프로그래밍/Docker

범고래 위에 컨테이너...

클라우드의 클 자만 꺼내도 어떻게든 도커라는 단어를 만나게 됩니다.

그만큼 도커의 활용도가 높아지고 여러 환경에서도 자주 쓰이고 있습니다.

 

가끔 도커를 VM이라고 부르는 사람이 있는 거 같은데 도커는 아직까지는! VM이면서 VM이 아닌 친구입니다.

도커는 MicroVM을 완벽하게 지원하려 여러 업데이트를 하고 있는 것으로 알고 있습니다.
만약 MicroVM을 완벽하게 지원해준다면 VM이라고도 부를 수 있을 거 같습니다.

Red Hat의 컨테이너와 VM 비교(출처는 이미지 클릭!)

VM은 Host위에 각 서비스별 Guest OS가 존재하여 완전 독립적인 구성을 가지고 있는 반면에(왼쪽 표)

도커는 Container 라는 개념으로 Host위에 Host의 커널을 공유하며(Supporting Files 쯤 해당) 각각의 서비스를 제공해줍니다.

 

 

Linux Container(LXC)?  리눅스 컨테이너?


 

컨테이너 기술은 OS레벨의 가상화로(Host) 프로세스를 격리시켜 동작하는 방식이라고 합니다.

chroot 명령어를 사용하면 해당 폴더는 상위 폴더에 접근 불가

OS레벨의 가상화를 조금 더 부가 설명을 하면.
리눅스/유닉스에서 chroot라는 명령어와 가장 가깝다고 생각하시면 됩니다. (위 사진처럼)
이미지 출처 : https://borosan.gitbook.io/lpic2-exam-guide/2073-securing-a-dns-server
# 도커의 초창기 버전에서는 chroot 명령어를 발전시킨 LXC (Linux Container)에 의존하여 개발되었으나
# 현재는 LibContainer를 사용하여 의존도를 떨구고 있습니다.
# LibContainer는 LXC와 비슷한 자체 라이브러리입니다.

조금 더 깊숙하게 들어가면 컨테이너는 리눅스 기능인 NamespaceCGroup(Control Group)을 기반으로 만들어집니다.

 

Namespace

프로세스를 독립시켜주는 가상화 기술입니다.

프로세스 ID가 동일해도 서로 다른 프로세스입니다.

 

VLAN 개념과 비슷한 이 기술은 같은 커널 위를 돌지만 이 기술로 만들어진 프로세스는

현 커널에 존재하는 프로세스와 충돌을 일으키지 않습니다.

 

독립된 프로세스들은 PID, IPC, UID, Network, Mound, UTS가 독립적으로 존재합니다.

Network에서 유추할 수 있듯이 이 프로세서들은 IP로 통신을 할 수 있습니다.

Linux Kernel 부분을 봐주세요!

이미지 출처

 

CGroup (Control Group)

잉여 하드웨어 자원을 분배하는 기능입니다.

 

 

Namespace와 CGroup을 합쳐 만든 컨테이너를 LXC (Linux Container)라고 부릅니다.

VM과 비슷하게 하나의 Host위에 여러 서비스들을 올려 제공할 수 있습니다.

 

 

그래서 도커가 뭔데


LXC와 도커의 차이점

이미지 출처 : redhat.com/ko/topics/containers/what-is-docker

위에서 열심히 컨테이너 설명을 읽고 오셨을 겁니다.

 

도커가 무엇인지 조금 쉽게 설명하기 위해 아래 표를 그려봤습니다.

Mysql
아파치
Docker

도커 위에 아파치 전용 방을,

그 위든 옆이든 아무튼 어디다가 Mysql 전용 방을 두어 서로 상호작용이 가능하게 해주는 친구입니다.

단지 이 행위를 VM처럼 각각 Guest OS를 두지 않아 가볍고 빠르다는 장점 등이 있습니다.

 

 

 

마지막으로 LXC와 Docker를 구별하자면

 

LXC와 도커의 차이점 사진을 보시면서 읽어주세요!

LXC는 하나의 컨테이너 안에 여러 서비스들을 제공할 수 있습니다.

Docker는 하나의 컨테이너 안에 하나의 서비스만 제공하길 권장하고 있습니다.

 

도커같은 이유는 MSA(Micro Service Architecture)를 선호하는 거 같다고 생각합니다.

여러 서비스들 중 문제가 되는 서비스만 집중적으로 대응이 가능하다는 점과 업데이트 시 각 서비스들 간의 간섭을 받지 않거나 최대한 덜 받을 수 있습니다.

 

또한 Docker는 캡처 기능을 지원하지만 LXC는 캡쳐기능을 지원하지 않습니다. (스냅샷 기능)