docker

1. 간단 spring boot app, Docker로 render배포하기

수학소년 2023. 2. 17. 16:14

1. 일단 배포할 spring boot app 소스 완성하기

Run as > Maven build...

Base directory에 [Workspace...] 버튼 눌러서 프로젝트 선택

Goals 에 "clean install" 입력하고 [Run] 버튼

/target위치에 "프로젝트명-0.0.1-SNAPSHOT.jar" 파일이 생김

cmd창 가서 아래 명령어 실행

java -jar ./프로젝트명-0.0.1-SNAPSHOT.jar

서버 잘 실행되면 배포할 준비 완성

 

2. Dockerfile 만들기

FROM openjdk:17-alpine
VOLUME /tmp
EXPOSE 8080
ARG JAR FILE
COPY target/프로젝트명-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
FROM openjdk:17-alpine AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootJAR

FROM openjdk:17-alpine
EXPOSE 8080
COPY --from=builder build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

프로젝트 root directory에 "Dockerfile" 이라는 확장자 없는 파일을 만들고 위 소스를 입력.

FROM을 2개 쓴 이유는 프로젝트 build를 먼저 하고 생긴 .jar파일로 app실행을 해야 해서 2개로 나눔.

이렇게 2개를 쓰려면 한쪽에 "AS builder"처럼 alias를 주고, 다른쪽에 "--from=builder"라고 참조하도록 하면 됌.

builder에서 build를 위한 필수파일들을 복사하고 빌드 후, 그 jar파일로 서버 실행.

3. 로컬에서 잘 되는지 실행해보자

app소스가 잘 작동하는지 확인하느라 build를 했다면 clean을 해줘서 로컬에서 build 안한 척을 해줌.

왜냐면 github에 올릴땐 build폴더를 올리지 않을꺼라서.(배포 상황에서 잘 돌아가는걸 확인해야 하니까)

 

terminal에서 다음 소스로 실행

$ docker build -t [image명] .

build 잘 되면 아래처럼 나올꺼임

$ docker build -t docker-single .                                        
[+] Building 2.3s (15/15) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                               0.0s 
 => => transferring dockerfile: 373B                                                                                                                                                                                               0.0s 
 => [internal] load .dockerignore                                                                                                                                                                                                  0.0s 
 => => transferring context: 2B                                                                                                                                                                                                    0.0s 
 => [internal] load metadata for docker.io/library/openjdk:17-alpine                                                                                                                                                               1.9s 
 => [auth] library/openjdk:pull token for registry-1.docker.io                                                                                                                                                                     0.0s 
 => CACHED [builder 1/8] FROM docker.io/library/openjdk:17-alpine@sha256:4b6abae565492dbe9e7a894137c966a7485154238902f2f25e9dbd9784383d81                                                                                          0.0s 
 => [internal] load build context                                                                                                                                                                                                  0.0s 
 => => transferring context: 1.18kB                                                                                                                                                                                                0.0s 
 => CACHED [builder 2/8] COPY gradlew .                                                                                                                                                                                            0.0s 
 => CACHED [builder 3/8] COPY gradle gradle                                                                                                                                                                                        0.0s 
 => CACHED [builder 4/8] COPY build.gradle .                                                                                                                                                                                       0.0s 
 => CACHED [builder 5/8] COPY settings.gradle .                                                                                                                                                                                    0.0s 
 => CACHED [builder 6/8] COPY src src                                                                                                                                                                                              0.0s 
 => CACHED [builder 7/8] RUN chmod +x ./gradlew                                                                                                                                                                                    0.0s 
 => CACHED [builder 8/8] RUN ./gradlew bootJAR                                                                                                                                                                                     0.0s 
 => [stage-1 2/2] COPY --from=builder build/libs/*.jar app.jar                                                                                                                                                                     0.1s 
 => exporting to image                                                                                                                                                                                                             0.1s 
 => => exporting layers                                                                                                                                                                                                            0.1s 
 => => writing image sha256:b6cf9eb34244072f05da4b6966c7416eefe9dcec6c4aad1d1b48a7c97ec2145b                                                                                                                                       0.0s 
 => => naming to docker.io/library/docker-single                                                                                                                                                                                   0.0s 

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

 

방금 만든 image를 container로 실행

$ docker run --rm -p8080:8080 [image명]

 

그럼 IDE에서 보던 spring boot 로그가 쭉 올라갈꺼임.

브라우저에서 테스트 해보면 됌.

4. render에 배포

Web Service를 추가하고, github repository, branch를 선택하고 Runtime을 Docker로 선택.

Instance Type은 free

5. 확인

아래 url접속해서 확인.