⭐ Docker를 이용해 프로젝트를 배포하고 실행하기 위한 단계별 절차이다.
우선 띄어줄 프로젝트가 있어야 한다.
학원 다니면서 했었던 씨앗 쇼핑몰을 사용할 것이다.
JAR 파일을 빌드 해줘야 하는데 내가 사용하는 IDE가 이클립스이기 때문에 이클립스만 얘기하겠습니다......
👇 보이지 않을 경우
Window - Shwo View - Other... - Gradle Tasks를 누르면 된다.


Gradle Tasks를 열어서 보이는 jar를 더블 클릭 해주면
프로젝트 폴더 안에 build 폴더가 생성 된다


build/libs 경로를 따라가다 보면 안에 jar 파일이 생성 된 것을 볼 수 있다.

아래 나와있는 Seed-0.0.1-SANPSHOT-plain.jar 과 같은 이름의 jar 파일은 보통 모든 의존성을 포함하지 않는 플레인 JAR 파일이다.
사용하려면 plain이 없는 Seed-0.0.1-SNAPSHOT.jar 파일을 사용해야 한다.
프로젝트 안에 src, build.gradle과 같은 위치에 DockerFile을 생성해준다.
파일 이름을 Dockerfile이라고 하면 이클립스에서 dockerfile이라고 인식한다.👍👍
# 베이스 이미지 설정 (OpenJDK 17 사용)
FROM openjdk:17-jdk-alpine
# JAR 파일을 컨테이너로 복사
COPY build/libs/Seed-0.0.1-SNAPSHOT.jar /app.jar
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app.jar"]
COPY: Dockerfile 명령어로, 호스트 시스템의 파일을 Docker 이미지의 파일 시스템에 복사합니다.
cmd 창을 켜서 dockerfile이 있는 위치로 이동을 한다.
그 후에
docker build -t seed-image

빌드한 이미지를 보고 싶으면 images 명령어를 실행한다.
docker images

이미지를 빌드하고 바로 run 명령어로 컨테이너를 생성 후 실행한다.
docker run -d -p 8080:8080 --name seed-container seed-image
그 후에 docker ps 명령어를 써서 현재 실행중인 컨테이너 목록을 표시한다.
docker ps

STATUS를 보면 컨테이너가 실행 된 후 2초가 흘렀다.

서버가 정상적으로 작동한다.
👏👏👏👏👏👏
컨테이너를 생성 한 후 실행하는데 STATUS를 보면 컨테이너가 바로 Exited 되어 있다.

seed-container에 대한 로그를 찍어 봤다.
로그 찍는 명령어
docker logs seed-container

이런 문구가 나타났다...
검색해보니 jar 파일을 실행하려 할 때 발생하는 오류로 jar 파일에 main-class가 정의되어 있지 않다는 것을 의미한다고 한다..
처음에는 bootJar를 통해서 mainClassName을 넣어 줬는데
bootJar {
mainClassName = 'seed.project.SeedApplication'
}
빌드가 안됐다..
Gradle 에서 'mainClassName' 설정은 Spring Boot 2.x 버전에서 사용 됐고, Spring Boot 3.x 버전에서는 'bootJar' 작업에 대해 다른 접근 방식을 사용한다고 한다.
'bootJar' 대신 'springBoot'확장을 사용하여 'mainClass'를 설정해야 한다.
build.gradle 파일에서 springBoot 플러그인 설정을 통해 메인 클래스를 지정할 수 있다고 한다.
mainClass에 실제 메인 클래스 경로를 입력해줬다.
// Spring Boot에서 JAR 파일을 빌드할 때 Main-Class 설정
springBoot {
mainClass = 'seed.project.SeedApplication' // 실제 메인 클래스 경로
}
no main manifest attribute, in /app.jar 라는 오류가 뜰 때마다
컨테이너, 이미지를 다 삭제하고 다시 이미지를 빌드해야한다
마지막은 내가 이겼다. 😀👍✌💪
이겼다니 참 다행입니다. 앞으로도 승승장구하시길....