- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Kotlin
- 젠킨스
- 팀네이버 공채
- Project
- websocket
- redis
- LazyInitialization
- network
- spring
- jenkins
- 스프링
- 프로젝트
- Spring Security
- 팀네이버
- 만들면서 배우는 클린 아키텍처
- SPRING JWT
- 후기
- infra
- docker
- Java
- 책
- chrome80
- JWT
- EntityTransaction
- SpringBoot
- 캐싱전략
- 브랜치전략
- 리뷰
- container
- JPA
PPAK
[CI/CD] Docker 에서 SpringBoot 구동하기 본문
이전 포스트 에서 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 서버는 본인이 보낸 요청으로 받아들인다고 우선 판단하였다.
'infra' 카테고리의 다른 글
[Hazelcast] Distributed Computing (Predicate) (0) | 2023.09.28 |
---|---|
[Kafka] 메세지큐 서버 도입과 역할의 분리 (2) | 2023.01.10 |
[CI/CD] 프로젝트 무중단 배포 도입기 (2) | 2023.01.04 |
[CI/CD] Git Webhook 을 통한 Jenkins-Spring Boot 빌드, 배포 자동화 (0) | 2022.07.24 |
[CI/CD] Docker 에서 Jenkins 구동하기 (0) | 2022.07.16 |