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

'Spring & Spring Boot > Monitoring' 카테고리의 다른 글
| [5] Spring Boot App 모니터링 - Scouter로 모니터링, Host Agent (0) | 2026.10.12 |
|---|---|
| [4] Spring Boot App 모니터링 - Scouter로 모니터링, Scouter Paper (0) | 2026.10.12 |
| [3] Spring Boot App 모니터링 - Scouter로 모니터링, Scouter Collector (Server), Scouter Agent, Docker Image (0) | 2026.10.08 |
| [2] Spring Boot App 모니터링 - Prometheus, Grafana로 모니터링 (0) | 2026.10.03 |
| [1] Spring Boot App 모니터링 - Spring Boot Actuator, Micrometer (0) | 2026.10.03 |