created at 2024-02-23
Table of contents
요즘 ARM64 아키텍처를 사용하는 서버가 늘어나고 있습니다. MacBook M1, M2 등의 ARM64 아키텍처를 사용하는 개발자도 늘어나고 있죠. 그러나 기존의 부하 테스트 도구인 nGrinder는 AMD64 아키텍처를 기반으로 한 도커 이미지만 제공되어 ARM64 아키텍처에서는 정상적으로 동작하지 않습니다. 따라서 ARM64 아키텍처를 사용하는 서버에서도 nGrinder를 사용할 수 있도록 ARM64 아키텍처를 지원하는 도커 이미지를 만들어보겠습니다.
전 Intel MacBook 에 커피를 쏟아버려서 이번에 M2 MacBook 으로 변경했어요ㅜㅜ. 그래서 arm64 아키텍처 기반으로 nGrinder 를 사용해야 했습니다.
다 귀찮다! 그냥 이미지 받아서 돌리고 싶다면?
만약 직접 빌드하기 귀찮다면, 아래와 같이 사용자 루트에 ngrinder-controller 디렉토리 만들고 docker-compose.yaml
작성하여 compose 하시면 실행됩니다.
$ mkdir ~/ngrinder-controller
$ chmod 777 ~/ngrinder-controller
version: '3'
services:
controller:
image: ghkdqhrbals/ngrinder-controller:latest
ports:
- "80:80"
- "16001:16001"
- "12000-12009:12000-12009"
volumes:
- ~/ngrinder-controller:/opt/ngrinder-controller:rw
networks:
- ngrinder
agent:
image: ghkdqhrbals/ngrinder-agent:latest
links:
- controller
networks:
- ngrinder
networks:
ngrinder:
driver: bridge
arm64 기반 ngrinder 이미지 생성
이제 arm64
아키텍처 기반의 서버에서 동작하도록 도커 이미지를 만들어보겠습니다.
1. nGrinder 소스 다운로드
먼저 nGrinder 소스를 다운로드 받습니다.
$ git clone https://github.com/naver/ngrinder
2. Dockerfile 수정
다운로드 받은 nGrinder 소스의 docker/controller
디렉토리로 이동합니다.
gyuminhwangbo ngrinder% cd docker/controller
Dockerfile
을 열어서 아래와 같이 수정합니다. 먼저 arm64 아키텍처에서 동작하도록 amazoncorretto:11
을 기반으로 변경합니다. 이후 maven 3.6.x 버전을 현재 지원(2024.02.23)하는 버전인 3.8.8 로 변경합니다. 또한 yum
을 이용하여 tar
, unzip
, gzip
, bash
, udev
, curl
을 설치합니다. curl 을 이용하여 maven과 gradle 을 다운받고, 압축해제하고, 실행하는데 필요한 패키지들입니다.
FROM amazoncorretto:11
RUN yum install -y tar unzip gzip bash udev curl
ARG MAVEN_VERSION=3.8.8
...
다운로드 받은 nGrinder 소스의 docker/agent
디렉토리의 Dockerfile 도 비슷하게 수정합니다.
FROM amazoncorretto:11
RUN yum install -y tar unzip gzip bash udev curl
...
3. Dockerfile 빌드
docker 디렉토리의 prepare.sh 를 실행하여 nGrinder 빌드 *.war 파일을 복사합니다.
빌드는 따로 jdk 8-11 에서 진행해야합니다. 만약 빌드된 파일을 가지고 계시다면,
docker/controller/binary
디렉토리에 복사해두셔도 됩니다.
$ sh prepare.sh
4. docker-compose.yml 수정
최신 버전의 docker-compose 를 사용하여 platform 을 지정해줍니다. 그리고 networks
로 묶어서 내부 local 통신을 설정해주었습니다. 또한 platform
으로 linux/arm64
를 지정해주었습니다.
여기서 ~/ngrinder-controller
는 nGrinder 컨트롤러의 데이터를 저장할 호스트 디렉토리입니다. 사전에 실행한 sh prepare.sh
커맨드를 통해 ~/ngrinder-controller
디렉토리가 생성되었을 것입니다. 바로 여기에 볼륨을 마운트 시키는 거에요.
version: '3'
services:
controller:
platform: linux/arm64 # specify the platform
image: ghkdqhrbals/ngrinder-controller:latest
build:
context: controller # dockerfile location
dockerfile: Dockerfile # dockerfile name
ports:
- "80:80"
- "16001:16001"
- "12000-12009:12000-12009"
volumes:
- ~/ngrinder-controller:/opt/ngrinder-controller:rw
networks:
- ngrinder
agent:
platform: linux/arm64
image: ghkdqhrbals/ngrinder-agent:latest
build:
context: agent
dockerfile: Dockerfile
links:
- controller
networks:
- ngrinder
networks:
ngrinder:
driver: bridge
5. docker-compose build & up
docker-compose 를 이용하여 빌드하고 실행합니다.
$ docker-compose -f docker-compose.yml build
그러면 아래와 같이 빌드된 이미지가 생성될 것입니다.
gyuminhwangbo@Gyuminui-MacBookAir spring-db-storke % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ghkdqhrbals/ngrinder-agent latest 2f27c73f9485 10 hours ago 853MB
ghkdqhrbals/ngrinder-controller latest 926be7824674 11 hours ago 1.13GB
이제 docker-compose 를 이용하여 실행합니다.
$ docker-compose -f docker-compose.yml up -d