티스토리 뷰

Docker & VM

[Docker] 도커(Docker) 딥 다이브 #1

whatisyourname 2022. 11. 27. 21:47
반응형

바야흐로 가상화의 시대이다. 여러 프로그램들을 가상 운영체제에 올려 가동을 시킨다. 이제는 VM을 포함한 한 대의 서버에서 여러 개의 서비스를 구동할 수 있는 시대가 온 것이다.

 

이러한 시대는 "사실 상 업계표준"인 도커(Docker)에서 시작되었으며, 현재 컨테이너 기술의 선두 주자라도 봐도 무방할 만큼 도커가 가상화 및 컨테이너 시장에 미친 영향은 어마어마하다.

 

그러나, 사실 도커가 어떤 시대정신에 맞추어 탄생하였는지, 이에 대한 맥락을 이해하면서 쓰는 것과 모른 채 쓰는 것은 매우 큰 차이가 있다고 생각한다. 이에 따라, 도커의 밑바닥부터 들어가보자.

 

파란 고래를 따라 바닥으로 들어가보자.

도커의 지하까지 탐색하여보자!


1. TCP/IP 5계층부터 살펴보자.

TCP / IP 5계층 기본 구조.

사실, 도커의 기술 80%는 네트워크 기술을 기반으로 두고 있다고 해도 무방하다. 그러면, 먼저 TCP/IP 5계층(혹은 OSI 7계층)부터 살펴보자. 우리가 사용하는 어플리케이션 레이어는 TCP/IP 5계층 중 최상위 레이어, 즉 Application layer에 해당한다. 이후 L4인 Transport layer(TCP), L3인 Network layer(Internet layer, IP), L2인 Link layer(MAC, Driver, Network Interface Card - NIC)를 거쳐 L1인 Physical layer까지 내려간 후, 데이터가 전송된다.

 

이때, Application Layer과 Transport Layer를 이어주는 하나의 특별한 파일이 있으니, 이를 우리는 소켓(socker)이라 부른다. 즉, 통신을 위하여 유저 영역인 응용프로그램과 OS의 커널 영역을 이어주는 하나의 인터페이스를 제공해준다고 봐도 무방하다. 소켓도 하나의 파일의 일종이기에 읽기 / 쓰기(read / write)가 가능하며, 소켓 통신에서는 읽기 / 쓰기 대신 수신 / 송신 (receive / send)라고 표현한다.

 

모든 통신은 위와 같은 계층적 구조를 가진다고 해도 무방하다. 안의 세부 프로토콜에는 차이가 있을 수 있지만, 결국 블록 단위로 살펴보면 똑같은 구조를 가진다.

 

가상화된 OS 혹은 컨테이너도 위와 같은 구조를 활용하며, 이들도 통신을 할 수 있기에 위와 같은 구조를 가진다. 그러나, 가상화는 말 그대로 "가상"이기에 조금은 다른 느낌으로 통신 레이어를 구상한다.

 

2. TCP/IP in Virtual Systems

OS에서 Virtual System 사용할 시 통신의 구조

만약 하나의 물리적 장비에서 Virtual OS 혹은 시스템을 사용한다고 했을 때, 이들도 통신이 가능하므로 같은 계층적 구조를 가진다. 다만, 이 경우 user 영역에서 가상의 kernel 영역을 생성하며, 실제 물리적 장비의 kernel 영역은 가상 하드웨어처럼 동작한다. (실제로 VirtualBox를 통해 가상 영역의 어댑터를 설정할 수 있는 것이 이와 같은 이유이다. )

 

이들도 외부와 통신을 할 수 있다. 이 경우 정보를 가상 네트워크 어댑터를 통해 외부와 통신해야 하는데, 각 가상 OS는 다른 MAC 주소를 가져야 하기에 다른 이더넷 카드 번호를 부여하며, 이를 VNet 1번부터 순서대로 각 격리된 OS에게 부여한다. 따라서, 물리적 호스트는 가상 호스트를 바라볼 때 각 VNet를 통해 바라 볼 수 있다.

 

그럼, 0번은 어느 용도로 사용될까? Vnet0은 각 가상 머신의 통신을 이어주는 일종의 virtual bridge역할을 하며, 실제 이더넷 카드 번호인 eth0과 가상 머신의 NIC 간의 L2 브릿지 역할을 한다.

 

위 그림에서 비효율적인 부분을 찾을 수 있다. 각 앱마다 가상 머신위에 구동한다면, 그 밑 가상 kernel 부분과 하드웨어 부분은 중복되는 부분이 아닌가? 이를 그냥 원래 호스트의 커널과 공유한다면 같은 방법으로 가상 OS를 돌릴 수 있고, 조금 더 경량화된 프로세스 격리를 할 수 있지 않을까?

 

이러한 의문은 도커의 탄생으로 해결되었고, 바야흐로 가상 컨테이너 시대를 연 도커가 이러한 문제에 혁신을 불러일으켰다.

 

3. Get Dockered

도커의 기본 구조

도커는 각 컨테이너에서 커널 영역을 공유한다. 따라서, 각 격리된 프로세스는 새로운 네트워크 계층 구조를 구축해야하는 오버헤드를 줄일 수 있고, 가상 어댑터 형식을 차용하여 가상 L2 브릿지인 'docker0'을 거쳐 통신을 할 수 있도록 하였다. 이때 도커 엔진은 각 컨테이너와 호스트 커널 영역 간 연결 역할을 하는 핵심 소프트웨어라 생각하며 되겠다. 한 눈에 보아도 경량화 된 부분이 많이 보이지 않는가?

 

다만, 도커는 리눅스 환경만을 기본으로 지원하기 때문에 Mac 혹은 Windows의 경우 Docker desktop을 따로 설치하여야 도커가 가능하다.(Mac의 경우에는 굉장히 가볍지만, 윈도우의 경우에는 램이 16GB 미만이면 구동하는 것을 포기해야 할 정도로 램 먹는 괴물이다.)

 

또한, 물리적 호스트와 공유된 커널을 사용하기에 도커를 사용하는 경우 보안은 포기해야 한다. 따라서 도커 컨테이너에 민감한 정보를 올리거나, 도커 컨테이너를 아무거나 구동해서는 안된다.  커널이 털리면 컨테이너 내부도 취약할 수 있다는 의미로 생각하면 된다.

반응형

'Docker & VM' 카테고리의 다른 글

[Docker] 도커(docker) 딥 다이브 #2  (0) 2022.11.28
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함