docker swarm 이란 여러 대의 Docker 호스트들을 마치 하나인 것처럼 만들어주는 Orchestration 도구이다.
docker compose 는 container 를 정의하는 것이고
docker swarm 은 서비스를 정의하는 것이므로 둘은 서로 다르다
Node
텍스트클러스터에 속한 도커 서버 단위. 보통 한 서버에 하나의 도커 데몬을 실행하기 때문에 노드는 곧 서버라고 이해할 수 있다.
(1 Node = 1 server)
Manager Node
매니저 노드는 아래의 업무를 통해 도커 클러스터를 관리한다.
클러스터의 상태를 유지 : 뗏목 알고리즘 사용 ( https://raft.github.io/ )
스케줄링 서비스 : 작업자 노드(worker)에게 컨테이너를 배포한다. 특정 노드에게만 배포하거나, 모든 노드에 하나씩 배포할 수도 있다.
스웜 모드 제공 : docker swarm init
cluster
도커 스웜에서 매니저 노드는 클러스터의 모든 정보를 포함하고 있다. 때문에 매니저 노드가 죽게되면 클러스터도 다운되게된다.
이러한 문제를 해결하기 위해 도커 스웜은 뗏목 합의 알고리즘을 이용한 멀티 매니저 노드 기능을 지원한다
멀티 매니저 노드 기능을 사용하면 여러 개의 매니저 노드를 생성하여 한 매니저 노드(리더 매니저 노드)가 갑자기 죽게 되더라도 다른 매니저 노드가 다시 서비스를 안정적인 상태로 복원할 수 있다
하지만 이를 위해서는 모든 매니저 노드가 동일한 상태를 유지하고 있어야 하는데, 이때 사용되는 알고리즘이 뗏목 합의 알고리즘이다.
도커 스택은 YAML 파일로 작성된 docker-compose 파일로 환경설정을 받는다.
docker stack deploy -c <compose-file.yaml> <stack-name>
cat <compose-file.yml> | docker stack deploy -c - <stack-name>
-c: [--compose-file]
compose-file 을 전달
standard input 을 통해서 compose-file 을 넣으려면 -
를 사용하면 된다.
--with-registry-auth
matster node 의 인증 정보를 swarm agent 에 전달
위 명령어를 통해 <stack-name>_<service-name>
이름으로 container 가 생성된다.
Creating network <stack-name>_<service-name>
docker swarm 은 service 와 service 들을 포함하는 stack 으로 나뉘어져 있다.
=======================================================================
docker stack ls
NAME SERVICES ORCHESTRATOR
stackname1 1 Swarm
stackname2 74 Swarm
docker stack ls --format "{{.Name}}: {{.Services}}"
stackname1: 14
stackname2: 30
# swarm manager initialize
docker swarm init
> Swarm initialized: current node (---) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token <token> <ip>
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
이후에 node ls
를 통해서 swarm node 들의 상태를 확인 할 수 있다.
manager node
id 옆에는 *
가 표시되며, Manager status
가 leader
인 것을 확인 할 수 있다.
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
aaaa * a Ready Active Leader 23.0.1
bbbb b Ready Active 23.0.1
docker stack ls
docker stack services <stackName>
docker stack rm <stackName>
docker stack ps <stackName>
docker service ps --no-trunc <serviceName>_<service> --format "{{.Error}}"
docker node update --label-add <labelName>=<label> <node ID>
[ref][docker swarm] https://cornswrold.tistory.com/512
https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/
https://roseline124.github.io/kuberdocker/2019/07/31/docker-study08.html
https://tech.osci.kr/2019/02/13/docker-swarm-%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-container-orchestration-%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0/