[Docker] 도커 스웜 = 분산 시스템 구축 도우미?
- -
이전 포스팅에서 스파크 기본 이론에 대해 다뤄놓고 갑자기 도커?라고 생각할 수 있다.
하지만 이 글을 다 읽고 나면, 아 이래서 도커 스웜을 다뤘구나~
라고 이해하게 될 것이다.
아직 스파크 기본 개념에 대한 포스팅을 못 본 분들은 여기..
TODO list
- 도커 스웜과 도커 컴포즈의 차이
- 도커 스웜의 개념
- 도커 스웜 세팅법 (포트 개방 매니저 연결)
- 도커 서비스 배포 (service create, stack 배포)
- 마무리
1. 도커 스웜과 도커 컴포즈의 차이
도커 스웜 (Docker Swarm)은 이름에서도 알 수 있듯,
docker = 도커 컨테이너
swarm = '무리' or '집단'
즉, 컨테이너 집단을 관리하는 것을 의미한다.
'그럼 도커 컴포즈랑 다를게 뭐야?'
예전 포스팅에서 잠깐 다뤘지만, 다시 리마인드하자면,
도커 컴포즈는 여러 종류의 컨테이너를 올리기 위해 필요한 의존성, 변수 등을 쉽게 관리하면서 올리기 위한 기법이다.
'여러 컨테이너'를 쉽게 올리기 위한 방법
여기까지만 보면 컨테이너 집단을 관리하는거랑 일맥상통하는거 아닌가?라고 생각이 들 수 있다.
하지만 도커 컴포즈와 도커 스웜의 가장 큰 차이점은
여러개의 컨테이너를 하나의 컴퓨터에서 관리한다 -> 도커 컴포즈
여러개의 컨테이너를 여러개의 컴퓨터에 분산하여 관리한다 -> 도커 스웜
즉, 통합된 환경이냐 분산된 환경이냐의 차이이다.
참고 : https://9unu.tistory.com/22
[Docker] 도커 컴포즈? 그냥 컨테이너 동시에 올리는거 아니야?
이전 포스트에서 도커 이미지를 빌드하고 실행(컨테이너화)하는 방법에 대해 알아보았다.이번에 설명할 도커 기능은 도커 컴포즈이다.이전과 마찬가지로 도커 컴포즈에 대해 공부하기 전에, 먼
9unu.tistory.com
2. 도커 스웜의 개념
정석적인 개념을 말하자면, 도커에서 만든 오케스트레이션 툴이다.
"오케스트레이션이 뭔데?"
오케스트레이션은 말 그대로 '여러 악기를 지휘하는 것'처럼 여러 컨테이너를 조율하는 것을 의미한다.
더 자세히 말하자면, 여러 서버에 분산된 컨테이너들이 명령에 맞춰 꺼지고, 켜지면서 관리되는 것이다.
즉, 도커 스웜은 여러 컴퓨터에 도커 컨테이너를 분산 배포하고 관리하는 도구라고 생각하면 된다.
도커 스웜의 주요 특징은 다음과 같다.
- 분산 아키텍처: 여러 노드(서버)에 컨테이너를 분산 배치
- 고가용성: 한 노드가 다운되더라도 다른 노드에서 서비스 유지
- 자동 복구: 컨테이너나 노드에 장애가 발생하면 자동으로 복구
- 부하 분산: 여러 노드에 작업을 고르게 분배
- 확장성: 노드 추가/제거를 통한 손쉬운 확장
도커 스웜의 구성 요소
도커 스웜은 크게 매니저 노드(Manager Node)와 워커 노드(Worker Node)로 구성된다.
- 매니저 노드: 클러스터 상태 관리, 워커 노드 제어, 작업 스케줄링
- 워커 노드: 실제 컨테이너가 실행되는 노드
약간의 사담을 추가하자면,
나는 도커 스웜을 크롤러 여러대를 한번에 띄우기 위해 도입했다.
데이터 수집 범위를 늘리다보니, cpu 자원, 메모리 모두 부족해서 차라리 저렴한 VM 인스턴스 여러개를 띄우자는 생각으로 접근했는데,
지금와서 생각하면 행운이었던 것 같다. (분산 시스템에 대해 한번에 감을 잡게 되어서..ㅎㅎ)
3. 도커 스웜 세팅법
도커 스웜을 세팅하는 방법은 생각보다 간단하다. 하지만 그전에 포트 개방부터 해결해야 한다.
3.1 포트 개방
도커 스웜이 정상적으로 동작하기 위해서는 다음 포트를 개방해야 한다.
매니저 노드 포트:
- TCP 2377: 클러스터 관리 통신
- TCP/UDP 7946: 노드 간 통신
- UDP 4789: 오버레이 네트워크 트래픽
워커 노드 포트:
- TCP/UDP 7946: 노드 간 통신
- UDP 4789: 오버레이 네트워크 트래픽
클라우드 서비스(AWS, GCP 등)를 이용중이라면 보안그룹/방화벽 설정에서 위 포트들을 추가해주면 되고, 웬만하면 내부 IP로 통신할거라서 별다른 설정이 필요없다.
하지만 본인은 매니저 노드는 홈서버, 워커 노드는 GCP 서버에 구성해서 관리중인데,
이거 구현하기까지 진짜 골아픈 작업이었다. 스파크 포스팅 완료되면 하나씩 풀 예정인데, 진짜 골아팠다. (MTU부터 하트비트까지...)
3.2 스웜 초기화
암튼, 이제 매니저 노드에서 스웜을 초기화해보자.
먼저 매니저로 사용할 서버에 접속해서 다음 명령어를 입력한다:
docker swarm init --advertise-addr [매니저_IP_주소]
예를 들면:
docker swarm init --advertise-addr 123.456.7.89
이 명령어를 실행하면 다음과 같은 출력이 나온다:
docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 123.456.7.89:2377
이 출력을 그대로 복사해서 워커 노드에서 실행하면 된다.
3.3 워커 노드 추가
위에서 확인한 join
명령어를 실행하기만 하면 된다:
docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 123.456.7.89:2377
성공하면 다음과 같은 메시지가 표시된다:
This node joined a swarm as a worker.
워커 노드를 빼낼 때는
docker swarm leave
3.4 노드 확인
매니저 노드에서 다음 명령어로 스웜에 참여한 노드 목록을 확인할 수 있다:
docker node ls
출력 예시:
gunu@gunu-samsung:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
3ggn0dtlpfpb9843g7tq1234 crawler-worker-1 Ready Active 28.1.1
n1wjdfubh0tjspdaq67jf1234 crawler-worker-2 Ready Active 28.1.1
86qqtzmgqnkiqyudihz441234 crawler-worker-3 Ready Active 28.1.1
ahk843imz797rh9ebr17c1234 * gunu-manaver Ready Drain Leader 28.0.4
이렇게 하면 도커 스웜 클러스터 세팅 완료!
4. 도커 서비스 배포
도커 스웜에서는 서비스라는 개념으로 컨테이너를 배포한다.
"서비스가 뭔데?"
서비스는 같은 이미지에서 생성된 여러 컨테이너의 집합으로, 하나의 논리적 단위로 관리된다.
예를 들어, 웹 애플리케이션을 5개의 컨테이너로 분산 실행할 때, 이 5개의 컨테이너를 하나의 서비스로 관리하는 것이다.
4.1 서비스 생성 (service create)
가장 기본적인 서비스 배포 방법은 docker service create
명령어를 사용하는 것이다:
docker service create --name [서비스명] --replicas [복제본수] [이미지명]
예시:
docker service create --name multi_naver_flights --replicas 6 crawler_image:latest
이 명령어는 crawler_image:latest
이미지를 사용해 6개의 컨테이너를 생성하고, 이들을 multi_naver_flights
라는 이름의 서비스로 관리한다.
(도커 스웜이 아니었다면 모든 서버에서 각각 컨테이너를 2개씩 올리거나 했어야 했을 것이다....귀찮게....)
4.2 스택 배포 (stack deploy)
여러 서비스를 한번에 배포하려면 도커 컴포즈 파일을 활용해 스택을 배포할 수 있다:
docker stack deploy -c [컴포즈파일경로] [스택명]
예시:
docker stack deploy -c docker-compose.yml spark-stack
이 방법은 복잡한 애플리케이션을 구성하는 여러 서비스를 선언적으로 관리할 수 있어 매우 편리하다.
컴포즈 파일 작성 방법은 다음 포스팅에서 스파크 클러스터 배포를 설명하면서 자세히 다룰 예정이다.
4.3 기본 명령어
서비스를 관리하기 위한 몇 가지 유용한 명령어들:
서비스 목록 확인:
docker service ls
서비스 상세 정보 확인:
docker service ps [서비스명]
서비스 로그 확인:
docker service logs [서비스명]
서비스 확장/축소:
docker service scale [서비스명]=10
서비스 삭제:
docker service rm [서비스명]
5. 마무리
이번 포스팅에서는 도커 스웜의 개념과 기본 세팅 방법에 대해 알아봤다.
- 도커 스웜은 여러 컴퓨터에 도커 컨테이너를 분산 배포하고 관리하는 도구다.
- 도커 컴포즈가 하나의 컴퓨터에서 여러 컨테이너를 관리한다면, 도커 스웜은 여러 컴퓨터에 분산된 컨테이너를 관리한다.
- 도커 스웜을 세팅하려면 매니저 노드에서 초기화하고, 워커 노드에서 조인하면 된다.
- 서비스는 같은 이미지에서 생성된 여러 컨테이너의 집합으로,
docker service create
명령어로 생성할 수 있다. - 복잡한 애플리케이션은 도커 컴포즈 파일을 활용한 스택 배포로 관리할 수 있다.
이처럼 도커 스웜을 활용하면 여러 서버에 애플리케이션을 손쉽게 분산 배포할 수 있다. 이는 빅데이터 처리와 같이 대용량 데이터를 다루는 작업에 특히 유용하다.
근데 이쯤 되면 한가지 떠오르지 않나?
매니저와 워커?
스파크???
스파크에서의 명명은 마스터지만, 어찌됐건 하나의 매니저가 여러 워커에 작업을 뿌리는 구조.
도커 스웜에 딱맞는 프레임워크인 것이다.
그럼 이제 도커 스웜을 활용해서 스파크 클러스터 구현부터 pyspark 활용까지 달려봅시다..ㅎㅎ
"언제나, 이 세상 어딘가에 있는 나같은 사람을 위해 족적을 남긴다."
ㄱㅊㅁ_ㅇㅈ
'데이터 엔지니어링 > 기술스택 및 알쓸신잡' 카테고리의 다른 글
[Spark] 로컬 환경 구축하기! (0) | 2025.05.08 |
---|---|
[Spark] 도커 스웜으로 스파크 클러스터 구축하기! (0) | 2025.05.08 |
[Spark] 스파크...왜 쓰는걸까? (하둡부터 스파크까지) (0) | 2025.05.07 |
[Airflow] 커스텀 센서 구현하기! (Redis key value sensor) (0) | 2025.05.07 |
[Redis] 레디스 MQ 구현 및 활용법! (Python, Docker) (0) | 2025.05.06 |
소중한 공감 감사합니다