[Docker 부터 Kubernetes 까지] [#1] Docker 란?

4분만에 배우는 Docker 이론 영상

서론

Docker와 Kubernetes를 여러 프로젝트에 사용해보며 삽질도 많이 하고 많은 어려움을 극복해온 사람으로서 그동안의 경험을 커뮤니티에 공유해보려고 합니다. [Docker부터 Kubernetes] 연재는 Docker의 가장 기본적인 지식부터 docker compose를 사용한 개발 환경 구축, Travis CI를 이용한 CI/CD 파이프라인 구축, Kubernetes를 이용한 로컬 디버깅, GKE를 사용한 Kubernetes 프로덕션 환경 구축을 컨테이너에 대한 기본 지식 없이도 처음부터 따라올 수 있도록 작성해보려합니다

Container 란?

Docker가 무엇인지 알려면 먼저 Container를 먼저 이해해야 합니다. 컨테이너는 프로그램을 빌드/실행할 때 그 어떤 기기에서든 똑같은 환경을 조성할 수 있도록 도와주는 패키징 서비스입니다. Container엔 프로그램을 실행할 때 필요한 모든 것들이 전부 정의되어있습니다. 예를 들어 nodeJS 애플리케이션을 컨테이너화한다면 nodeJS 프레임워크를 컨테이너에 설치하고 소스코드를 로컬 폴더에서 컨테이너로 옮긴 다음에 내부적으로 빌드를 하고 테스트를 하며 소스코드를 실행하는 과정이 처음부터 모두 스크립트로 짜여있습니다. 그러므로 컨테이너를 빌드 하여 다른 환경에 배포를 하게 될 경우 로컬에서 개발하여 빌드 했던 이미지가 그대로 실행이 되기 때문에 환경이 변경될 때마다, 새로운 dependency들이 생길 때마다 서버에서 추가적인 설치작업, 환경에 따른 추가설정을 최소화할 수 있습니다. 쉽게 말하면 Virtual Box 같은 소프트웨어에서 snapshot을 생성한 다음 다른 환경에서 restore 하는 것과 비슷하다고 보셔도 될 것 같습니다. (container는 가상화보다 더욱 효율적이고 가벼운 패키징을 하기 때문에 가상화라고 볼 수는 없습니다. 하지만 현재 맥락에선 비슷하다고 보셔도 됩니다.)

컨테이너 구조

Docker는 Container 서비스의 한 종류로 여러 가지 다른 서비스들과의 경쟁에서 살아남아 이제는 소프트웨어 업계에서 인더스트리 스탠더드로 자리 잡았습니다. 그 결과 docker compose, docker swarm (모두 같은 회사 프로덕트), kubernetes (구글이 제작했으나 현재 오픈소스 파운데이션 CNCF 소유) 같은 Docker를 효율적으로 사용할 수 있는 툴들도 많이 제작되어 빠른 발전 끝에 첨단의 최전방에 있던 기술이 이제는 위에 말한 다른 기술들의 기반을 다져주는 서비스가 되었습니다.

컨테이너 구조

Docker가 작동하는 개념은 하이레벨에선 굉장히 간단합니다. 호스트의 운영제 제 위에 Docker 레이어를 올리고 그 위에 컨테이너 화해 패키징 된 더 커 앱들을 얹히게 됩니다. 이때 가상화 프로세스와는 달리 컨테이너의 경우 리눅스의 namespace를 사용하여 하나의 linux kernel로 여러 개의 운영체제를 운영할 수 있습니다. 그렇기 때문에 한번 시작을 하려면 5분 이상이 걸리는 가상화와 달리 Docker 컨테이너는 캐싱이 되어있는 경우 10초 안에도 시작이 가능합니다. 실제로 Kubernetes의 경우 이런 효율성을 적극 활용하여 컨테이너에서 에러가 나거나 health check를 패스하지 못할 경우 그냥 컨테이너를 삭제하고 새로 띄워버립니다. 어차피 별로 공이 안 드는 프로세스이기 때문이죠.

Docker의 편의성과 효율 때문에 벌써 많은 서비스들이 적극적으로 Docker를 도입하고 있고 Docker 때문에 가능해진 서비스들도 존재합니다. 대표적인 예로 Circle CI 나 Travis CI 같은 CI/CD 파이프라인 툴 들이죠. 각각 CI 툴들의 스키마대로 프로세스를 작성을 해두면 GitHub에 푸시를 하는 순간 플랫폼에서 Docker 컨테이너를 제작해내어 그 환경 안에서 CI/CD 파이프라인을 돌리게 됩니다. 이럴 경우 플랫폼의 광대한 서버에서 각각 프로세스들을 분리하는데도 편리하고 가용 리소스의 최대치를 꽉 채워 사용할 수 있기 때문에 비즈니스모델적인 부분에서도 효율이 좋다고 볼 수 있겠습니다.

추가적으로 어찌 보면 Microservice에 대한 인식과 중요성이 이렇게까지 대중화가 된 게 Docker 때문이라고 볼 수도 있습니다. 클라우드의 엔트리 레벨 가격이 갈수록 싸지면서 Vertical Scaling (가상 또는 물리 기기의 스펙을 올려서 스케일링) 보다 Horizontal Scaling (같거나 다른 가상 또는 물리 기기를 새로 생성하여 스케일링) 이 점점 더 유리해지고 있기 때문에 많은 회사들이 Horizontal Scaling을 하기 쉬운 Docker 컨테이너를 아키텍처의 기반으로 채택하고 있습니다. 위에 말씀드린 부분을 적용을 하면 새로운 서버를 트래픽에 따라 유연하게 증설하고 줄일 때 생성 속도가 빠르고 배포 자동화가 가능한 Docker가 다른 방법들보다 절대적으로 유리하기 때문이지요.

이 외에도 Docker의 장점들은 수도 없이 많지만 역시 프로그래밍은 실전이기에 빨리 다음 장으로 넘어가 Docker의 기본부터 익혀보도록 하겠습니다.

©Code Factory All Rights Reserved