📢 프로젝트에서 사용한 도커스웜과 관련된 용어, 특징 들을 정리 해보자!
도커 스웜(Docker Swarm)은 도커의 클러스터 관리 기능으로, 여러 대의 도커 호스트를 마치 하나의 호스트처럼 사용할 수 있게 해주는 도구이다. 도커 스웜의 주요 구성 요소로는 매니저 노드(Manager Node) 와 워커 노드(Worker Node)가 있다.
이렇게, 매니저 노드가 여러개인 경우 멀티-마스터 클러스터
라고 하며 쿠버네티스에서도 마찬가지이다.
👉 쿠버네티스에서는 매니저 노드 대신에 마스터 노드를 사용한다. 자세한 내용은 [ All about 쿠버네티스 ] 게시글에서 확인하자!
👉 또한, 쿠버네티스와의 차이점에 대해 알고 싶다면 [ 컨테이너 오케스트레이션 (Docker Swarm, Kubernetes) ] 게시글에서 확인하자!
도커 스웜의 오버레이 네트워크(Overlay Network)는 여러 도커 데몬(Docker Daemon)이나 클러스터 노드 간에 통신을 가능하게 하는 네트워크 모델이다. 오버레이 네트워크를 사용하면 여러 분산된 컨테이너 간에도 마치 같은 물리적 네트워크에 연결된 것처럼 통신할 수 있다.
오버레이 네트워크는 물리 네트워크 위에 가상 네트워크 계층을 추가함으로써 작동한다. 이를 통해 각 컨테이너는 독립적인 네트워크 네임스페이스(Network Namespace)를 가질 수 있으며, 이는 컨테이너가 독립적인 IP 주소, 서브넷, 라우팅 테이블 등을 가질 수 있음을 의미한다.
오버레이 네트워크는 도커 스웜 모드에서 서비스를 생성할 때 사용할 수 있으며, 이를 통해 여러 노드에 분산된 컨테이너 간에 간편하게 통신할 수 있다. 이는 마이크로서비스 아키텍처를 구현하거나, 다른 호스트에 있는 컨테이너와 통신해야 하는 여러 상황에서 유용하다.
👉 도커스웜의 네트워크에 대해서는 [ Docker Swarm Network 종류 ] 게시글에서 확인하자!
서비스는 단일 도커 이미지 기반으로 클러스터 안에서 구동시킬 컨테이너 묶음을 의미한다. 도커(Docker)의 기본 배포 단위가 컨테이너였다면, 도커 스웜(Docker Swarm)의 기본 배포 단위는 서비스(Service)다.
서비스는 도커 이미지, 실행할 명령, 포트, 볼륨, 패스워드 등을 포함한 컨테이너의 스펙을 정의하고, 어떤 노드에서 해당 컨테이너를 실행할 것인지 결정하는 역할을 한다. 또한, 서비스는 레플리카의 개수를 정의하여, 같은 컨테이너를 여러 개 실행할 수 있게 한다.
서비스(Service)의 명세에 따라 생성되어 클러스터 노드에 배치되는 개별 컨테이너의 배포 단위는 태스크(Task)
다.
도커 스웜에서 레플리카(replica)는 특정 서비스의 인스턴스를 가리킨다. 서비스를 생성하거나 업데이트할 때, 해당 서비스의 레플리카 수를 지정할 수 있다.
레플리카 수는 서비스의 복제본을 몇 개 실행할지를 결정하는데, 이를 통해 서비스의 규모를 조정하거나 고가용성을 확보할 수 있다. 예를 들어, 레플리카 수를 5로 설정하면, 스웜은 해당 서비스의 5개 복제본을 클러스터 내의 사용 가능한 노드에 분산하여 실행한다. 또 매니저노드에서만 또는 워크노드에서만 레플리카를 복제하도록 설정하는 것도 가능하다.
또한, 도커 스웜은 레플리카의 상태를 모니터링하며, 레플리카가 실패하거나 노드에 문제가 발생하면 자동으로 레플리카를 재시작하거나 다른 노드에 레플리카를 재배치한다. 이를 통해 서비스의 안정성과 가용성을 보장한다.
❗ 쿠버네티스에서는 파드와 레플리카셋이라는 개념이 있다. 비슷한 듯 하면서 다르다. 파드는 하나 이상의 컨테이너를 묶은 단위로, 이 컨테이너들은 같은 네트워크와 스토리지 공간을 공유한다. 또한, "레플리카셋(ReplicaSet)"이라는 개념을 통해 파드의 복제본을 관리하고, 일정 수의 파드가 항상 실행되도록 보장한다.
👉 자세한 내용은 [ All about 쿠버네티스 ] 게시글에서 확인하자!
도커스웜은 개발자나 관리자가 빠르고 쉽게 컨테이너화된 애플리케이션의 배포와 관리를 시작할 수 있도록 사용자 친화적인 특징들이 있다.
자동 분산 배포(Automatic Distribution and Deployment) 기능은 서비스를 클러스터의 노드들에 자동적으로 분산시키는 역할을 한다. 이 기능은 높은 가용성과 효율적인 리소스 사용을 지원하며, 사용자는 레플리카의 배포 위치나 상태 관리 등에 대해 신경 쓸 필요 없이, 원하는 서비스의 스케일을 지정하고 실행만 하면 된다.
도커 스웜은 서비스의 복제본(replica) 수를 쉽게 조정할 수 있다. 이를 통해 서비스의 규모를 증가시키거나 축소시키는 것이 가능하다.
도커 스웜은 서비스의 복제본(replica) 중 하나가 실패하면 자동으로 복구한다. 이를 통해 서비스의 안정성을 보장한다.
도커 스웜은 클러스터 내의 요청을 자동으로 분산시켜 주는 내장형 로드 밸런서 기능을 가지고 있다. 이를 통해 트래픽을 여러 서비스간에 골고루 분산시킬 수 있다.
도커 스웜은 DNS를 이용한 서비스 발견 기능을 제공한다.
DNS(Domain Name System)는 컨테이너 간의 네트워크 통신을 용이하게 하기 위한 시스템으로, 컨테이너의 IP 주소 대신에 이름을 사용하여 컨테이너를 찾는 기능을 제공한다.
도커 스웜 모드에서, 서비스의 모든 인스턴스(레플리카)는 같은 DNS 이름을 공유한다. 이 이름은 클라이언트 애플리케이션에서 서비스를 찾는 데 사용된다. DNS 요청이 서비스의 이름으로 수행되면, 요청은 서비스의 모든 작업 사이에서 로드 밸런싱된다.
그렇기에 Eureka와 같은 서비스 디스커버리를 사용하지 않고도 서비스명으로 서비스를 찾아갈 수 있다. 다만, 도커 스웜에서 DNS를 이용하여 서비스를 찾는 경우, 서비스가 사용하는 포트 번호를 알아야 한다. DNS는 서비스의 이름을 IP 주소로 변환해주는 역할을 하지만, 해당 서비스가 특정 포트에서 동작하는지에 대한 정보는 제공하지 않기 때문이다.
docker service update
라는 명령어를 통해 쉽게 롤링 업데이트를 수행할 수 있다.
docker service update 명령으로 서비스를 업데이트하면, 도커 스웜은 서비스의 모든 레플리카(인스턴스)를 새 버전으로 순차적으로 업데이트한다. 이 과정에서 서비스의 중단 없이 새 버전으로의 전환을 가능하게 하는 것이 바로 롤링 업데이트이다.
또한, docker service update 명령에는 다양한 옵션을 추가할 수 있다. 예를 들어, --update-delay 옵션으로 레플리카 간의 업데이트 간격을 조정하거나 --update-parallelism 옵션으로 동시에 업데이트할 레플리카의 수를 지정할 수 있다.
👉 롤링 업데이트의 자세한 내용은 [ 무중단 배포 아키텍처 및 전략 ] 게시글에서 확인하자!