※참고 : Docker Swarm Tutorial{: target=”_blank” }

※참고 : 백기선 - 도커 Swarm과 서비스{: target=”_blank” }

※참고 : 도커 공식문서 - 스웜과 서비스{: target=”_blank” }



싱글 머신에서의 배포

도커 스웜은 단일 머신 또는 여러 머신에서의 배포가 가능하다. 먼저 단일 머신에서 어떻게 배포하는 지 보기 전에 관련 용어를 알고 가자.



1. 서비스(service)

서버를 구성하는 데 필요한 서비스들, 서버에 배포되는 기본적인 단위들을 말한다. 서버를 postgresql과 django 어플리케이션 구성한다고 하면 여기서 서비스는 postgresql과 django가 될 것이다.

각 서비스는 하나의 이미지를 기반으로 생성되고 동일한 컨테이너를 하나 또는 여러 개 생성할 수 있다.

서비스 폴더는 도커 파일배포하고자 하는 어플리케이션 프로젝트 폴더로 구성된다.



2. 도커 컴포즈

앞서 정의한 서비스들을 어떻게 배포할 지 스크립트로 작성한 파일이다. 도커 공식 문서 튜토리얼의 docker-compose.yml은 아래처럼 작성되어 있다.

web이라는 서비스를 배포하며, 내부적으로는 4000번 포트를 쓰고, 외부에서는 80번 포트로 접속할 수 있게 한다. replicas: 5는 해당 이미지를 기반으로 컨테이너 인스턴스를 5개 만들겠다는 의미이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:


3. 참고 : docker context

docker context는 도커를 빌드할 때 필요한 워킹 디렉토리 같은 것이다. 해당 디렉토리를 기준으로 도커가 빌드에 필요한 모든 파일을 참조한다.


댓글 참고!



4. 도커 서비스 빌드하기

아래에서 괄호는 생략하고 자신의 환경에 맞게 입력한다.


1
docker build -t {태그명} -f {서비스폴더}/Dockerfile {빌드할 서비스폴더}


5. 스웜 모드 시작

도커 스택을 배포할 때, 커맨드는 docker deploy 또는 stack deploy를 쓰는데, 이 명령어를 쓰려면 swarm모드를 켜야 한다. docker swarm init 명령어를 입력하면 스웜 모드가 시작된다. 그리고 명령어를 입력한 현재 머신(현재는 내 로컬 컴퓨터)은 매니저 노드로 설정된다.

매니저 노드가 된 현재 머신은 태스크를 실행하지 않고, 스케줄러는 다른 작업자 노드에 명령을 내린다.

반대로 다른 머신에서 docker swarm join 을 하면 다른 머신이 그 스웜에 작업자 노드로 참여할 수 있다.


1
docker swarm init


2. 도커 스택 배포하기

도커 스택은 우리가 각기 배포한 서비스들을 아우르는 최상위 배포 단위이다. 서비스들을 각자 배포하는 게 아니라 도커 스택을 배포함으로써 여러 어플리케이션을 한번에 배포할 수 있다.

아래 명령어에서 getstartedlab은 배포할 스택의 이름을 정해준 것이다. 자신의 마음대로 정하면 된다.


1
docker stack deploy -c docker-compose.yml getstartedlab


3. 현재 서비스 확인하기

docker servie ls로 레플리카를 확인할 수 있다. 또는, docker stack services 스택명 명령으로 스택과 관련된 모든 서비스를 확인한다. 그럼 아래처럼 뜨는데, NAME은 앱_서비스와 같이 구성된다.


1
2
3
4
5
docker servie ls 
docker stack services getstartedlab(스택명)

ID NAME MODE REPLICAS IMAGE PORTS
bqpve1djnk0x getstartedlab_web replicated 5/5 username/repo:tag *:4000->80/tcp


4. 태스크 확인하기

위에서 확인한 서비스의 이름으로, 현재 그 서비스에 어떤 태스크가 존재하는 지 확인할 수 있다.

※태스크 : 서비스에서 실행되는 컨테이너 하나하나를 태스크라고 한다.


1
docker service ps getstarted_web

5. 로드 밸런싱 확인

curl -4 http://localhost:4000를 커맨드에 입력하거나 직접 브라우저에 접속해서 호스트네임을 확인한다.

새로고침할 때마다 호스트네임이 바뀐다. 이를 통해 로드밸런싱으로 5개 태스크 중 각기 다른 하나가 요청에 응답하는 것을 알 수 있다.


출처 : 도커 공식문서{: target=”_blank” }


태스크 선택은 라운드로빈(RoundRobin) 스케줄링 방식{: target=”_blank” }으로 이루어진다.


스택의 모든 task를 확인하려면 docker stack ps 스택이름을 실행한다. 각 태스크에는 고유한 ID가 있고, NAME을 보면 각 태스크에 인덱스가 있음을 알 수 있다.


1
2
3
4
5
6
7
8
docker stack ps getstartedlab

ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
uwiaw67sc0eh getstartedlab_web.1 username/repo:tag docker-desktop Running Running 9 minutes ago
sk50xbhmcae7 getstartedlab_web.2 username/repo:tag docker-desktop Running Running 9 minutes ago
c4uuw5i6h02j getstartedlab_web.3 username/repo:tag docker-desktop Running Running 9 minutes ago
0dyb70ixu25s getstartedlab_web.4 username/repo:tag docker-desktop Running Running 9 minutes ago
aocrb88ap8b0 getstartedlab_web.5 username/repo:tag docker-desktop Running Running 9 minutes ago


6. 앱 스케일 조정

docker-compose.yml에서 replicas: 7로 조정한다. 변경 사항을 반영하려면 docker stack deploy 명령을 다시 실행한다.


1
docker stack deploy -c docker-compose.yml getstartedlab


7. 스택 내리기

띄웠던 스택을 내리려면 docker stack rm 스택명 명령을 실행한다.

또는 스웜에서 떠나려면 docker swarm leave --force를 실행한다. 이 명령어는 여러 머신이 존재하는 노드에서 특정 노드를 스웜에서 제외하고 싶을 때도 사용할 수 있다.