Spring Boot Docker-compose 레시피

악식·2023년 8월 25일
0

Summary

Docker를 사용하면 쉽게 환경을 구축할 수 있습니다. 로컬 테스트 환경을 구축하기 위해 매번 새로운 환경을 PC에 설치하는 대신에, Docker를 이용해서 가상 컨테이너를 사용합니다. 이 글에서는 Spring Boot 웹 어플리케이션에서 사용하는 전형적인 구성을 Docker-compose를 통해서 구성하는 법에 대해서 다룹니다.

이 글에 사용된 설정을 이용하면 Spring Boot + PostgreSQL + Redis 환경을 구축할 수 있습니다.

Issue

Spring Boot로 만든 웹 어플리케이션을 공유하려고 합니다. 그런데, Spring Boot 는 무척 배포하기 쉬운 것이 특징인데도 다른 사람이 해당 프로젝트를 실행하는 것은 쉽지 않습니다.

대부분의 경우, 데이터베이스를 같이 구성해야 하기 때문입니다.

임베디드 H2 Database 를 같이 사용할 수 있습니다. 하지만 데이터베이스 환경이 완벽히 일치하는 것은 아니고, Database에 특화된 기능을 사용할 경우 호환성을 장담하기 어렵습니다.

Solution

Docker를 이용해서 환경을 구성합니다.

다음이 설치 되어있어야 합니다.

  • Docker
  • Docker-Compose

Docker의 설치에 대해서는 다루지 않습니다. 다음 문서를 참고하세요.

도커 공식 문서

  1. Dockerfile 을 작성합니다.

편의상, 프로젝트 루트에 작성합니다.

touch ./Dockerfile
vi Dockerfile
#Dockerfile
# 사용하고자 하는 도커 이미지를 적습니다. jdk17을 사용하기 위해 amazoncorretto:17을 사용합니다.
FROM amazoncorretto:17
WORKDIR /app
COPY . /app
RUN chmod +x ./gradlew
# gradlew의 권한 문제를 해결하기 위해 chmod를 진행합니다. 
RUN ./gradlew build -x test
# 테스트에 필요한 Database가 없으므로 테스트를 제외합니다. 
# 테스트를 포함하고 싶다면, Spring 프로필을 통해서 테스트 전용 환경을 추가합니다. 
CMD ["java", "-jar", "-Dspring.profiles.active=prod", "build/libs/app.jar"]
# 실행시킬 때 프로필을 명시할 수 있습니다. 
  1. docker-compose.yml 파일을 작성합니다.
touch ./docker-compose.yml
vi docker-compose.yml
# docker-compose의 버전을 명시합니다. 
version: '3'
services:
# 필요한 콘테이너를 원하는만큼 구성합니다. 
# 여기서는 Database를 위한 PostgreSQL과 캐시용 Redis를 구성하기로 합니다. 

# PostgreSQL
  db:
    image: "postgres:latest"
    restart: unless-stopped
    # 재시작 옵션입니다. 
    hostname: "db"
    # 호스트네임을 명시하지 않으면 콘테이너명과 동일한 값을 지닙니다. 
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: dontpostyourpasswordonyourblog
	  # 환경변수를 사용할 수 있습니다.
    ports:
      - "5432:5432"
      # 개방할 포트를 설정해줍니다. 
      
# Redis
  redis:
    image: "redis:latest"
    hostname: "redis"
    volumes:
      - ./redis/data:/data
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
      # 원한다면 파일을 컨테이너 외부와 연결할 수 있습니다. 
    restart: unless-stopped
    ports:
      - "6379:6379"
      
# Spring Boot
  app:
    build: .
    # 같은 경로에 있는 Dockerfile을 이용해 빌드합니다. 
    ports:
      - "8080:8080"
    depends_on:
      - db
      - redis
      # 다른 컨테이너에 의존 설정을 해두면, 위의 컨테이너가 실행된 이후에 실행됩니다. 
  1. 데이터베이스 연결 설정을 해줍니다.

다른 컨테이너의 IP 주소를 알지 않아도, docker-compose의 설정에 의해 호스트네임을 얻을 수 있습니다.

# datasource 
spring:
	datasource:
    	url: jdbc:postgresql://db:5432/postgres
        # docker-compose 에서 설정한 hostname을 사용할 수 있습니다. 
        # (미설정시 container name과 동일) 
        username: postegres
        password: dontpostyourpasswordonyourblog
        driver-cname-name: org.postgresql.Driver

# redis (docker container)

spring:
	data:
    	redis:
        	host: redis
			# 마찬가지로 hostname 을 사용합니다. 
            port: 6379
    
  1. docker-compose를 통해 컨테이너를 빌드하고 실행합니다.
docker-compose build # 빌드를 진행합니다.
docker-compose up # 컨테이너를 실행합니다. 
# CTRL+C로 종료할 수 있습니다. 
  1. 필요한다면 컨테이너를 내립니다.
docker-compose down # 컨테이너를 제거합니다. 
  1. 다시 빌드하고 새로 실행할 경우 --build 옵션을 사용할 수 있습니다. (코드 수정 등에 사용)
docker-compose up --build

# 아니면 그냥 직접 해도 됩니다.
docker-compose build && 
docker-compose down

Result

이제 복잡한 구성의 어플리케이션도 쉽게 공유할 수 있습니다. 클라우드 환경을 사용할 경우, 도커로 DB를 구성할 일은 없겠지만, 로컬 테스트 환경 구축에 편리하겠습니다.

다른 스택을 사용하는 개발자 등에게 개발 환경을 공유해야 할 일이 있다면 이 방법을 사용해보는 것도 좋겠습니다.

profile
Wandering wondering.

0개의 댓글