DevOps/DOCKER

[Docker] Docker Compose로 SpringBoot와 H2 연동 및 실행하기

IT록흐 2023. 9. 18. 11:07
반응형
 

[Docker] 실습용 SpringBoot 프로젝트 만들기

1) JDK 11 설치 - JDK11 설치 ( https://www.oracle.com/kr/java/technologies/javase/jdk11-archive-downloads.html ) - 터미널에서 설치 확인 2) InteliJ 설치 - InteliJ 설치 페이지 ( https://www.jetbrains.com/idea/download/?section=windows#sect

lordofkangs.tistory.com

 

지난 포스팅에서 ORM을 JPA로 하여 H2 DB와 연동하는 간단한 SpringBoot App을 만들어 보았다. 그럼 SpringBoot App과 h2 DB를 Docker Compose를 활용하여 컨테이너에 띄어보자. 

 

 

 

 

 

 

Docker Image 만들기

 

컨테이너에 App을 띄우려면 도커 이미지가 필요하다. H2 이미지는 도커에서 제공하므로, 우리가 만든 SpringBoot App의 이미지를 만들어 보자. 

 

Dockerfile

##### Build Stage #####
# 종속성 추출
# 빌드 작업을 위한 JDK 베이스이미지
FROM openjdk:11-jdk-slim as build

# 워킹 디렉토리 설정
WORKDIR /workspace/app

# 빌드에 필요한 Gradle 소스 복사
COPY gradle gradle
COPY build.gradle settings.gradle gradlew ./
COPY src src

# 빌드 진행
RUN ./gradlew bootJar # 빌드 진행
RUN mkdir -p build/libs/dependency && (cd build/libs/dependency; jar -xf ../*.jar) # 종속성 추출

##### Run Stage #####

# 실행 작업을 위한 JRE 베이스이미지
FROM openjdk:11-jre-slim

# 호스트 서버에 전달이 필요한 데이터 저장공간
VOLUME /tmp

# Arugument에 종속성 경로를 추가
ARG DEPENDENCY=/workspace/app/build/libs/dependency

# Build Stage에서 추출된 종속성 카피하기
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app

# 실행하기
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.hellospring.HelloSpringApplication"]

 

 

Multi Stage 빌드로 구성하였다. 

Multi Stage에 대한 자세한 내용은 아래 포스팅을 참고하면 된다. 

 

 

[Docker] MultiStage란?

Dockerfile ##### Build Stage ##### # 종속성 추출 # 빌드 작업을 위한 JDK 베이스이미지 FROM openjdk:11-jdk-slim as build # 워킹 디렉토리 설정 WORKDIR /workspace/app # 빌드에 필요한 Gradle 소스 복사 COPY gradle gradle COPY

lordofkangs.tistory.com

 

 

Docker Compose 파일 만들기

 

docker-compose.yml

 

version: "3"
services:
  db: # db 서비스
    container_name: h2 # 컨테이너 이름
    image: oscarfonts/h2:latest # h2 이미지
    ports: # 포트포워딩
      - 1521:1521 # TCP 포트 : 데이터베이스 연결 포트
      - 8081:81 # HTTP 포트 : 웹콘솔 연결 포트
    environment: #h2 설정
      H2_OPTIONS: -ifNotExists # DB가 이미 존재하면 재생성 X
    volumes:
      - ./h2/:/opt/h2-data # host 서버와 연결되는 통로 ( 저장 및 백업 경로 )
    restart: always # 컨테이너 종료시 자동 재실행
  app: # app 서비스
    build:
      context: . # Dockerfile 위치
      dockerfile: Dockerfile # Docker 파일 이름
    container_name: spring-app # 컨테이너 이름
    ports: # 포트포워딩
      - 5000:8080 # HTTP 포트 연결
    environment: # spring app 설정
      SPRING_DATASOURCE_URL: jdbc:h2:tcp://h2:1521/demo # h2 db url
      SPRING_DATASOURCE_USERNAME: sa # h2 db id
      SPRING_DATASOURCE_PASSWORD: # h2 db password
      SPRING_JPA_HIBERNATE_DDL_AUTO: create # DDL 자동 생성
    depends_on: # app 서비스 시작 전 실행되어야 하는 서비스
      - db

 

도커 컴포즈 파일을 만들지 않고 단순히 docker run 으로 컨테이너를 실행하면 명령어가 길어지고 복잡해진다. 그러므로  두 개 이상의 컨테이너를 실행해야 하고 볼륨도 맞추어야 하고 포트포워딩 등이 필요한 경우 도커 컴포즈 파일을 만들어 실행하면 된다. 

 

* 도커 컴포즈 실행 명령어 : docker-compose up 

 

- docker-compose up 실행화면

- 도커 컨테이너 실행화면

 

 

- 홈화면 ( url : localhost:5000 )

- 저장화면

 

- 조회화면

 

- 저장 및 조회 시 SQL이 실행된 화면 ( JPA )

 

 

 

 


 

 

참고자료

 

Docker image 크기 줄여보기

 

velog.io

 

docker-compose를 이용하여 spring boot + h2 연결하기(feat.redis)

Dockerfile 먼저 어플리케이션 관련 설정을 만든다. docker-compose.yml 결과적으로 이렇게 되고, 하나하나 보도록 해보자. h2 먼저 이 설정은 내가 올린 이전 글의 옵션들을 docker-compose로 가져온 것이다.

velog.io

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

 

따라하며 배우는 도커와 CI환경 - 인프런 | 강의

이 강의를 통해 도커에 대해서 배울 수 있으며, CI 환경을 구성할 수 있습니다., [사진] 실무에 꼭 필요한 도커 + CI 환경 구축을 한번에! [사진] 안녕하세요.이번 강의에서는 도커와 CI환경을 구축

www.inflearn.com

 

반응형