Skip to main content Link Menu Expand (external link) Document Search Copy Copied

요즘 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 아키텍처 기반의 서버에서 동작하도록 도커 이미지를 만들어보겠습니다.

nGrinder 소스 다운로드

먼저 nGrinder 소스를 다운로드 받습니다.

$ git clone https://github.com/naver/ngrinder

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
...

Dockerfile 빌드

docker 디렉토리의 prepare.sh 를 실행하여 nGrinder 빌드 *.war 파일을 복사합니다.

빌드는 따로 jdk 8-11 에서 진행해야합니다. 만약 빌드된 파일을 가지고 계시다면, docker/controller/binary 디렉토리에 복사해두셔도 됩니다.

$ sh prepare.sh

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

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