docker-compose를 사용해보았으면 docker-compose.yml파일에 모든 볼륨 바인딩, 포트 포워딩, 네트워크, 이미지, 환경변수 설정 등 컨테이너를 구성하는데 필요한 정보들을 기록해 놓을 수 있다는 것이 정말 편하다는 것을 느낄 수 있다.
그리고 docker-compose up -d 명령어 하나만으로 .yml파일에 기록된 모든 컨테이너들을 자동으로 생성할 수 있다는 것도 아주 편리하다.
docker swarm의 필요성
API 서버를 구축하고 서버의 트래픽이 증가하기 시작했다고 하자. 클라우드 서버 한대로는 점점 늘어나는 트래픽을 감당할 수 없을 것이다. 따라서 새로운 서버를 구축해야 하는데.. 기존의 컨테이너들과 데이터베이스, 웹서버 등은 어떻게 해야 할까?
이러한 문제를 해결하기 위해서 '서버 오케스트레이션' 이라는 개념이 있다.
서버 오케스트레이션이란 여러 서버와 서비스들을 자동으로 관리해 주는 작업이라고 생각하면 된다.
스케줄링, 클러스터링, 서비스 디스커버리, 로깅, 모니터링과 같은 다양한 기능이 포함되어있다.
서버 오케스트레이션
- 스케줄링
- 컨테이너들을 적당한 서버에 분배해 주는 작업이다. 오케스트레이션 방법에 따라 분배 방법이 다양하다. 차례대로 분배하는 방식, 랜덤 하게 분배하는 방식, 가장 트래픽이 적은 서버 우선으로 분배하는 방식 등이 있다. 컨테이너 여러 개를 나누어서 배포하고, 서버가 죽으면 실행 중인 컨테이너를 다른 서버로 배포해서 서비스에 차질이 없도록 한다.
- 클러스터링
- 여러 개의 서버를 하나의 서버처럼 사용할 수 있게 해 준다. 클러스터에 새로운 서버를 추가할 수도 있고 제거할 수도 있다. 여기저기 흩어져 있는 컨테이너도 가상 네트워크를 이용하여 같은 서버에 있는 것처럼 쉽게 통신할 수 있게 해준다.
- 서비스 디스커버리
- 서비스를 찾아주는 기능이다. 클러스터 환경에서는 컨테이너가 어느 서버에 할당되어 구동되는지 알 수 없고 다른 서버로 이동할 수도 있다. 따라서 컨테이너와 통신하기 위해서는 어느 서버에서 실행 중인지 알아야 하고 , 컨테이너가 생성되고 중지될 때 IP와 Port 같은 정보를 업데이트해줘야 하므로 해당 기능이 필요하다.
- 로깅, 모니터링
- 여러 대의 서버를 관리하는 경우 로그와 서버 상태를 한 곳에서 관리하는 게 편하기 때문에 사용한다.
- 오케스트레이션 툴에서 지원할 수도 있고 별도의 프로그램을 설치해야 할 수도 있다.
docker swarm
스웜은 도커와 별도로 개발되었다고 한다. 그러다 1.12버전부터(현재 2021/8/18 기준 20.10.8) 스웜 모드라는 이름으로 합쳐졌다. 스웜의 기능은 도커에 모두 내장되어 도커 명령어와 compose를 그대로 사용할 수 있어 다른 툴에 비해서 매우 쉽고 편리하다.
기능이 단순하고 필요한 것만 구현되어있어서 세부적인 컨트롤은 어렵지만 1,000개 노드에 50,000개 컨테이너 테스트도 문제없이 통과하면서 안정, 안전성이 검증되었다고 한다.
도커 스웜에서 사용하는 용어 몇가지를 알아보자
swarm스웜 : 스웜을 만들다. == 클러스터를 만들다.
node노드 : 스웜 클러스터에 속한 서버의 단위. 보통 하나의 서버에 하나의 도커 데몬만 실행하기 때문에 서버==노드라고 이해하면 된다.
manager node매니저노드 : 스웜 클러스터 상태를 통합 관리하는 노드이다. 매니저노드는 워커노드가 될 수 있고 스웜 명령어는 매니저 노드에서만 실행된다.
worker node워커노드 : 매니저노드의 명령을 받아 컨테이너를 생성하고 상태를 체크하는 노드이다.
service서비스 : 기본적인 배포단위. 하나의 이미지를 기반으로 생성되고 복제 컨테이너를 여러개 실행할 수 있다.
stack스택 : 서비스의 묶음 단위. 스택이라는 공간 내부에 웹서버 컨테이너, db컨테이너등을 구축한다. 하나의 스택으로 묶인 컨테이너들은 기본적으로 같은 overlay 네트워크에 속하게 된다.
만약 컨테이너를 구성하는 이미지가 업데이트된다면 어떻게 해야 할까?
현재 구동 중인 모든 컨테이너를 지우고 docker-compose를 사용해서 다시 새로운 이미지로 컨테이너를 새로 만들어야 할까? 아니면 변경된 이미지에 해당하는 컨테이너만 지우고 처음에 사용했던 docker run -d --name .... 과 같은 명령어로 새로 만들어야 할까?
-> 도커 스웜의 롤링 업데이트 기능을 사용할 수 있다. 서비스들을 새로운 이미지로 하나씩 차례대로 업데이트 가능하다. 동시에 업데이트하는 작업의 개수와 업데이트 간격 시간도 조정할 수 있다.
다음 포스팅은 도커 스웜을 시작하고 compose파일과 스웜 시크릿을 이용해서 서비스 스택을 배포하는 방법을 적을 예정이다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] certbot 컨테이너를 사용해 SSL 인증서 발급받기 (0) | 2021.11.14 |
---|---|
[Docker] Docker Swarm 서비스하기 (0) | 2021.08.24 |
[Docker] docker-compose로 편하게 개발환경 구성하기 (0) | 2021.08.10 |
[Docker] Docker 관련 tip #1 (0) | 2021.08.10 |
[Docker] Django 개발 환경 세팅 #2 (0) | 2021.08.05 |