PPAK

[CI/CD] Docker 에서 SpringBoot 구동하기 본문

infra

[CI/CD] Docker 에서 SpringBoot 구동하기

PPakSang 2022. 7. 24. 13:39

이전 포스트 에서 Jenkins 에서 SpringBoot 이미지를 생성하고, 컨테이너를 생성하는 과정을 생략했다.

 

이번 포스트에서는 직접 Dockerfile 을 작성하고, 이미지 빌드를 하는 과정을 살펴보겠다.

 

Dockerfile

#SpringBoot 구동에 필요한 jdk11 
FROM openjdk:11 

#변수 생성(상대 경로로 작성)
ARG JAR_FILE=build/libs/*.jar

#(추가할 파일 : 이름) -> Docker 컨테이너 내부에 생성된다. 
COPY ${JAR_FILE} app.jar 

#(image 의 container 에서 필요한 저장소 경로)
VOLUME /tmp

#(도커 컨테이너 내부에서 몇번 포트로 돌 것인가)
EXPOSE 8081

#(실행할 명령어, 컨테이너 내부에 생성될 경로로 생각)
ENTRYPOINT ["java","-jar","/app.jar"]

Project 루트에 포함될 SpringBoot Image 용 Dockerfile 이다.

 

Jenkins 가 프로젝트를 최초로 당겨왔을 때 루트에 있는 Dockerfile 을 통하여 빌드를 진행한다는 것을 알 수 있다.

 

프로젝트 내부에서 기본 개발환경을 jdk 11 버전으로 셋팅하였기 때문에 jdk11 이미지를 불러왔기 때문에 본인의 개발환경에 맞춰서 이미지를 변경하면 된다.

 

Issue

H2 Database 를 같은 VM 위에서 띄운 후에 외부에서 H2 console 에 접근하려고할 때 계속 connection refuesed 에러(90067-200)가 났다.

 

원인을 살펴보니 H2 는 기본적으로 요청 host ip 가 실행환경과 다를 경우에 접속을 허용하지 않는다고 한다.

http://www.h2database.com/html/tutorial.html

tcpAllowOthers 과 webAllowOthers 옵션을 추가할 시 외부에서 접속이 가능하다고 한다.

 

 

https://github.com/oscarfonts/docker-h2/blob/master/2.1.210/Dockerfile

# openjdk:11 image built on Debian GNU/Linux 11 (bullseye)
FROM openjdk:11

# A merge of:
#  https://github.com/zhilvis/docker-h2
#  https://github.com/zilvinasu/h2-dockerfile

LABEL maintainer="oscar.fonts@geomatico.es"

ENV DOWNLOAD https://github.com/h2database/h2database/releases/download/version-2.1.210/h2-2022-01-17.zip
ENV DATA_DIR /opt/h2-data

RUN mkdir -p ${DATA_DIR}
RUN curl -L ${DOWNLOAD} -o h2.zip
RUN unzip h2.zip -d /opt/
RUN rm h2.zip

COPY h2.server.properties /root/.h2.server.properties

EXPOSE 81 1521

WORKDIR /opt/h2-data

CMD java -cp /opt/h2/bin/h2*.jar org.h2.tools.Server \
    -web -webAllowOthers -webPort 81 \
    -tcp -tcpAllowOthers -tcpPort 1521 \
    -baseDir ${DATA_DIR} ${H2_OPTIONS}

 

H2 공식 Dockerfile 에서는 위와 같이 제시한다.

 

아래는 H2 서버와 SpringBoot 서버가 호스트에서 어떻게 동작하는지 간략하게 표현하였다.

 

실제로 H2 를 구동시 또 자체적인 내부 IP 를 할당받아 호스트 머신과 포트포워딩 관계를 이루는 것을 확인하였고, 그래서 SpringBoot 보다 한 뎁스 더 낮게 표현했다.

 

그렇다면 호스트 머신 에서 localhost:1521 은 어떻게 연결이 가능한 것일까?

위에서 언급했듯 H2 는 외부 연결을 허용하지 않고 요청 host ip 가 실행환경의 ip 와 동일할 경우에만 접속을 허용한다고 하였다.

 

비록 호스트 머신에서 접속을 요청하긴 했지만 요청 주소가 루프백 주소를 통해 포트포워딩 되기 때문에 H2 서버는 본인이 보낸 요청으로 받아들인다고 우선 판단하였다.

 

Comments