자바를 이용해 프로그래밍을 할 때 통합 개발환경이 제공하는 디버거(Debugger)는 매우 편리합니다. 특정 코드의 수행을 단계별(Step-by-step)로 확인할 수 있기 때문입니다. 자바 프로그램이 실행되는 JVM은 원격 디버깅(Remote Debugging) 기능을 제공합니다. IntellI J나 Eclipse 같은 통합 개발환경에서 원격 서버에 설치되어 있는 자바 프로그램을 디버깅 할 수 있습니다.
이번 포스트에서는 도커 환경에 자바 프로그램을 구동시켜놓고 통합개발환경(Intelli J, Eclipse)에서 원격으로 디버깅해보겠습니다.
자바 프로그램
다음 자바 프로그램을 작성한 다음 도커에 구동시킨 후 원격 디버깅을 해보겠습니다.
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println("Hello, World - " + i);
}
}
}
"Hello, World"라는 문자열을 100번 화면에 출력하는 간단한 프로그램입니다. 이 자바 코드를 IDE 혹은 javac를 이용해 컴파일 한 후 Test.class 혹은 jar 파일을 만듭니다.
도커에 자바 실행환경 만들기
자바 프로그램을 실행할 수 있는 도커 환경을 만들어보겠습니다. 다음 도커 파일을 빌드하면 자바 실행환경을 만들 수 있습니다.
FROM openjdk:8
COPY Test.class /root
WORKDIR /root
EXPOSE 5005
ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005", "Test"]
Test.class 혹은 jar 파일이 위치한 디렉토리에서 다음 명령을 실행합니다.
docker build . --tag test_container
도커 파일의 COPY 명령이 현재 작업 디렉토리에 있는 Test.class 파일을 이미지 안쪽으로 복사해줍니다. (만약 jar 파일이라면 Test.class 대신 jar 파일을 입력하고 ENTRYPOINT의 자바 명령을 조금 고치면 됩니다.)
docker run -d -p 5005:5005 test_container
위 명령으로 도커 이미지를 컨테이너로 만들어 줍니다. ENTRYPOINT로 지정한 자바 명령이 자바 프로그램을 실행시켜준다. 이 때, suspend=y 옵션을 줬으므로 원격에서 디버거가 붙을 때까지 자바 프로그램은 실행을 멈추고 대기하게 됩니다.
이제 통합개발환경에서 원격 디버거 기능을 이용해 대기하고 있는 JVM에 접속하면 됩니다.
IntelliJ Remote Debugger 설정
IntelliJ에서 Test.java 파일을 포함한 프로젝트를 오픈합니다.
[Run] -> [Edit Configurations] 메뉴를 선택합니다.
창의 왼쪽에 있는 '+' 버튼을 눌러 Remote를 선택합니다.
IntelliJ의 기본 설정이 5005번 포트를 통해서 원격 디버깅을 하도록 설정되어 있습니다. 이미 도커 컨테이너를 띄울 때 5005번 포트를 매핑 시켜놨으므로 localhost로 접속해서 디버깅을 하면됩니다. 기본 설정을 유지하고 OK 버튼을 누릅니다.
디버거를 실행하기전에 브레이크 포인트를 설정합니다.
그리고 디버깅을 시작하면 로컬에서 자바 프로그램을 디버깅하는 것처럼 원격 디버깅을 할 수 있습니다.
주의 할 점은 도커 컨테이너 안쪽에서 엔트리 포인트로 설정한 옵션에 suspend=y 옵션이 있기 때문에 원격에서 디버거가 붙을때까지 자바 프로그램이 실행되지 않고 대기하고 있다는 점입니다.
Eclipse Remote Debugger 설정
이클립스에서도 비슷하게 리모트 디버깅 기능을 제공합니다.
[Run] -> [Debug Configuration]으로 들어가서 [Remote Java Application] 항목에서 우클릭을 하고, "New Configuration"을 선택하면 새로운 리모트 디버깅 설정이 생깁니다.
Host 항목에 localhost를 입력하고 Port 정보에 5005를 입력한 다음 "apply" 버튼을 클릭하고, 브레이크 포인트를 설정한 다음 로컬에서처럼 디버깅을 시작하면 됩니다.
댓글