Spring Boot Docker 배포

박윤택·2022년 12월 12일
0

Docker

목록 보기
2/2

Spring Boot Docker 배포

토이프로젝트를 진행하던 중 프론트엔드 개발자 분들에게 테스트 API를 제공해줘야 하는 일이 발생한다. 프론트엔드 개발자 분들은 JVM이 설치되어 있지 않기 때문에 Docker를 이용하여 환경을 제공해준다.
프로젝트 크기가 작을 경우에는 단순하게 Spring Boot 프로젝트를 빌드해서 빌드된 파일들을 Github으로 같이 관리를 하였지만 규모가 커질수록 용량에 제한이 있었다.
이는 잘못된 판단이었고 도커 파일을 이용하여 자체적으로 빌드를 한 다음 docker-compose 명령어를 이용하여 실행하는게 맞는 방법이라 생각이 들었다.


application.yml 작성

spring:
  profiles:
    active: test
  jpa:
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    hibernate:
      ddl-auto: create
    show-sql: true
    h2:
      console:
        enabled: true
        path: /h2

---
spring:
  profiles: dev
  datasource:
    url: jdbc:postgresql://localhost:5432/dev_db
    username: root
    password: root
    
---
spring:
  profiles: test
  datasource:
    url: jdbc:h2:mem:code-review;MODE=PostgreSQL

DB는 PostgreSQL을 사용하였다. 그리고 properties를 ---를 이용하여 분할한다음 active로 test properties를 바라보게끔 세팅하였다. 이때 중요한 것은 test profiles에 datasource에 바로 PostgreSQL을 바라보는게 아닌 H2로 바라보게 끔 세팅한다. 이는 이후에 docker-compose에서 ENV로 세팅해준다.


Dockerfile 작성

FROM openjdk:11 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:11

COPY --from=builder build/libs/*.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/app.jar"]

JAVA 11 버전을 기준으로 Dockerfile을 작성하였다. gradle 기반 프로젝트 이기 때문에 gradle과 빌드에 관련된 파일들을 컨테이너 내의 환경에 복사해두고 FROM 명령문을 이용하여 Docker 이미지를 중첩시켜서 빌드된 베이스 이미지를 기반으로 Spring Boot를 실행시킨다. 이때 port는 8081을 바라보게 한다. 이는 개발환경과 겹치지 않게 하기 위함이다.


docker-compose.yml 작성

version: "3"

services:
  postgresql:
    image: postgres
    restart: always
    container_name: postgres_test
    environment:
      POSTGRES_DB: test_db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "5433:5432"
    networks:
      - test_env
    expose:
      - 5433
  backend:
    container_name: backend
    build: .
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgresql:5432/test_db
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: postgres
    ports:
      - "8081:8080"
    depends_on:
      - postgresql
    networks:
      - test_env
    restart: unless-stopped

networks:
  test_env:
    driver: bridge

여기서 중요한 부분은 backend의 environment이다. docker-compose 내에 작성한 컨테이너 중 postgresql를 먼저 기억하자. application.yml에서 postgresql을 연결할 때 jdbc:postgresql://localhost:5432~이런 식으로 연결을 하지만 컨테이너끼리 연결을 하기 때문에 jdbc:postgresql://postgresql:5432~로 작성해야한다.
또한 이때 컨테이너의 외부 포트를 바라보게 하는게 아닌 내부 포트를 바라보게 해야한다.


0개의 댓글