[#1] Docker 란?

Written by 코드팩토리 JC

1월 15, 2024

코드팩토리 Docker 부터 Kubernetes 까지

서론

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의 기본부터 익혀보도록 하겠습니다.

관련 포스트

플러터에서의 Immutable Programming: copyWith 함수 마스터하기!

플러터에서의 Immutable Programming: copyWith 함수 마스터하기!

서론 불변 프로그래밍: 현대 개발의 핵심 현대 소프트웨어 개발에서 불변 프로그래밍(Immutable Programming)의 중요성은 간과할 수 없는 요소입니다. 플러터(Flutter)에서도 마찬가지로 불변 프로그래밍 개념이 매우 중요하며, copyWith 함수는 이러한 불변성을 유지하는 데 핵심적인 역할을 합니다. 이 글에서는 플러터를 배우기 시작하는 개발자들에게 불변 프로그래밍의 중요성을 강조하고, copyWith 함수의 역할과 사용 방법에 대해 설명 해보겠습니다!...

ChatGPT가 이야기하는 2024년 개발자 로드맵

ChatGPT가 이야기하는 2024년 개발자 로드맵

서론 개발자의 여정을 시작하며 안녕하세요, 미래의 개발자 여러분! 오늘부터 시작하는 여러분의 개발 여정에 함께할 수 있어서 기쁩니다. 2023년은 기술이 매우 빠르게 변화하는 해였으며, 이러한 변화 속에서 개발자가 되기 위한 길은 더욱 다채롭고 흥미로워졌습니다. 이 로드맵은 초보자인 여러분이 개발의 세계에 첫발을 내딛는 데 필요한 기초부터 시작해, 점차 심화 단계로 나아가는 길을 안내해 드릴 것입니다. 백엔드 개발 이 글은 단순히 기술을 배우는 것 이상의 의미를 가집니다....

Flutter Freezed 플러그인! Entity Code Generation은 이거 하나로 끝!

Flutter Freezed 플러그인! Entity Code Generation은 이거 하나로 끝!

https://youtu.be/i5p6wXLAX7I 서론 Flutter 는 Code Generation 기능이 상당히 많이 활성화되어 있어요. 흔히들 많이 사용하는 json_serializable 라이브러리도 있고 retrofit 및 chopper 라이브러리도 있습니다. 오늘 알려드릴 freezed 또한 데이터 클래스에 편의 기능들을 제공해주는 code generation 라이브러리입니다. Freezed vs Json Serializable Code Generation 이라는...