Spring & Spring Boot/Monitoring

[6] Spring Boot App 모니터링 - Scouter로 모니터링, 최신 버전으로 도커 이미지 생성

carrotweb 2026. 10. 12. 21:36
728x90
반응형

GitHub에 있는 최신 버전으로 도커 이미지를 생성하여 Scouter Server로 사용하겠습니다.

 

다운로드 한 압축 파일(scouter-all-2.21.3.tar.gz)로 도커 이미지 생성

1. Scouter 프로젝트 GitHub Releases (https://github.com/scouter-project/scouter/releases)에 접속합니다.

 

2. Assest에서 scouter-all-2.21.3.tar.gz를 클릭하여 다운로드 받습니다.

(Spring Boot 3.x 기반이라면 이전에 다운로드하였습니다.)

 

3. C:\workspaces\docker\scouter에 scouter-build 디렉터리를 생성하고 scouter-all-2.21.3.tar.gz 파일을 복사해서 붙여넣기합니다.

C:\workspaces\docker\scouter\scouter-build <-- 스카우터 도커 이미지 빌드

 

4. Dockerfile 파일을 생성합니다.

# Java 11
FROM eclipse-temurin:11-jre

# 환경 변수 설정
ENV SCOUTER_HOME=/home/scouter-server

# 지정된 디렉터리로 파일을 압축 해제
ADD scouter-all-2.21.3.tar.gz /home

# 디렉터리 변경
RUN mv /home/scouter/server ${SCOUTER_HOME}
RUN cp /home/scouter/webapp/scouter-webapp-2.21.3.jar ${SCOUTER_HOME}/scouter-webapp-boot.jar
RUN cp /home/scouter/webapp/lib/*.jar ${SCOUTER_HOME}/lib

# scouter 디렉터리 삭제
RUN rm -rf /home/scouter

# 작업 디렉터리 설정
WORKDIR ${SCOUTER_HOME}

# TCP (에이전트 및 전용 클라이언트 연결용)
EXPOSE 6100/tcp
# UDP (에이전트 성능 데이터 수집 전송용)
EXPOSE 6100/udp
# TCP (Scouter API 연결용)
EXPOSE 6180/tcp

CMD ["java", "-Xmx1024m", "-classpath", "./scouter-server-boot.jar", "scouter.boot.Boot", "./lib", "java", "-cp", "./scouter.webapp.jar:./lib/*:.", "scouterx.webapp.main.WebAppMain"]

 

기존 scouterapm/scouter-server:2.17.1와 동일하게 디렉터리 구조로 생성했습니다.

 

scouter-all-2.21.3.tar.gz 파일을 압축 해제해서 home 디렉터리에 풀어넣습니다.

ADD 명령어는 압축 파일(.tar.gz)을 처리할 때 압축 파일 자체를 복사하는 것이 아니라, 압축을 해제한 내용(파일 또는 디렉터리)만 지정한 경로에 풀어놓습니다. 그리고 지정한 디렉터리(/home)가 컨테이너 내부에 존재하지 않으면 디렉터리를 자동으로 생성합니다.

ADD scouter-all-2.21.3.tar.gz /home

 

Scouter Server를 위해 /home/scouter/server의 모든 파일을 /home/scouter-server로 이동시킵니다.

RUN mv /home/scouter/server ${SCOUTER_HOME}

 

Scouter API를 위해 /home/scouter/webapp/에 있는 scouter-webapp-2.21.3.jar 파일과 /home/scouter/webapp/lib에 있는 jar 파일들을 복사합니다.

RUN cp /home/scouter/webapp/scouter-webapp-2.21.3.jar ${SCOUTER_HOME}/scouter-webapp-boot.jar
RUN cp /home/scouter/webapp/lib/*.jar ${SCOUTER_HOME}/lib

 

/home 디렉터리 아래에 남아있는 scouter 폴더를 통째로 삭제합니다.

RUN rm -rf /home/scouter

 

Scouter Server를 위해 6100/tcp, 6100/udp 포트를 개방하고 Scouter API 연결을 위해 6180/tcp 포트를 개방합니다.

EXPOSE 6100/tcp
EXPOSE 6100/udp
EXPOSE 6180/tcp

 

CMD 명령어로 Scouter Server와 WebApp를 실행시킵니다.

CMD ["java", "-Xmx1024m", "-classpath", "./scouter-server-boot.jar", "scouter.boot.Boot", "./lib", "java", "-cp", "./scouter.webapp.jar:./lib/*:.", "scouterx.webapp.main.WebAppMain"]

 

주의

도커 켄네이너에서는 실행할 때는 startup.sh를 실행시키면 안됩니다.

CMD ["./startup.sh"]

 

scouter\server\startup.sh 파일입니다.

#!/usr/bin/env bash

nohup java -Xmx1024m -classpath ./scouter-server-boot.jar scouter.boot.Boot ./lib > nohup.out &
sleep 1
tail -100 nohup.out

 

scouter\webapp\startup.sh 파일입니다.

#!/usr/bin/env bash
#export JDK_JAVA_OPTIONS="--add-modules java.xml.bind"
nohup java -cp ./scouter.webapp.jar:./lib/*:.  scouterx.webapp.main.WebAppMain > nohup.out &
sleep 1
tail -100 nohup.out

 

리눅스에서 nohup 명령어(노헙, No Hang Up, 전화를 끊지 않음)를 사용하여 Java 애플리케이션이 백그라운드에서 실행되게 합니다.

그리고 명령어 실행 후 끝났다고 판단하여 도커 컨테이너를 즉시 종료(Exited)시켜 버립니다. 그래서 도커 컨테이너가 계속 재실행(restarting)되는 문제가 발생합니다.

dev-scouter  | NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-exports=java.base/sun.net=ALL-UNNAMED -Djdk.attach.allowAttachSelf=true
dev-scouter  |   ____                  _            Watch   d Detach
dev-scouter  |  / ___|  ___ ___  _   _| |_ ___ _ __
dev-scouter  |  \___ \ / __/   \| | | | __/ _ \ '__|
dev-scouter  |   ___) | (_| (+) | |_| | ||  __/ |
dev-scouter  |  |____/ \___\___/ \__,_|\__\___|_|
dev-scouter  |  Open Source S/W Performance Monitoring
dev-scouter  |  Scouter version 2.21.3
dev-scouter  |
dev-scouter exited with code 0 (restarting)
dev-scouter  | NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-exports=java.base/sun.net=ALL-UNNAMED -Djdk.attach.allowAttachSelf=true
dev-scouter  |   ____                  _            Watch   d Detach
dev-scouter  |  / ___|  ___ ___  _   _| |_ ___ _ __
dev-scouter  |  \___ \ / __/   \| | | | __/ _ \ '__|
dev-scouter  |   ___) | (_| (+) | |_| | ||  __/ |
dev-scouter  |  |____/ \___\___/ \__,_|\__\___|_|
dev-scouter  |  Open Source S/W Performance Monitoring
dev-scouter  |  Scouter version 2.21.3
dev-scouter  |
dev-scouter  | Can't lock the database
dev-scouter  | Please remove the lock : /home/scouter-server/./database/lock.dat
dev-scouter  | java -cp ./boot.jar scouter.boot.Boot [./lib]
dev-scouter exited with code 0 (restarting)

 

백그라운드가 아닌 포그라운드로 실행하기 위해 CMD ["java", ...] 형태로 실행하여 컨테이너가 계속 살아있게 해야합니다.

CMD ["java", "-Xmx1024m", "-classpath", "./scouter-server-boot.jar", "scouter.boot.Boot", "./lib"]

 

또는 scouterapm/scouter-server:2.17.1 이미지의 startup.sh 파일 처럼 변경하시면 됩니다.

#!/bin/sh -x

export SC_SERVER_ID=${SC_SERVER_ID:-SCCOUTER-COLLECTOR}
export NET_HTTP_SERVER_ENABLED=${NET_HTTP_SERVER_ENABLED:-true}
export NET_HTTP_API_SWAGGER_ENABLED=${NET_HTTP_API_SWAGGER_ENABLED:-true}
export NET_HTTP_API_ENABLED=${NET_HTTP_API_ENABLED:-true}

export MGR_PURGE_PROFILE_KEEP_DAYS=${MGR_PURGE_PROFILE_KEEP_DAYS:-2}
export MGR_PURGE_XLOG_KEEP_DAYS=${MGR_PURGE_XLOG_KEEP_DAYS:-5}
export MGR_PURGE_COUNTER_KEEP_DAYS=${MGR_PURGE_COUNTER_KEEP_DAYS:-15}
export JAVA_OPT=${JAVA_OPT:--Xms1024m -Xmx1024m}
sed -i "s/%SC_SERVER_ID%/${SC_SERVER_ID}/g" /home/scouter-server/conf/scouter.conf
sed -i "s/%NET_HTTP_SERVER_ENABLED%/${NET_HTTP_SERVER_ENABLED}/g" /home/scouter-server/conf/scouter.conf
sed -i "s/%NET_HTTP_API_SWAGGER_ENABLED%/${NET_HTTP_API_SWAGGER_ENABLED}/g" /home/scouter-server/conf/scouter.conf
sed -i "s/%NET_HTTP_API_ENABLED%/${NET_HTTP_API_ENABLED}/g" /home/scouter-server/conf/scouter.conf

sed -i "s/%MGR_PURGE_PROFILE_KEEP_DAYS%/${MGR_PURGE_PROFILE_KEEP_DAYS}/g" /home/scouter-server/conf/scouter.conf
sed -i "s/%MGR_PURGE_XLOG_KEEP_DAYS%/${MGR_PURGE_XLOG_KEEP_DAYS}/g" /home/scouter-server/conf/scouter.conf
sed -i "s/%MGR_PURGE_COUNTER_KEEP_DAYS%/${MGR_PURGE_COUNTER_KEEP_DAYS}/g" /home/scouter-server/conf/scouter.conf

java $JAVA_OPT -classpath /home/scouter-server/scouter-server-boot.jar scouter.boot.Boot /home/scouter-server/lib

 

5. 빌드합니다.

docker build --no-cache -t scouter-server:2.21.3 .

 

6. 생성된 도커 이미지를 확인합니다.

docker image ls scouter-server:2.21.3

 

7. C:/workspaces/docker/scouter에 scouter-conf 디렉터리를 생성 scouter.conf 파일을 생성합니다.

scouter.conf 파일을 생성하지 않은 상태로 도커 컨테이너를 실행하면 scouter.conf 파일이 내용 없이 생성됩니다.

server_id=SCOUTER-COLLECTOR

#Activating Http Server
#HTTP 서버 활성
net_http_server_enabled=true
net_http_api_swagger_enabled=true

#Activating Scouter API
#Scouter API 활성
net_http_api_enabled=true

#Retaining date for automatic deletion. delete profile data first.
#자동 삭제를 위한 보존 기간. 프로필 데이터를 먼저 삭제

#프로파일 정보를 유지하는 기간
mgr_purge_profile_keep_days=2

#XLog를 유지하는 기간
mgr_purge_xlog_keep_days=5

#카운터 정보를 유지하는 기간
mgr_purge_counter_keep_days=15

#TCP 포트
net_tcp_listen_port=6100

#UDP 포트
net_udp_listen_port=6100

#Scouter API 포트
net_http_port=6180

#지정된 IP에서만 Scouter API를 호출할 수 있도록 제한 (false : 모든 IP의 접근 허용)
net_http_api_auth_ip_enabled=false

 

7. C:\workspaces\docker\scouter\docker-compose.yml 파일을 복사하여 C:\workspaces\docker\scouter\scouter-build에 붙여넣기 하고 최신 버전으로 빌드한 도커 이미지로 변경합니다.

# 컨테이너 내의 서비스들 정의
services:
  # 서비스명
  scouter:
    # 가져올 이미지:태그(버전)
    image: scouter-server:2.21.3
    # 컨테이너명
    container_name: dev-scouter
    # 환경 설정
    environment:
      - JDK_JAVA_OPTIONS=--add-opens=java.base/java.lang=ALL-UNNAMED --add-exports=java.base/sun.net=ALL-UNNAMED -Djdk.attach.allowAttachSelf=true
    # 연결된 포트 (컨테이너 외부:컨테이너 내부)
    ports:
      # 에이전트 및 전용 클라이언트 연결용
      - "6100:6100/tcp"
      # 에이전트 성능 데이터 수집 전송용
      - "6100:6100/udp"
      # Web API 연결용
      - "6188:6180/tcp"
    # 볼륨 (컨테이너 외부 경로:컨테이너 내부 경로)
    volumes:
      # 스카우터 설정
      - C:/workspaces/docker/scouter/scouter-conf:/home/scouter-server/conf
      # 스카우터 데이터
      - C:/workspaces/docker/scouter/scouter-data:/home/scouter-server/database
      # 스카우터 로그
      - C:/workspaces/docker/scouter/scouter-logs:/home/scouter-server/logs
    # 컨테이너 재시작 - 컨테이너 자동 재시작
    restart: unless-stopped
    # 사용할 네트워크
    networks:
      - dev-network

  # 서비스명
  scouter-paper:
    # 가져올 이미지:태그(버전)
    image: scouterapm/scouter-paper:2.6.4
    # 컨테이너명
    container_name: dev-scouter-paper
    # 연결된 포트 (컨테이너 외부:컨테이너 내부)
    ports:
      - "9000:80"
    # 컨테이너 재시작 - 컨테이너 자동 재시작
    restart: unless-stopped
    # 사용할 네트워크
    networks:
      - dev-network

networks:
  dev-network:
    external: true

 

8. 도커 명령어를 실행하여 도커 컨테이너를 생성하고 실행합니다.

docker compose up -d

 

 

GitHub에서 압축 파일(scouter-all-2.21.3.tar.gz)를 다운로드 한 후 도커 이미지 생성

1. C:\workspaces\docker\scouter에 scouter-build-github 디렉터리를 생성하고 Dockerfile 파일을 생성합니다.

C:\workspaces\docker\scouter\scouter-build-github <-- 스카우터 GitHub 도커 이미지 빌드
# Java 11
FROM eclipse-temurin:11-jre

# 환경 변수 설정
ENV SCOUTER_HOME=/home/scouter-server

# github에서 다운로드한 후 압축 해제
RUN wget https://github.com/scouter-project/scouter/releases/download/v2.21.3/scouter-all-2.21.3.tar.gz && \
    tar -xf scouter-all-2.21.3.tar.gz && \
    mkdir -p ${SCOUTER_HOME} && \
    mv scouter/server/* ${SCOUTER_HOME}/ && \
    cp scouter/webapp/scouter-webapp-2.21.3.jar ${SCOUTER_HOME}/scouter-webapp-boot.jar && \
    cp scouter/webapp/lib/*.jar ${SCOUTER_HOME}/lib && \
    rm -rf scouter-all-2.21.3.tar.gz scouter

# 작업 디렉터리 설정
WORKDIR ${SCOUTER_HOME}

# TCP (에이전트 및 전용 클라이언트 연결용)
EXPOSE 6100/tcp
# UDP (에이전트 성능 데이터 수집 전송용)
EXPOSE 6100/udp
# TCP (Scouter API 연결용)
EXPOSE 6180/tcp

CMD ["java", "-Xmx1024m", "-classpath", "./scouter-server-boot.jar", "scouter.boot.Boot", "./lib", "java", "-cp", "./scouter.webapp.jar:./lib/*:.", "scouterx.webapp.main.WebAppMain"]

위와 동일하게 디렉터리 구조로 생성했습니다.

 

wget 명령어로 GitHub에서 scouter-all-2.21.3.tar.gz 파일 다운로드 받습니다.

wget https://github.com/scouter-project/scouter/releases/download/v2.21.3/scouter-all-2.21.3.tar.gz

 

그리고 tar로 압축 해제합니다.

tar -xf scouter-all-2.21.3.tar.gz

 

/home/scouter-server 디렉터리를 생성하고 scouter/server의 모든 파일을 이동시킵니다.

mkdir -p ${SCOUTER_HOME}
mv scouter/server/* ${SCOUTER_HOME}/

 

Scouter API를 위해 scouter/webapp/에 있는 scouter-webapp-2.21.3.jar 파일과 /home/scouter/webapp/lib에 있는 jar 파일들을 복사합니다.

cp scouter/webapp/scouter-webapp-2.21.3.jar ${SCOUTER_HOME}/scouter-webapp-boot.jar
cp scouter/webapp/lib/*.jar ${SCOUTER_HOME}/lib

 

설치 과정에서 다운로드하고 압축을 풀었던 파일과 폴더를 삭제합니다.

rm -rf scouter-all-2.21.3.tar.gz scouter

 

여러 개의 RUN에서 하나의 RUN으로 변경 (&& \를 사용해 명령어를 한 줄로 묶어 실행)

Docker는 RUN 지시어 하나당 단 하나의 새로운 이미지 레이어를 생성합니다. 그래서 명령어마다 RUN을 사용하면 서로 다른 레이어로 각각 생성합니다.

여러번 RUN를 사용하면 이미지의 전체 용량이 늘어나기 때문에 한번의 RUN으로 처리하시기 바랍니다.

 

Scouter Server를 위해 6100/tcp, 6100/udp 포트를 개방하고 Scouter API 연결을 위해 6180/tcp 포트를 개방합니다.

 

CMD 명령어로 Scouter Server와 WebApp를 실행시킵니다.

 

2. 빌드합니다.

docker build --no-cache -t scouter-server-github:2.21.3 .

 

3. C:\workspaces\docker\scouter\scouter-build\docker-compose.yml 파일을 복사하여 C:\workspaces\docker\scouter\scouter-build-github에 붙여넣기 하고 git 버전으로 빌드한 도커 이미지로 변경합니다.

# 컨테이너 내의 서비스들 정의
services:
  # 서비스명
  scouter:
    # 가져올 이미지:태그(버전)
    image: scouter-server-github:2.21.3
    # 컨테이너명
    container_name: dev-scouter
    # 환경 설정
    environment:
      - JDK_JAVA_OPTIONS=--add-opens=java.base/java.lang=ALL-UNNAMED --add-exports=java.base/sun.net=ALL-UNNAMED -Djdk.attach.allowAttachSelf=true
    # 연결된 포트 (컨테이너 외부:컨테이너 내부)
    ports:
      # 에이전트 및 전용 클라이언트 연결용
      - "6100:6100/tcp"
      # 에이전트 성능 데이터 수집 전송용
      - "6100:6100/udp"
      # Web API 연결용
      - "6188:6180/tcp"
    # 볼륨 (컨테이너 외부 경로:컨테이너 내부 경로)
    volumes:
      # 스카우터 설정
      - C:/workspaces/docker/scouter/scouter-conf:/home/scouter-server/conf
      # 스카우터 데이터
      - C:/workspaces/docker/scouter/scouter-data:/home/scouter-server/database
      # 스카우터 로그
      - C:/workspaces/docker/scouter/scouter-logs:/home/scouter-server/logs
    # 컨테이너 재시작 - 컨테이너 자동 재시작
    restart: unless-stopped
    # 사용할 네트워크
    networks:
      - dev-network

  # 서비스명
  scouter-paper:
    # 가져올 이미지:태그(버전)
    image: scouterapm/scouter-paper:2.6.4
    # 컨테이너명
    container_name: dev-scouter-paper
    # 연결된 포트 (컨테이너 외부:컨테이너 내부)
    ports:
      - "9000:80"
    # 컨테이너 재시작 - 컨테이너 자동 재시작
    restart: unless-stopped
    # 사용할 네트워크
    networks:
      - dev-network

networks:
  dev-network:
    external: true

 

4. 도커 명령어를 실행하여 도커 컨테이너를 생성하고 실행합니다.

docker compose up -d

728x90
반응형