도커 없이 컨테이너 만들기

시작하며 ..

Since 2018 .. 검색시스템의 클라우드 전환을 준비하면서 컨테이너 기술 관련하여 학습하고 교육했던 내용들을 정리하였습니다.
검색은 massive한 데이터와 트래픽을 다루는 대용량 분산처리 시스템인만큼 서비스 도입을 위해서는 컨테이너 인터널과 네트워킹, 오케스트레이션에 대한 깊이 있는 이해가 필수적으로 수반되어야 하였습니다.
컨테이너를 좀 더 깊이 이해하고 실전에 활용할 수 있도록 컨테이너 관련 내용과 더불어 필요한 배경지식과 실습을 포함하였습니다.
컨테이너에 관심있으시거나 시작해보려고 하시는 분들, 그리고 deep~하게 파보고 싶은 분들 모두 도움이 되시리라 생각됩니다

목차

1편.컨테이너 인터널(1)

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-1.png v1.2

컨테이너란 무엇일까요? 마법 상자를 열어 보도록 하겠습니다.제가 처음 도커를 접했을 때는 "vmware, virtualbox 와 뭐가 다르지?" vmware처럼 OS이미지도 있었고 터미널 환경에서 동작하는 모습 역시 똑같아 보였거든요.그렇게 시작하게 되었습니다. 도커는 무엇이고 컨테이너는 무엇인지 실체가 궁금하더라구요 컨테이너의 개념을 설명하고 컨테이너의 시작이라 할 수 있는 chroot에 대해 다룹니다.

2편.컨테이너 인터널(2)

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-2.png v1.2

1편에 이어 chroot의 탈옥문제를 해결하는 pivot_root를 다루고 남은 문제들을 해결하는 컨테이너의 발전과정을 살펴봅니다. 컨테이너가 신기술, 유행 같은 것이라고 생각했었는데, 나름 역사와 사연이 많은 친구네요. chroot로 시작하여 지금의 컨테이너로 성장하기까지 어떤 문제들이 있었고 그러한 문제들을 어떻게 해결하여 왔는지를 다뤄봅니다.

3편.네트워크 네임스페이스(1)

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-3.png v1.3

서비스 운영 중에 네트웍 장애를 만나면 곤란하곤 하는데요. 컨테이너는 가상 네트웍을 기반으로 하고 있고 이 위에서 컨테이너 간의 통신이 어떻게 이루어지는지를 잘 이해하고 있으면 개발과 운영에 많은 도움이 됩니다. 네트워크 네임스페이스를 이해하기 위한 네트워크 기초 개념들을 다루고 네트워크 네임스페이 실습과 함께 컨테이너 환경에서의 가상 네트워크 구축이 어떻게 이루어지는지를 학습합니다.

4편.네트워크 네임스페이스 (2)

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-4.png v1.0

3편에 이어서 네트워크 네임스페이스를 외부 네트워크와 통신이 가능하도록 구성해 봅니다. 그리고 3,4편에서 다룬 내용을 바탕으로 도커 컨테이너의 네트워크 구성과 비교해 봅니다.

5편.마운트 네임스페이스와 overlayFS

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-5.png v1.0

1,2편에서 다룬 chroot와 pivot_root를 통해서 root filesystem을 isolation하였습니다. 마운트 네임스페이스는 파일시스템 마운트를 isolation 하는 것으로 이미 pivot_root에서도 사용하였지만, mount 처리를 격리함으로써 컨테이너 내부의 파일시스템 구조를 독립적으로 유지합니다. 실제 도커 컨테이너의 이미지 tarball을 이용하여 pivot_root와 mount namespace까지 적용하여 실제 도커 방식과 유사하게 컨테이너를 기동하여 봅니다. 그리고, 컨테이너 이미지 용량/중복을 해결하기 위한 overlayFS 에 대하여 다룹니다.

6편.오버레이 네트워크

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-6.png v1.0

분산환경에서 컨테이너 간의 통신은 어떻게 이루어 지는 것일까요? 3,4편에서는 호스트 안에 가상네트워크를 만들어보았습니다. 6편에서는 이를 바탕으로 분산환경에서 호스트 간에 가상 네트워크로 통신이 가능하도록 만들어 봅니다. 이 방법은 실제 쿠버네티스 flannel 등의 CNI에서 사용하고 있는 vxlan 기반의 오버레이 네트워크 구성을 다룹니다.

7편.다이내믹 오버레이 네트워크

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-7.png v1.0

클라우드 위에서 컨테이너에 가상 IP를 부여하고 이러한 가상 IP대역을 기반으로 컨테이너 간에 통신이 어떻게 가능한 것일까요? 동적으로 오버레이 네트워크를 구성해 봅니다. 지난 시간 가상IP 대역을 기반으로 서로 다른 물리노드 간의 통신을 가능하기 위하여 가상 디바이스를 생성하고 ARP cache와 Bridge FDB 정보를 입력해주고, vxlan 기반의 UDP encapsulation과 터널링을 통하여 가상디바이스의 L2정보를 목적지 노드로 전송하여 통신이 되는 것을 확인하였습니다. 이에 대한 내용을 바탕으로 가상네트워크를 추가하고 통신할 때 커널 이벤트를 캐치하여 동적으로 arp, fdb 갱신처리하여 컨테이너 간에 통신이 가능하도록 구성해 봅니다.

8편.PID 네임스페이스

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-8.png v1.0

pid namespace는 컨테이너 안에서 독자적인 "process tree" / "process id 체계"를 제공합니다. 어떻게 가능한 것일까요? 이를 이해하기 위하여 proc filesystem과 pid 쳬계에 대해서 얘기합니다. 그리고 프로세스 트리의 최상위인 특별한 프로세스 pid1 에 대하여도 다룹니다

9편.USER 네임스페이스

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-9.png v1.0 new

컨테이너의 root와 호스트의 root는 같은 것일까요? 다르다면 어떻게 다를 수 있을까요? 혹은 같다고 하면 컨테이너에서 호스트의 자원에 액세스하고 변경하는 것이 가능할까요? 9편에서는 컨테이너 보안관점에서 중요한 user namespace에 대해서 다뤄봅니다.

10편.도커 없이 컨테이너 만들기

https://netpple.github.io/docs/assets/img/make-container-without-docker-intro-10.png v1.0 new

지금까지 컨테이너를 이해하기 위하여 리눅스의 네임스페이스와 cgroup을 살펴보았고, 프로세스, 네트워크, 파일시스템 등 관련 내용들도 함께 다루어 보았습니다. 본 편에서는 지금까지 다루었던 내용들을 총망라하여 완전한 컨테이너를 만들어 보려고 합니다. 앞의 자료를 아직 안보신 분들도 본 실습을 통하여 컨테이너를 직접 만들어보고 개괄적인 이해와 재미를 얻으시길 바랍니다. :-)

[컨테이너 인터널 #2] 컨테이너 파일시스템

https://netpple.github.io/docs/assets/img/kep-techn-3.png v1.0 new

리눅스에서는 "모든 것이 파일"이라는 얘기가 있죠. 컨테이너가 호스트로 부터 파일시스템 독립을 이뤄내는 과정을 설명드립니다. 컨테이너 전용 루트파일시스템을 구성하는 방법, 효율적으로 컨테이너를 유통시키기 위한 패키징 방법, 그리고 컨테이너의 레이어 구조를 살펴보고 실습합니다.

[컨테이너 인터널 #1] 컨테이너 톺아보기

https://netpple.github.io/docs/assets/img/kep-techn-2.png v1.0 new

컨테이너의 발전사를 따라가면서 실습과 함께 컨테이너의 각 요소를 체험해 보실 수 있습니다. 교육이나 발표에서 잘 다루지 못했던 부분도 보완하다 보니 분량이 상당한데요. 책이라 생각하시고 여유를 갖고 공부하시면 도움이 되실 것 같습니다. 본 연재는 도커와 같은 툴 도움없이 컨테이너를 직접 만들어 봄으로써 컨테이너를 본질적으로 이해하는 것을 목표로 합니다.

서비스 개발자를 위한 컨테이너 뽀개기 (a.k.a 컨테이너 인터널)

https://netpple.github.io/docs/assets/img/kep-techn-1.png v1.0 new

카카오엔터프라이즈 테크앤 블로그에 컨테이너의 내부를 심도있게 들여다 보는 연재를 시작하였습니다. 컨테이너를 다루기에 앞서서 관련된 개념과 용어들을 정리하고 앞으로 다루게 될 내용들에 대해 안내합니다.

if(kakao)dev2022 이게돼요? 도커없이 컨테이너 만들기

https://netpple.github.io/docs/assets/img/ifkakao-sam.png v1.0 new

검색서비스 개발자로서 컨테이너 아키텍처와 동작 원리를 직접 학습하고 동료들과 나누면서 사내 교육 과정으로 탄생하게 된 '컨테이너 인터널'을 if(kakao)2022를 통해 외부에 공개합니다. 클라우드와 컨테이너 기술에 관심이 있는 서비스 개발자를 온라인에서 만나 쉽게 컨테이너 동작을 이해하고 직접 컨테이너를 만드는 실습을 진행합니다.

실습 환경

사전 준비

  • 맥 환경에서 VirtualBox + Vagrant 기반으로 테스트되고 준비되었습니다.
    • 맥 이외의 OS(윈도우,우분투,…)도 괜찮습니다만 원활한 실습을 위해서 “Vagrant” 사용은 권장드립니다

    • 혹시, Vagrant 사용이 어려운 분들은 우분투 18.04버전 환경을 준비하고 “실습환경 구성”의 Vagrantfile을 참고하여 필요한 프로그램들을 설치해주세요

환경 구성

Git clone

$ git clone https://github.com/netpple/make-container-without-docker.git

VM 생성

$ cd make-container-without-docker
$ vagrant up

VM 상태

$ vagrant status
Current machine states:

ubuntu1804                running (virtualbox)

VM 접속

$ vagrant ssh ubuntu1804

vagrant@ubuntu1804:~$

참고 (Vagrant 명령어)

# VM 중지와 재개
$ vagrant suspend
$ vagrant resume
# VM 종료와 기동
$ vagrant halt
$ vagrant up
# VM 재기동
$ vagrant reload
# VM 재설정/기동
$ vagrant reload --provision

실습 계정

실습은 root로 진행합니다

vagrant@ubuntu1804:~$ sudo -Es
root@ubuntu1804:~#

모든 준비가 끝났습니다. 이제 즐겨볼까요 :-)