배경
하나의 호스트 OS에서 컨테이너가 많아지게 되면 CPU, 메모리, 디스크 용량 등과 같은 자원이 부족하게 됩니다. 이를 해결하기 위해선 어떻게 할까요? 크게 scale up과 scale out 방법이 떠오릅니다. scale up의 경우엔 하나의 서버 자체의 크기를 키우는 것이고, scale out은 여러대의 서버를 운영하게 하는거죠. 보통 scale out을 많이 사용한다고 알려져있는데 이때 클러스터라는 개념이 등장합니다. 클러스터란 각기 다른 서버들을 하나로 묶어 하나의 시스템같이 동작하게 만들어 클라이언트들에게 고가용성의 서비스를 제공하는 것을 말합니다. 하지만 서버 등록은 어떻게 할건지, 어떠한 서버에 어떠한 작업을 할당할건지 등과 같은 처리해야 될 작업이 증가하게 됩니다. 이때 나오게 된 것이 도커 스웜이라는 것이죠
내용
도커 스웜은 스웜모드를 지원합니다. 스웜모드란 MSA container를 다루기 위한 클러스터링 기능에 초점을 맞춰 필요에 따라 유동적으로 container 수를 조절합니다. 또한 로드밸런싱 기능을 자체적으로 가지고 있습니다.(scale out에 대한 것은 개발자가 직접 설정해야 합니다)
그림을 보시게 되면 도커 스웜모드는 크게 매니저 노드와 워커 노드로 나누어져 있습니다. 워커 노드는 실제로 컨테이너가 생성되고 관리되는 도커 서버이고, 매니저 노드는 워커 노드를 관리하기 위한 노드지만 기본적으로 워커 노드의 역할을 포함하고 있습니다.
클러스터 구축은 어떻게 할까요? aws ec2를 예로 들면 여러개의 인스턴스를 만들어서 docker swarm join을 통해 구축이 가능합니다.
이렇게 서비스를 구성하게 됩니다. 일반적인 도커 명령어의 제어 단위는 컨테이너가 되겠지만, 도커 스웜에서 제어 단위는 서비스(인스턴스)가 됩니다. 서비스는 같은 이미지에서 생성된 컨테이너의 집합을 의미합니다.
서비스를 제어하게 되면 해당 서비스 내의 컨테이너에 같은 명령이 수행되고 task를 할당할 적합한 노드를 선정하게 됩니다.
만약 워커 노드에 장애가 발생하게 되면 어떻게 될까요? 스웜은 서비스 task(container)에 대한 상태를 계속 확인하다가 서비스 내에 정의된 replica 수만큼 노드가 존재하지 않으면 새로운 task replica를 생성합니다.아래 그림과 같은 모습이 되겠죠.
하지만 매니저 노드에 장애가 발생하면 클러스터가 사라져버리게 되니 매니저 노드도 여러개 준비를 시켜 놓는 것이 좋습니다.
스웜 모드는 도커 엔진의 역할과 비슷한 기능을 합니다. 클러스터관리, 서비스관리, 네트워크관리, 노드관리 등... 컨테이너 단위에서 서비스 단위로 바뀐것 뿐이죠.
도커 스웜은 배경에서 살짝 언급했듯이 서비스를 구축할 때 클러스터 개념이 등장하면서 효율적으로 관리 하기 위해 만들어진겁니다. 즉, 도커 스웜은 서비스의 확장과 관리를 편하게 하기 위해 도입된 것입니다. 서비스를 운영하기 위해서 container가 한두개가 아닌, 여러개가 필요해진다면 컨테이너를 클러스터 단위로 묶어서 한번에 관리하는게 훨씬 편하고 좋죠. 이와 비슷한 것이 docker compose 입니다. docker compose도 여러개의 컨테이너를 하나의 서비스로 정의해서 관리할 수 있게 해주죠. 같은 네트워크에 묶인다면 서비스 디스커버리도 자동적으로 이루어지게 됩니다.
docker compose는 container 설정이 정의된 yml 파일을 읽어 도커 엔진을 통해 컨테이너를 생성하게 됩니다. 도커 컴포즈는 기본적으로 yml파일이 위치한 디렉토리 이름을 프로젝트 이름으로 사용합니다.
docker compose 사용의 이유는 컨테이너의 생성을 편리하게 하기 위함입니다. yml 파일에 여러개의 컨테이너에 대한 설정을 미리 해주고 docker-compose up을 통해 간단히 여러개의 컨테이너를 생성할 수 있죠. k8s(쿠버네티스)는 이러한 것들을 효율적으로 사용할 수 있게 해주는 기술이기 때문에 추후 학습에 도움이 될 것이라고 생각합니다. 다음에 기회가 되면 쿠버네티스에 대해 간단히 알아보도록 하죠! 감사합니다.
참고
'개발 > docker' 카테고리의 다른 글
docker compose에서 health check를 활용한 spring boot app 띄우기 (3) | 2024.12.19 |
---|---|
docker란? (1) | 2024.12.05 |