📌 도커 스웜에 대해 다룹니다.
하나의 호스트 머신에서 도커 엔진을 구동하다가 CPU, 메모리, 디스크 용량이 부족해지면 어떡할까?
👉 더 좋은 성능의 서버를 새로 산다 or 서버를 병렬적으로 확장한다
그러나 여러 대의 서버를 하나의 자원 풀로 만드는 것은 쉬운 작업이 아니다!
이러한 문제를 해결하는 것이 바로 도커 스웜(docker swarm)과 스웜 모드(swarm mode)
스웜 클래식과 도커 스웜 모드는 여러 대의 도커 서버를 하나의 클러스터로 만들어 컨테이너를 생성하는 여러 기능을 제공
스웜 클래식
도커 스웜 모드
스웜 모드는 매니저 노드와 워커 노드로 구성돼 있음
매니저 노드
워커 노드
매니저 노드는 1개 이상이 있어야 하지만 워커 노드는 없을 수도 있다.
❗️ 만약 매니저 노드 사이에 네트워크 파티셔닝과 같은 현상이 발생하면 짝수 개의 매니저로 구성한 클러스터는 운영이 중단될 수 있음. 하지만 홀수 개로 구성했을 경우에는 과반수 이상이 유지되는 쿼럼 매니저에서 운영을 계속 할 수 있다. 따라서 스웜 매니저는 가능한 한 홀수 개로 구성하는 것이 권장됨.
docker swarm init --advertise-addr [매니저 노드의 IP 주소]
docker swarm init
명령어로 매니저 역할을 할 서버에서 스웜 클러스터를 시작한다.
위 명령어를 실행하면 docker swarm join
명령어를 사용할 때 필요한 비밀키 값이 나온다.
docker swarm join \
--token [비밀키]
특정 도커 서버가 정상적으로 스웜 클러스터에 추가됐는지 확인하려면 매니저 노드에서 docker node ls
명령어를 입력한다.
매니저 노드를 추가하려면 매니저 노드를 추가하기 위한 토큰을 확인해줘야 하는데, 이는docker swarm join-token manager
명령어로 확인할 수 있다.
docker swarm join-token manager
추가된 워커 노드를 삭제하고 싶으면 해당 워커 노드에서 docker swarm leave
명령어를 입력한다.
스웜 모드에서 제어하는 단위는 컨테이너가 아닌 서비스(Service)이다.
서비스는 같은 이미지에서 생성된 컨테이너의 집합이다. 서비스 내에 컨테이너는 1개 이상 존재할 수 있고, 컨테이너들은 각 워커 노드와 매니저 노드에 할당된다. 이러한 컨테이너들을 태스크(Task)라고 한다.
서비스를 제어하는 도커 명령어는 전부 매니저 노드에서만 사용할 수 있다.
docker service create \
ubuntu:14.04 \
/bin/sh -c "while true; do echo hello world; sleep 1; done"
스웜 클러스터 내의 서비스 목록은 docker service ls
명령어로 확인할 수 있다.
생성된 서비스를 삭제하려면 docker service rm
명령어를 사용한다.
서비스의 두 가지 모드
docker service create --name global_web \
--mode global \
nginx
스웜 매니저는 복제 모드로 설정된 서비스의 컨테이너가 정지되거나 특정 노드가 다운되면 자동으로 이를 복구한다.
하지만 재균형(rebalance) 작업은 직접 해주어야 한다.
docker service scale
명령어를 사용한다.