[Docker] IntelliJ IDEA 에서 도커 빌드 구성(한국어)

rekv·2025년 3월 21일

Docker

목록 보기
10/12

Dockerfile을 매번 터미널에서 명령어로 실행시켜도 되지만, 명렁어 대신 IntelliJ IDEA에서 실행 버튼을 눌러서 Docker Image를 만드는 것도 가능하다.

프로젝트는 이미 만들어졌음을 가정, IntelliJ 한국어 기준 설명

실행/디버그 구성하기

IntelliJ IDEA를 열고 우측 상단을 보면 실행/디버그 구성창이 있다. 프로젝트를 실행할 때면 어떤 빌드 도구를 이용하는지 저곳에서 확인이 가능하다.
우리는 Docker를 실행할 것이므로 실행/디버그 구성을 누르고 구성 편집을 누른다.

구성 창에서 왼쪽 위에 + 버튼을 누르면 다른 구성들을 찾을 수 있다. 여기서 Docker > Dockerfile을 클릭

가장 위의 이름은 실행/디버그 구성의 이름이다. 편하게 지어준 다음 Dockerfile에서 Dockerfile을 선택하고 이미지 태그는 Dockerfile을 이용해 만들 Docker Image의 이름을 적어주면 된다.
컨테이너의 이름은 Dockerfile로 Docker Image를 만든 다음 컨테이너까지 바로 실행시킬 거라면 적는다. 굳이 컨테이너를 실행시킬 생각이 아니라면 실행은 빼버려도 된다.

다음처럼 실행의 오른쪽 끝에 수정탭을 눌러 옵션을 추가할 수 있다.

포트를 추가하여 지정한 예시

실행할 때 필요한 옵션 추가가 끝났으면 실행 전에 되어야할 설정도 추가할 수 있다.

예를 들어 backend 프로젝트는 bootJar파일이 먼저 빌드되어야하므로 Gradole 프로젝트를 선택한 다음 작업에 bootJar을 입력

이후 실행/디버그 구성창 오른쪽의 ▶️ 버튼을 누르면 터미널에서 따로 build 입력하지 않아도 Docker Image가 완성된다.

그러나 여기까지 했을 때 한 가지 문제가 있다. 바로 이렇게 만들어진 컨테이너로는 디버그를 수행할 수 없다는 것이다.

💡 로컬 프로세스 vs Docker 프로세스

실행 환경설명
로컬 프로세스IntelliJ가 JVM을 직접 띄우면 👉 프로세스 내부에 바로 디버그 에이전트(JDWP)를 삽입해서 디버깅 가능
Docker 컨테이너 내부IntelliJ가 직접 접근 불가능 👉 Docker는 네트워크를 통해서만 접근 가능 👉 그래서 원격 JVM 디버깅(Remote JVM Debugging)을 사용해야 함

디버그 설정 추가

아까의 새 구성 추가창에서 원격 JVM 디버그를 검색한다. (영문 버전은 Remote JVM Debug)

원격 JVM을 위한 명령줄 인수는 텍스트를 잘 복사해두고, 새 작업 추가에서 다른 구성 실행을 누른다.

여기서 우리가 디버그를 하려는 Docker를 선택

아까 복사했던 명령줄 인수를 ENTRYPOINT에 넣는다.

ENTRYPOINT ["java", "[원격 JVM을 위한 명령줄 인수]", "-jar", "/app.jar"]

이렇게하면 원격 JVM 디버깅이 가능한 상태로 동작하며, 개발자가 언제든 원격에서 디버거를 붙여 코드 실행 상태를 분석하거나 수정할 수 있는 디버깅 전용 환경이 완성된다.

디버그용 도커와 배포용 도커 분리

디버그 모드는 보안, 성능 저하, 안정성 불안정성 등의 문제 때문에 배포 환경에는 필요하지 않다. 디버그는 오직 개발/테스트 서버에만 필요하다.
그러나 디버그용 도커 파일과 배포용 도커 파일을 각각 작성하여 관리하기는 귀찮기 때문에 환경변수 하나로 빌드 도구를 바꿔보자

기존의 Docker를 복사한 다음, debug용 도커에 환경변수 DEBUG=true를 추가한다.

# 8080 포트 열기 (스프림 부트 기본 포트)
EXPOSE 8080 

ARG DEBUG=false 
ENV DEBUG=${DEBUG} 

ENTRYP이NT ["sh", "-c", "if [ \"$DEBUG\" = \"true\" ]; then java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n, address-*:5005 -jar /app.jar; else java -jar /app.jar; fi"]

if문을 이용해 DEBUG가 true면 debug docker를 실행, false면 배포용 도크를 실행하도록 Dockerfile을 수정했다.
이렇게 하면 DEBUG라는 변수 하나만으로도 디버그, 배포 구성을 나눌 수 있다.

0개의 댓글