서비스 개발 이후, 일반적으로 실제 요구 부하를 서버가 견뎌낼 수 있는지 확인하는 작업 중 하나이다. 유저의 활동을 시뮬레이션하는 작업으로 앱이 상용 단계로 나아갈 수 있는지, 동시 사용자는 얼마나 견딜 수 있는지를 알아낼 수 있다.
nGrinder는 스크립트 생성, 테스트, 모니터링과 결과 생성까지 이어질 수 있는 도구로, 네이버에서 만들었다. Groovy나 Jython으로 스크립트를 작성할 수 있다. Groovy의 경우 익숙한 JUnit기반 문법으로 익숙한 형태로 테스트를 작성할 수 있다.

대략 위 그림과 같은 구조로 GUI 환경의 Controller를 이용해 테스트 스크립트를 조정하고 여러 Agent를 이용해 실제 요청을 날린다.
여러 agent를 쉽게 추가하고 제거하기 위해 agent는 도커 스웜에서 레플리카 값을 주는 형식으로 만들 것이다. nGrinder의 공식 이미지 저장소는 다음과 같다. https://hub.docker.com/r/ngrinder/controller/
우선 도커 스웜 모드로 시작하기 위해 다음과 같이 입력하자.
docker swarm init
결과로 다음과 같은 문구가 나올 것이다.
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
말 그대로이다. 이제 해당 노드는 매니저 노드로서 도커 스웜을 관리하는 역할을 맡게 된다.
이제 다른 agent 역할을 할 서버에서 다음과 같이 입력하자.
docker swarm join \
--token <docker-swarm-join-token> \
<hostname>
정상적으로 워커로 등록되었다면 다음과 같은 문구가 나온다.
This node joined a swarm as a worker.
이제 다시 마스터 노드로 돌아와 (처음 docker swarm init을 했던 노드) 다음 명령어로 노드들을 확인하자.
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
46aqrk4e473hjbt745z53cr3t node-5 Ready Active Reachable
61pi3d91s0w3b90ijw3deeb2q node-4 Ready Active Reachable
a5b2m3oghd48m8eu391pefq5u node-3 Ready Active
e7p8btxeu3ioshyuj6lxiv6g0 node-2 Ready Active
ehkv3bcimagdese79dn78otj5 * node-1 Ready Active Leader
위와 같이 여러 노드가 준비된 것이 보일 것이다.
다음과 같이 입력해 overlay 모드로 새로운 네트워크를 만들자. 이 네트워크 레이어를 agent를 설치할 여러 노드가 공유할 것이다.
docker network create -d overlay --attachable <network_name>
이번에는 네트워크 이름을 momos로 지었다고 하자. 다음과 같이 입력하면 된다.
docker network create -d overlay --attachable momos
overlay 옵션을 주면 여러 호스트 사이에서 해당 네트워크를 이용할 수 있게된다. --attachable은 컨테이너에 명시적으로 네트워크를 붙이는 걸 허용하게 만든다. 이제 Controller와 Agent들을 momos에 연결하면 된다.
docker run -d -v ~/ngrinder-controller:/opt/ngrinder-controller \
--name controller \
-p 8000:80 \
--network momos \
ngrinder/controller
이제 localhost의 8000번 포트로 들어가면 된다. 초기 아이디 / 비밀번호는 admin이다.

이제 agent를 도커 서비스로 만들어보자.
docker service create \
--name agent \
--network momos \
--replicas 2 \
ngrinder/agent
--replicas 옵션 뒤에 준 개수만큼 컨테이너를 생성한다. 컨테이너는 등록된 worker들 사이에 분포한다. 원하는 개수만큼 레플리카 개수를 설정하자. 다시 앞선 컨트롤러로 들어가서 agent가 잘 등록되었는지 보자.

두 개의 agent가 잘 등록된 것을 확인할 수 있다. 이제 확장 가능한 테스팅 환경이 구축되었다. 더 많은 부하가 필요하다면 언제든 swarm에 조인한 후 replica의 개수를 늘려주면 된다.