마이크로서비스를 안정적으로 유지하려면 이식성 문제, 즉 마이크로서비스를 다른 기술 환경에서도 실행할 수 있는 방안을 마련해야 한다. 이식성(portability)은 소프트웨어를 다양한 환경으로 이동하거나 그 환경에서 활용할 수 있는 능력을 의미한다.
컨테이너를 활용하면 소프트웨어를 한 플랫폼에서 다른 플랫폼으로 신속하고 효율적으로 이전하고 실행할 수 있다. 전통적인 웹 서버 모델을 보다 작은 규모의 유연한 가상화된 소프트웨어 컨테이너로 대체할 수 있으며, 컨테이너는 마이크로서비스에 속도, 이식성, 확장성 등의 장점을 제공한다.
도커 (Docker)는 주요한 클라우드 공급자 모두와 호환되는 기술이다.
4.1 컨테이너 또는 가상 머신?
여전히 많은 기업에서 가상 머신 (VM)은 소프트웨어 배포를 위한 표준으로 사용된다.
VM(가상 머신)은 하나의 컴퓨터에서 다른 컴퓨터의 동작을 에뮬레이션할 수 있는 소프트웨어 환경으로, 하이퍼바이저(hypervisor)라는 기술을 통해 물리적 머신을 완전히 에뮬레이션한다. 하이퍼바이저는 시스템 메모리, 프로세서 코어, 디스크 스토리지, 네트워크, PCI 애드온 등 다양한 자원을 할당하는 역할을 한다. 반면, 컨테이너는 애플리케이션과 그 의존성들을 격리된 독립적인 환경에서 실행할 수 있도록 패키징한 가상화된 운영 체제(OS)이다.
이 두 기술은 하이퍼바이저나 컨테이너 엔진과 같은 구동 역할을 하는 구성 요소가 있다는 점에서 유사하지만, 각 기술의 구현 방식은 매우 다르다.
VM에서는 필요한 물리적 자원의 양을 미리 설정해야 한다. 예를 들어, 사용할 프로세서 수, RAM 용량, 디스크 공간(GB) 등을 결정해야 한다. 이러한 값을 설정하는 과정은 복잡할 수 있으며, 이를 설정할 때 몇 가지 중요한 요소를 신중히 고려해야 한다.
- 프로세스는 서로 다른 VM 간에 공유될 수 있다.
- VM의 디스크 공간은 필요한 만큼만 사용할 수 있도록 설정할 수 있다. 디스크의 최대 크기는 정의할 수 있지만, 시스템에서는 실제로 사용되는 공간만 차지하게 된다.
- 예약 메모리는 총 메모리이며 VM 간 공유되지 않는다.
컨테이너에서 쿠버네티스를 사용할 때, 메모리와 CPU를 설정할 수 있지만 이는 필수 사항은 아니다. 만약 이러한 값을 지정하지 않으면, 컨테이너 엔진은 컨테이너가 정상적으로 작동할 수 있도록 필요한 자원을 자동으로 할당한다. 컨테이너는 기본 운영 체제를 공유할 수 있어 전체 OS를 필요로 하지 않으며, 그 결과 물리적 머신에 가해지는 부하가 줄어들고, 사용되는 스토리지 공간과 애플리케이션 시작 시간이 감소한다. 이로 인해 컨테이너는 VM보다 훨씬 더 가볍다.
결국, 두 기술은 각기 다른 장단점을 가지고 있으며, 선택은 요구 사항에 따라 결정된다. 예를 들어, 다양한 운영 체제를 처리하거나 하나의 서버에서 여러 애플리케이션을 관리하며, OS 기능이 필요한 애플리케이션을 실행하려면 VM이 더 적합한 해결책이 될 것이다.
성능(performance)과 이식성(portability)은 기업의 의사 결정에서 핵심적인 개념이다. 따라서 어떤 기술을 선택할지 그 이점을 이해하는 것이 중요하다. 마이크로서비스와 컨테이너를 함께 사용하면 다음과 같은 장점을 누릴 수 있다.
- 컨테이너는 어디에서나 실행할 수 있어 개발 및 구현이 용이하고 이식성을 높여준다.
- 컨테이너는 다른 애플리케이션과 완전히 격리된 예측 가능한 환경을 생성해 주는 기능을 제공한다.
- 컨테이너는 VM보다 더 빠르게 시작하고 중지할 수 있어 클라우드 네이티브가 가능하다.
- 컨테이너는 확장성이 뛰어나고 자원 활용을 최적화하는 데 유리하며, 능동적인 스케줄링과 관리가 가능하다. 이를 통해 컨테이너 내에서 실행되는 애플리케이션의 성능과 유지 보수성을 향상시킬 수 있다.
- 최소 서버로 가능한 많은 애플리케이션을 실행할 수 있다.
4.2 도커란?
도커는 2013년 3월, dotCloud의 창립자이자 CEO인 솔로몬 하이닉스가 개발한 리눅스 기반의 오픈 소스 컨테이너 엔진으로, 현재 널리 사용되고 있다. 처음에는 애플리케이션 내에서 컨테이너를 시작하고 관리하는 데 필요한 기술로 시작되었으며, 이를 통해 VM 등의 하드웨어 자원 없이 물리적인 머신의 자원을 여러 컨테이너가 공유할 수 있게 되었다.
IBM, 마이크로소프트, 구글 등 대기업의 지원 덕분에 도커는 개발자들의 필수 도구로 자리 잡을 수 있었다. 오늘날 도커는 계속해서 발전하고 있으며, 현재는 컨테이너화된 소프트웨어를 서버에 배포하는 데 널리 사용되는 주요 도구 중 하나로 자리매김하고 있다.
컨테이너 (container)는 애플리케이션을 실행하는데 필요한 모든 것을 제공하는 논리적 패키징 매커니즘을 의미한다.
도커의 동작 방식을 제대로 이해하려면, 도커 엔진(Docker Engine)이 도커 시스템의 중심 역할을 한다는 점을 알아야 한다. 도커 엔진은 클라이언트-서버 아키텍처를 기반으로 하는 애플리케이션으로, 호스트 머신에 설치되며, 서버, REST API, 명령줄 인터페이스(CLI)라는 세 가지 주요 구성 요소를 갖추고 있다.
- 도커 데몬 (Docker daemon): 도커 이미지를 생성하고 관리하는 docker라는 서버다. REST API가 데몬에 명령을 보내고 CLI 클라이언트가 도커 명령을 입력한다.
- 도커 클라이언트 (Docker client):
- 도커 레지스트리 (Docker registry):
- 도커 이미지 (Docker images):
- 도커 컨테이너 (Docker containers):
- 도커 볼륨 (Docker volumes):
- 도커 네트워크 (Docker networks):
데몬은 클라이언트로부터 명령을 받아 CLI나 REST API를 통해 해당 명령을 전달한다. 또한, 레지스트리가 찾은 도커 이미지는 컨테이너를 생성하는 방법을 정의한다.
4.3 도커 파일
도커 파일 (Dockerfiles)은 도커 클라이언트가 이미지를 생성하고 준비하는 데 필요한 지시어(instructions)와 명령어(commands)가 포함된 간단한 텍스트 파일이다. 이 파일은 이미지 생성 과정을 자동화하며, 도커 파일에서 사용되는 명령어들은 리눅스 명령어와 유사하여 도커 파일을 이해하기 쉽게 만든다.
4.4 도커 컴포즈
도커 컴포즈(Docker Compose)는 서비스 설계와 구축을 용이하게 해주는 스크립트를 작성하여 도커 사용을 더 간편하게 만든다. 도커 컴포즈를 사용하면 여러 컨테이너를 하나의 서비스로 실행하거나, 다양한 컨테이너를 동시에 생성할 수 있다.
- 도커 컴포즈 설치. Install Docker Compose / Docker Documentation을 참조
- YAML 파일을 생성하여 애플리케이션 서비스를 구성. (파일명은 docker-composet.yml이 되어야 한다.)
- docker-compose config 명령을 사용하여 파일 유효성 확인
- docker-compose up 명령을 사용하여 서비스 시작
4.5 마이크로서비스와 도커 통합하기
※ 예제 및 예제 설명 생략
'스프링 마이크로서비스' 카테고리의 다른 글
6장. 서비스 디스커버리 (2) | 2024.12.12 |
---|---|
5장. 스프링 클라우드 컨피그 서버로 구성 관리 (0) | 2024.12.12 |
3장. 스프링 부트로 마이크로서비스 구축하기 (1) | 2024.12.10 |
2장. 스프링 클라우드와 함께 마이크로서비스 세계 탐험 (4) | 2024.12.10 |
1장. 스프링, 클라우드와 만나다 (4) | 2024.12.09 |